记一次mysql主从不同步的经历
近期进行机房迁移,很重要的一步就是迁移数据库。
问题描述:
几个月前搭建好了数据库的双主结构,使用vip漂移的形式。近期发现数据没有同步。
可能的原因:
可能是中间关过机导致的?
问题说明:
方便叙述,假设两台主机的ip分别为A和B
双主结构采用binlog互相复制的形式,可以在A主机上使用命令
show master status
命令查看自己的binlog文件和postion。
这里的postion指的是binlog当前的写入位置。比如binlog是mysql-bin.000005, postion是1234
则B主机必须使用命令
change master to master_host='A',master_user='repl',master_password='xxxxx',master_log_file='mysql-bin.000005',master_log_pos=1234;start slave;
进行配置,表示B主机监视A主机的mysql-bin.000005文件,从该文件的1234位置开始监控。
这个postion表示的是当前的binlog位置,因为数据库写入操作都会记录binlog,所以每次写入操作该值都会变化。
同样的,A主机也要做相同的配置,监视B主机的binlog的当前位置。
另外,mysql重启实例的时候,会重新创建一个binlog文件。
问题解决:
因为中间重启过实例,之前的修改无法通过binlog来同步了。但是因为服务并没有启动,可以停机操作。
方法:
1. 先关掉双方的数据同步:
slave stop;
2. 导出A主机的全量数据,并且记录导出A主机数据那一刻的A主机position(这一步用脚本做),假设是2000。
3. 在B主机导入A主机的全量数据,并修改追踪的postion位置
change master to master_host='A',master_user='repl',master_password='xxxxx',master_log_file='mysql-bin.000005',master_log_pos=2000;start slave;
3. 查看B主机当前的postion
show master status;
假设是3000
4. 在A主机上设置追踪B主机的postion
change master to master_host='A',master_user='repl',master_password='xxxxx',master_log_file='mysql-bin.000005',master_log_pos=3000;start slave;
问题解决。
中间还用到了一个工具,pt,可以操作数据库,比如可以导出创建用户的语句。