MySQL 移动数据目录后启动失败问题解决

作者:GreatSQL 时间:2024-01-23 02:45:42 

  • 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;

此时主从复制恢复正常。

来源:https://www.cnblogs.com/greatsql/archive/2023/04/23/17345624.html

标签:mysql,移动数据目录,启动失败
0
投稿

猜你喜欢

  • Python数据分析库pandas基本操作方法

    2022-07-17 23:15:18
  • 使用Python+Flask开发博客项目并实现内网穿透

    2021-11-03 14:23:37
  • Python 'takes exactly 1 argument (2 given)' Python error

    2022-04-19 00:26:05
  • Pycharm学习教程(2) 代码风格

    2022-03-21 08:38:31
  • pandas中的ExcelWriter和ExcelFile的实现方法

    2023-09-20 00:10:36
  • Oracle函数使索引列失效的解决办法

    2024-01-15 16:52:08
  • postman和python mock测试过程图解

    2022-02-19 00:59:57
  • Python中的优先队列(priority queue)和堆(heap)

    2023-11-22 05:40:03
  • 用css3-tranistions实现平滑过渡

    2009-12-23 19:24:00
  • 浅谈Python中的全局锁(GIL)问题

    2021-10-11 04:16:15
  • 深入浅析python 协程与go协程的区别

    2022-02-16 23:57:26
  • 用 SA FileUp 上传多文件

    2008-07-04 13:44:00
  • Python range与enumerate函数区别解析

    2022-03-05 21:40:20
  • Ubuntu手动安装mysql5.7.10

    2024-01-16 11:53:56
  • 在Python中操作文件之read()方法的使用教程

    2021-10-28 19:23:46
  • golang类型转换组件Cast的使用详解

    2024-05-08 10:22:01
  • 讨论闭包传入参数:window & undefined

    2010-05-19 12:55:00
  • Python中is和==的区别详解

    2022-08-22 10:53:09
  • Python教程教你如何去除背景

    2023-01-08 17:19:40
  • MySQL5.7中的sql_mode默认值带来的坑及解决方法

    2024-01-25 08:34:29
  • asp之家 网络编程 m.aspxhome.com