问题复现本次测试基于 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 /datashell> cd /data/mysql80/svrshell> 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/binloglog-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.indexshell> 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;
此时主从复制恢复正常。
以上就是mysql移动数据目录后启动失败怎么解决的详细内容。
