重建MySQL8基于GTID建立的主从复制
0. 背景
三台MySQL服务器,一主两从,Ubuntu操作系统。由于没有设置binlog的过期时间,导致/var/lib/mysql挂载的磁盘被撑爆。幸好主库还有点磁盘空间,主库MySQL服务还正常。两个从库已经无法通过MySQL命令进入MySQL服务,查看systemctl status mysql已经显示MySQL不正常,执行systemctl start mysql已经无法启动MySQL服务
1. 先备份主库数据
肯定第一时间备份主库数据
- 停掉所有连接MySQL的进程,保证MySQL没有数据写入。如果做不到,就登录MySQL,执行
FLUSH TABLES WITH READ LOCK;锁定主库,停止数据写入。然后执行SHOW MASTER STATUS;查看主库状态,记录File和Position的值。注意:这个MySQL窗口不能关闭,也不同通过exit退出这个MySQL窗口,否则就无法持续锁定主库了 - 执行
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. 重建主从复制关系
-
登录从库MySQL,执行
STOP SLAVE;RESET SLAVE;RESET MASTER;彻底清空主从复制关系 -
将之前主库上通过
mysqldump命令备份的SQL文件拷贝到从库,然后到从库上执行mysql < /xxx/xxx.sql重建从库 -
登录从库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的过期时间
- 修改
/etc/mysql/my.cnf,再[mysqld]下增加binlog_expire_logs_seconds=604800设置MySQL的binlog有效期为7天,然后执行systemctl restart mysql重启MySQL服务。 - 登录MySQL,执行
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';确认修改结果。 - 到
/var/lib/mysql下查看binlog文件,可以看到7天之前的binlog已经自动被干掉了
6. 后记
重建主从复制关系的时候,应该有不锁定主库的重建方法。比如mysqldump的时候保留GTID相关数据,然后导入从库,然后从库执行CHANGE REPLICATION SOURCE TO的时候SOURCE_AUTO_POSITION设置为1,并且不指定SOURCE_LOG_FILE和SOURCE_LOG_POS。不确定能不能成,先挖坑,后续填。
7. 填坑
- 主库
mysqldump --all-databases --single-transaction > /xxx/xxx.sql - 从库
mysql -e "stop slave;" - 从库
mysql -e "reset slave all;" - 从库
mysql -e "reset master;" - 从库
mysql < /xxx/xxx.sql; - 从库
mysql -e "change replicaton source to source_host='主库IP', source_user='主库用户名', source_password='主库密码', source_auto_position=1" - 从库
mysql -e "start slave;" - 从库
mysql -e "show slave status \G"
浙公网安备 33010602011771号