MySQL 移动数据目录后启动失败

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者: 王权富贵
  • 文章来源:GreatSQL社区投稿

背景概述

由于安装数据库时将MySQL的数据目录放在了根目录下,现在存储空间不足,想通过mv将数据目录移动到其他目录下,但将数据目录移动到其他数据目录后,启动数据库失败。

问题复现

本次测试基于 MySQL 8.0.31

1.关闭数据库

mysql> shutdown;
Query OK, 0 rows affected (0.02 sec)

2.查看当前数据目录所在位置

shell> pwd
/mysql80

3.通过mv移动整个MySQL数据目录到其他目录

shell>  mv /mysql80 /data
shell>  cd /data/mysql80/svr
shell>  ln -s mysql-8.0.31-linux-glibc2.12-x86_64 mysql

4.修改属主属组

shell> chown -R mysql.mysql /data

5.修改配置文件中数据目录的地址

shell> sed -i 's#/mysql80#/data/mysql80#g' my5001.cnf

6.启动数据库

shell> /data/mysql80/svr/mysql/bin/mysqld_safe \
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &

此时启动数据库失败,错误日志报错如下:

mysqld: File '/mysql80/dbdata/data5001/log/binlog.000012' not found (OS errno 2 - No such file or directory)
2023-02-27T10:38:09.240576+08:00 0 [ERROR] [MY-010958] [Server] Could not open log file.
2023-02-27T10:38:09.240657+08:00 0 [ERROR] [MY-010041] [Server] Can't init tc log
2023-02-27T10:38:09.240718+08:00 0 [ERROR] [MY-010119] [Server] Aborting
2023-02-27T10:38:10.548605+08:00 0 [System] [MY-010910] [Server] /data/mysql80/svr/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.31)  MySQL Community Server - GPL.

这里报错显示找不到binlog文件,并且报错显示的binlog的目录还是之前的,但是配置文件中的目录已经修改

shell> grep 'log-bin' my5001.cnf 
log-bin=/data/mysql80/dbdata/data5001/log/binlog
log-bin-trust-function-creators

7.问题解决

最后通过查找发现 binlog.index 文件中存放着每个binlog文件的绝对路径地址,这里的路径还是之前路径,内容如下:

shell> cat binlog.index 
/mysql80/dbdata/data5001/log/binlog.000001
/mysql80/dbdata/data5001/log/binlog.000002
/mysql80/dbdata/data5001/log/binlog.000003
/mysql80/dbdata/data5001/log/binlog.000004
/mysql80/dbdata/data5001/log/binlog.000005
/mysql80/dbdata/data5001/log/binlog.000006
/mysql80/dbdata/data5001/log/binlog.000007
/mysql80/dbdata/data5001/log/binlog.000008
/mysql80/dbdata/data5001/log/binlog.000009
/mysql80/dbdata/data5001/log/binlog.000010
/mysql80/dbdata/data5001/log/binlog.000011
/mysql80/dbdata/data5001/log/binlog.000012

修改binlog.index文件中binlog的绝对路径:

shell> sed -i 's#/mysql80#/data/mysql80#g' binlog.index
shell> cat binlog.index 
/data/mysql80/dbdata/data5001/log/binlog.000001
/data/mysql80/dbdata/data5001/log/binlog.000002
/data/mysql80/dbdata/data5001/log/binlog.000003
/data/mysql80/dbdata/data5001/log/binlog.000004
/data/mysql80/dbdata/data5001/log/binlog.000005
/data/mysql80/dbdata/data5001/log/binlog.000006
/data/mysql80/dbdata/data5001/log/binlog.000007
/data/mysql80/dbdata/data5001/log/binlog.000008
/data/mysql80/dbdata/data5001/log/binlog.000009
/data/mysql80/dbdata/data5001/log/binlog.000010
/data/mysql80/dbdata/data5001/log/binlog.000011
/data/mysql80/dbdata/data5001/log/binlog.000012

8.启动数据库

shell> /data/mysql80/svr/mysql/bin/mysqld_safe 
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &

数据库启动成功。

9.作为从节点

需要注意的是,如果该实例还作为其他实例的从节点,还需要设置 relaylog.index 文件中relay log的绝对路径,否则会报如下错误: 错误日志报错:

2023-02-27T15:56:55.224372+08:00 0 [ERROR] [MY-010599] [Repl] log /mysql80/dbdata/data5002/log/relaylog.000002 listed in the index, but failed to stat.
2023-02-27T15:56:55.224422+08:00 0 [ERROR] [MY-011059] [Repl] Error counting relay log space.
2023-02-27T15:56:55.226571+08:00 0 [ERROR] [MY-010426] [Repl] Slave: Failed to initialize the master info structure for channel ''; its record may still be present in 'mysql.slave_master_info' table, consider deleting it.
2023-02-27T15:56:55.226622+08:00 0 [ERROR] [MY-010529] [Repl] Failed to create or recover replication info repositories.

执行 start replica 时也会报错:

# 客户端报错
mysql> start replica;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

# error log报错
2023-02-27T15:57:53.858798+08:00 8 [ERROR] [MY-013124] [Repl] Slave SQL for channel '': Slave failed to initialize relay log info structure from the repository, Error_code: MY-013124

