重建MySQL8基于GTID建立的主从复制

0. 背景

三台MySQL服务器,一主两从,Ubuntu操作系统。由于没有设置binlog的过期时间,导致/var/lib/mysql挂载的磁盘被撑爆。幸好主库还有点磁盘空间,主库MySQL服务还正常。两个从库已经无法通过MySQL命令进入MySQL服务,查看systemctl status mysql已经显示MySQL不正常,执行systemctl start mysql已经无法启动MySQL服务

1. 先备份主库数据

肯定第一时间备份主库数据

  1. 停掉所有连接MySQL的进程,保证MySQL没有数据写入。如果做不到,就登录MySQL,执行FLUSH TABLES WITH READ LOCK;锁定主库,停止数据写入。然后执行SHOW MASTER STATUS;查看主库状态,记录FilePosition的值。注意:这个MySQL窗口不能关闭,也不同通过exit退出这个MySQL窗口,否则就无法持续锁定主库了
  2. 执行mysqldump --all-databases --set-gtid-purged=OFF > /xxx/xxx.sql备份主库,有备份心里就不慌。

2. 解决从库MySQL起不来的问题

如果能给/var/lib/mysql进行扩容那最好了。如果没办法给/var/lib/mysql进行扩容,可按日期删除最旧的binlog或relaylog,腾出部分空间后尝试systemctl start mysql启动MySQL

3. 重建主从复制关系

  1. 登录从库MySQL,执行STOP SLAVE;RESET SLAVE;RESET MASTER;彻底清空主从复制关系

  2. 将之前主库上通过mysqldump命令备份的SQL文件拷贝到从库,然后到从库上执行mysql < /xxx/xxx.sql重建从库

  3. 登录从库MySQL,执行CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP', SOURCE_USER='主库用户名', SOURCE_PASSWORD='主库密码', SOURCE_AUTO_POSITION=0, SOURCE_LOG_FILE='之前记录的主库File', SOURCE_LOG_POS=之前记录的主库Position;。然后执行START SLAVE;重启主从复制。执行SHOW SLAVE STATUS;查看主从复制状态是否正常

4. 解锁主库

退出之前执行了 FLUSH TABLES WITH READ LOCK;的MySQL窗口,解锁主库。

5. 调整binlog的过期时间

  1. 修改/etc/mysql/my.cnf,再[mysqld]下增加binlog_expire_logs_seconds=604800设置MySQL的binlog有效期为7天,然后执行systemctl restart mysql重启MySQL服务。
  2. 登录MySQL,执行SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';确认修改结果。
  3. /var/lib/mysql下查看binlog文件,可以看到7天之前的binlog已经自动被干掉了

6. 后记

重建主从复制关系的时候,应该有不锁定主库的重建方法。比如mysqldump的时候保留GTID相关数据,然后导入从库,然后从库执行CHANGE REPLICATION SOURCE TO的时候SOURCE_AUTO_POSITION设置为1,并且不指定SOURCE_LOG_FILESOURCE_LOG_POS。不确定能不能成,先挖坑,后续填。

7. 填坑

  1. 主库mysqldump --all-databases --single-transaction > /xxx/xxx.sql
  2. 从库mysql -e "stop slave;"
  3. 从库mysql -e "reset slave all;"
  4. 从库mysql -e "reset master;"
  5. 从库mysql < /xxx/xxx.sql;
  6. 从库mysql -e "change replicaton source to source_host='主库IP', source_user='主库用户名', source_password='主库密码', source_auto_position=1"
  7. 从库mysql -e "start slave;"
  8. 从库mysql -e "show slave status \G"
posted @ 2025-11-27 11:35  柚子苹果果  阅读(19)  评论(0)    收藏  举报