同步问题实在解决不了时,以主库为准。
导出主库数据
1 mysqldump方式
mysqldump -uroot -p --single-transaction --master-data=2 --no-autocommit -A >alldatas.sql
复制
2 其他客户端工具导出
清空从库
将从库上的数据库清空,并还原为普通的数据库,(删除master.info relay-log.info relay-bin.index)
reset master和slave
一般情况下reset slave就可以了,如果reset slave也不行,那就需要reset master了。
主库上,reset master(非必须,视实际情况而定,reset不会清除数据,但是会修改掉当前主库的binlog位置信息致使与上面dump出的sql中的binlog信息不一致):
mysql> reset master;
mysql> show master status\G
复制
如果reset master发生在mysqldump之后,则需要通过show master status\G;来确定从库需要更新的位置,这时如果没有在停机状态下是不准确的。如果需要reset master,最好是在reset之后再dump一份新的数据文件出来。
从库上:
mysql> stop slave;
mysql> reset slave;
mysql> show slave status\G
复制
将导出的数据导入从库
如果是dump下来的数据,需要通过scp复制到从库上然后执行:mysql -uroot -p < alldatas.sql
如果是通过客户端导出的需要使用客户端工具导入或者用source命令导入也可。这种情况下需要通过show master status\G;来确定从库需要更新的位置,这时如果没有在停机状态下是不准确的。
查看主库的binlog 位置
从dump文件中
这种情况需要注意上面提到的reset master与dump的先后顺序。
show master status\G;
mysql> show master status\G;
*************************** 1. row ***************************
File: bin.000002
Position: 77530910
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
复制
这个在不停机状态下position和file都是在变化状态的,因为会有新的插入进来,需要注意。
修改slave的postition和file信息与最新的master关联起来
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.99',
-> MASTER_USER='test99',
-> MASTER_PASSWORD='aA&12345',
-> MASTER_LOG_FILE='bin.000002',
-> MASTER_LOG_POS= 77530910;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.163
Master_User: test123
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin.000002
Read_Master_Log_Pos: 77530910
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 314
Relay_Master_Log_File: bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 77530910
Relay_Log_Space: 521
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 163
Master_UUID: ec5e1ee1-f6e2-11e8-949d-005033ee2217
Master_Info_File: /work1/data/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.01 sec)
复制
执行成功之后主从数据不同步的问题就可以修复了。
总结
不停机:清除从库数据,然后采取dump方式,不reset master或先reset master之后再从master上dump,reset slave之后先将dump 出的文件导入从库中,然后从dump出的文件中找出当前的binlog文件和postition信息,执行change master命令。
停机: 清除从库数据,然后通过客户端工具或者dump方式,reset slave之后,将数据库文件导入从库中,然后通过在主库上show master status\G来找到当前主库的 binlog文件和position信息,执行change master命令。