10.问题解决

修改 relaylog.index 文件中relay log的绝对路径

sed -i 's#/mysql80#/data/mysql80#g' relaylog.index

重新启动数据库,并启动主从复制

# 重启实例
mysql> restart;

# 启动主从复制
mysql> start replica;

此时主从复制恢复正常。

总结

  1. 搭建数据库前应提前规划并确定存储位置及磁盘大小,以及之后数据量增长情况,避免磁盘空间不足时导致数据库不能正常使用。
  2. 当我们手动进行数据目录的移动时,不仅需要修改配置文件中数据目录的路径,还需要修改 binlog.index relaylog.index 文件中binlogrelaylog的绝地路径,否则启动时可能出报错,并且不能正常建立主从关系。

Enjoy GreatSQL ?

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

image-20221030163217640

原文链接:https://www.cnblogs.com/greatsql/p/17345624.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 移动数据目录后启动失败 - Python技术站

(0)
上一篇 2023年4月23日
下一篇 2023年4月24日

相关文章

  • MySQL安装starting the server失败的2种解决办法(推荐!)

    MySQL是一款常用的关系型数据库,但在安装时可能会遇到“starting the server”失败的问题。本文将介绍两种解决这个问题的方法。 方法一:更改MySQL数据文件夹的权限 如果MySQL安装完成后,启动MySQL服务时提示“Starting MySQL 已停止工作”,则有可能是由于MySQL数据文件夹的权限不正确造成的。 步骤1:确认MySQL…

    MySQL 2023年5月18日
    00
  • MySQL创建索引(CREATE INDEX)方法详解

    MySQL创建索引可以提高查询效率并减少查询的时间和资源消耗。以下是MySQL创建索引的方法和实例说明。 语法: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 ON 表名(列名1,列名2,….); 其中,UNIQUE表示唯一性索引,FULLTEXT表示全文索引,SPATIAL表示空间索引。 示例: (1)创建普通索…

    MySQL 2023年3月10日
    00
  • mysql主从数据库不同步的2种解决方法

    下面是详细讲解“mysql主从数据库不同步的2种解决方法”的完整攻略: 标题 mysql主从数据库不同步的2种解决方法 前言 MySQL主从复制是常用的数据库复制方式之一,在应用场景中起到了很重要的作用,其实现和维护也是相对简单的。但是,在实际的使用中,我们还是经常会遇到由于网络或其他因素导致主从数据库不同步的情况。本文将介绍针对此类问题的两种解决方法,以帮…

    MySQL 2023年5月18日
    00
  • MySQL数据库innodb启动失败无法重启的解决方法

    当MySQL数据库启用InnoDB存储引擎时,可能会出现InnoDB引擎启动失败,无法重启的情况。以下是解决方法的完整攻略: 步骤一:查看错误日志 启动MySQL时,系统会记录错误日志。我们应该首先查看这些错误日志以检查问题的源头。 可以在MySQL配置文件中指定错误日志的位置,例如在my.cnf或my.ini文件中添加以下行: log-error=/var…

    MySQL 2023年5月18日
    00
  • 浅谈MySQL之select优化方案

    让我为您详细讲解“浅谈MySQL之select优化方案”的完整攻略。 浅谈 MySQL 之 Select 优化方案 背景 在 MySQL 数据库中,SELECT 操作是使用最频繁的操作之一。但是,长时间的高并发查询操作会导致数据库的性能问题,严重影响业务的正常运行。所以,我们需要对 SELECT 操作的优化方案进行深入研究。 select 的优化方案 在 M…

    MySQL 2023年5月19日
    00
  • 了解MySQL查询语句执行过程(5大组件)

    MySQL是一款流行的关系型数据库管理系统,它可以支持各种数据的管理,包括数据的增删改查。我们今天要讲解的是MySQL查询语句的执行过程,包括MySQL查询执行的5大组件。 MySQL查询执行的5大组件 连接器 连接器负责连接MySQL服务器和客户端。当客户端请求连接服务器时,连接器会进行认证和权限验证,如果通过验证,就会打开一个线程,并分配该线程一个连接标…

    MySQL 2023年5月19日
    00
  • MySQL创建存储过程(CREATE PROCEDURE)

    MySQL创建存储过程的方法: 在MySQL中创建存储过程需要使用CREATE PROCEDURE语句,并指定存储过程的名称; 设置存储过程的参数、返回值、执行体等信息; 使用END语句来结束存储过程。 MySQL创建存储过程的示例: 如下片段是创建一个简单的 MySQL 存储过程的示例: DELIMITER // CREATE PROCEDURE get_…

    MySQL 2023年3月10日
    00
  • 一文详解MySQL Join使用原理

    一文详解MySQL Join使用原理 MySQL Join 是 SQL 语言中相对复杂的一个命令,用于将不同表中的数据合并在一起。通过 Join 命令,可以将多个表中有关联的数据进行联合查询,从而更加快速、方便地获得我们所需的数据。本文将详细介绍 MySQL Join 的使用原理以及常见类型、操作方法。 Join 的基本概念 Join 是 MySQL 数据库…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部