关于数据库:MySQL-移动数据目录后启动失败

41次阅读

共计 4104 个字符,预计需要花费 11 分钟才能阅读完成。

  • 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

技术交换群:

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

正文完
 0