MySQL移动数据目录后启动失败怎么解决

背景概述

由于安装数据库时将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 &

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

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 log2023-02-27T10:38:09.240718+08:00 0 [ERROR] [MY-010119] [Server] Aborting2023-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;

此时主从复制恢复正常。



在MySQL数据库的使用过程中,有时候为了优化系统空间,需要将数据目录进行移动。然而,移动完后启动MySQL却会出现启动失败的情况,这里为大家介绍解决方法。
解决方法一:更改mysql数据目录路径
1、通过登录MySQL,查看mysql数据目录路径
通过命令mysql -uroot -p,输入口令,登录到MySQL数据库。
mysql>show VARIABLES like '%datadir%';
2、关闭MySQL
service mysqld stop
3、复制数据目录及权限设置
#cp -rap /var/lib/mysql /mnt/mysql
#chmod -R 777 /var/lib/mysql
4、更改配置文件my.cnf
vim /etc/my.cnf
datadir=/mnt/mysql
5、再次启动MySQL即可
service mysqld start
解决方法二:更改MySQL的SELinux安全策略
1、查看MySQL的SELinux安全策略设置
getsebool -a | grep mysql
2、如果出现“mysql_connect_any:off”,表示MySQL的SELinux安全策略为关闭状态,需要进行以下操作
开启mysql_connect_any的安全策略
setsebool -P mysql_connect_any on
3、重启MySQL即可开始使用
service mysqld restart
解决方法三:更改MySQL的网络连接IP地址
1、进入到mysql的配置文件my.cnf
cd /etc/mysql/
vim my.cnf
2、查找折行bind-address,将其前面的“#”去掉,然后更改绑定的ip地址
#bind-address = 127.0.0.1
bind-address = 192.168.1.100
3、保存退出后重启MySQL即可
service mysqld restart
总结:以上就是MySQL移动数据目录后启动失败的解决方法,需要注意的是,如果在移动数据目录前备份重要数据,如果出现异常失败,可以重新将数据目录放回原处,然后恢复备份即可。希望以上方法可以对你进行参考和帮助。