【MySQL】关于恢复MySQL主主数据的同步问题

一、实验背景和环境

MySQL + keepalived主主(互为主从)架构


【MySQL】关于恢复MySQL主主数据的同步问题_第1张图片

操作系统:CentOS7.5 Minimal

mysql01  192.168.1.104    数据库目录/opt/data/mysql

mysql02  192.168.1.105    数据库目录/opt/data/mysql

vip          192.168.1.110

现在mysql02去同步mysql01失败,  数据相差几十上百G,vip一旦漂移到mysql02上,会导致整个业务不可用。

怎样可以快速恢复两个数据库的数据同步,使得vip漂移到任何一台数据库,业务都正常运行?


二、实验预期

现在需要实现:

1.在mysql01 mysql02数据库上执行 show slave status\G

Slave_ IO_ Running: Ye

Slave_ SQL_ Running: Yes

2.数据文件大小同步

三、实验操作

从实验背景可知,mysql01和mysql02两个数据刚安装完成时,互为主从,数据同步正常,运行过程中某些原因导致mysql02去同步mysql01故障,而对外提供服务的vip一直在mysql上,数据一直写入在mysql01上,最终导致发现时,mysql02数据跟mysql01上的数据相差巨大,需要手工同步,同时也警示我们要重视数据同步监控报警的重要性!

从上可知,对mysql02而言,其数据已经没有意义了,可以直接删除,现在需要的直接将mysql01的数据拷贝给mysql02,实现主从同步。

大方向没有问题,关键在于细节处理,mysql01 mysql02 都开启了 二进制binlog  中继日志 relaylog  和 慢日志slowlog ,我们拷贝mysql01的系统数据和业务数据到mysql02,而不需要mysql01的二进制binlog  中继日志 relaylog  和 慢日志slowlog。

1. 暂停业务,找一台空闲服务器,将mysql01、 mysql02的所有数据备份

2. 分别在mysql01  mysql02 停止mysql服务

# systemctl  stop mysqld

3. 在mysql02 ,删除mysql所有其他数据,只备份/opt/data/mysql/auto.cnf 文件

#  cp  /opt/data/mysql/auto.cnf  /home/auto.cnf.bak

# rm  -rf  /opt/data/mysql/*

4. 删除mysql01的二进制binlog  中继日志 relaylog  和 慢日志slowlog

# cd  /opt/data/mysql

#  rm  -rf    主机名-bin.*  主机名-relay-bin.*  主机名-slow* 

【MySQL】关于恢复MySQL主主数据的同步问题_第2张图片

5. 拷贝mysql01的数据文件到mysql02数据目录

#  scp  -r  /opt/data/mysql/*    [email protected]:/opt/data/mysql/

6. 在mysql02上还原auto.cnf文件,更改拷贝过来的文件属主属组

#  cp /home/auto.cnf.bak      /opt/data/mysql/auto.cnf 

# chown  -R  mysql:mysql    /opt/data/mysql/

7. 在mysql01 mysql02 上启动 mysql和keepalived

# systemctl start  mysqld

# systemctl restart keepalived

# systemctl status  mysqld keepalived

【MySQL】关于恢复MySQL主主数据的同步问题_第3张图片

四、数据同步和验证

登录mysql01

# mysql -u root -p"MySQL@123"

> stop slave;

> reset slave;

> reset master;

>  change master to master_host='192.168.1.105',master_port=3306,master_user='repl',master_password='MySQL@123',master_auto_position = 1;

> start slave;

> show slave status\G

【MySQL】关于恢复MySQL主主数据的同步问题_第4张图片

可以看出,mysql01 同步mysql02正常!


登录mysql02

# mysql -u root -p"MySQL@123"

> stop slave;

> reset slave;

> reset master;

>  change master to master_host='192.168.1.104',master_port=3306,master_user='repl',master_password='MySQL@123',master_auto_position = 1;

> start slave;

> show slave status\G

【MySQL】关于恢复MySQL主主数据的同步问题_第5张图片

可以看出,mysql02 同步mysql01正常!

现在,实现了 mysql01 mysql02 的主主同步,剩下的事就是启动服务,看对业务是否有影响。


五、回退方案

如果同步失败,我们至少保留了同步前,mysql01 的全部数据,停服务器和数据库,回填数据,启动数据库和服务。


六、参考


数据库之架构:主备+分库 or 主从+读写分离

https://www.cnblogs.com/littlecharacter/p/9084291.html


用shell脚本批量生成测试用SQL语句

https://my.oschina.net/zhuguowei/blog/474572


Tools for Generating Mock Data?

https://stackoverflow.com/questions/591892/tools-for-generating-mock-data


MySQL Sharding 批量执行工具

https://github.com/shilion/mysqlbatch


解决mysql开启GTID主从同步出现1236错误问题

https://blog.51cto.com/hnr520/1883282

你可能感兴趣的:(【MySQL】关于恢复MySQL主主数据的同步问题)