暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql主从同步问题之釜底抽薪

开发架构二三事 2019-10-10
200


同步问题实在解决不了时,以主库为准。

导出主库数据

  1. 1 mysqldump方式

  1. mysqldump -uroot -p --single-transaction --master-data=2 --no-autocommit -A >alldatas.sql

复制
  1. 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信息不一致):

  1. mysql> reset master;

  2. mysql> show master status\G

复制

如果reset master发生在mysqldump之后,则需要通过show master status\G;来确定从库需要更新的位置,这时如果没有在停机状态下是不准确的。如果需要reset master,最好是在reset之后再dump一份新的数据文件出来。

  • 从库上:

  1. mysql> stop slave;

  2. mysql> reset slave;

  3. mysql> show slave status\G

复制

将导出的数据导入从库

  • 如果是dump下来的数据,需要通过scp复制到从库上然后执行:mysql -uroot -p < alldatas.sql

  • 如果是通过客户端导出的需要使用客户端工具导入或者用source命令导入也可。这种情况下需要通过show master status\G;来确定从库需要更新的位置,这时如果没有在停机状态下是不准确的。

查看主库的binlog 位置

  1. 从dump文件中 

    这种情况需要注意上面提到的reset master与dump的先后顺序。

  2. show master status\G;

  1. mysql> show master status\G;

  2. *************************** 1. row ***************************

  3. File: bin.000002

  4. Position: 77530910

  5. Binlog_Do_DB:

  6. Binlog_Ignore_DB:

  7. Executed_Gtid_Set:

  8. 1 row in set (0.00 sec)

复制

这个在不停机状态下position和file都是在变化状态的,因为会有新的插入进来,需要注意。

修改slave的postition和file信息与最新的master关联起来

  1. mysql> CHANGE MASTER TO

  2. -> MASTER_HOST='192.168.1.99',

  3. -> MASTER_USER='test99',

  4. -> MASTER_PASSWORD='aA&12345',

  5. -> MASTER_LOG_FILE='bin.000002',

  6. -> MASTER_LOG_POS= 77530910;


  7. mysql> start slave;

  8. Query OK, 0 rows affected (0.00 sec)


  9. mysql> show slave status\G;

  10. *************************** 1. row ***************************

  11. Slave_IO_State: Waiting for master to send event

  12. Master_Host: 192.168.1.163

  13. Master_User: test123

  14. Master_Port: 3306

  15. Connect_Retry: 60

  16. Master_Log_File: bin.000002

  17. Read_Master_Log_Pos: 77530910

  18. Relay_Log_File: mysql-relay-bin.000002

  19. Relay_Log_Pos: 314

  20. Relay_Master_Log_File: bin.000002

  21. Slave_IO_Running: Yes

  22. Slave_SQL_Running: Yes

  23. Replicate_Do_DB:

  24. Replicate_Ignore_DB:

  25. Replicate_Do_Table:

  26. Replicate_Ignore_Table:

  27. Replicate_Wild_Do_Table:

  28. Replicate_Wild_Ignore_Table:

  29. Last_Errno: 0

  30. Last_Error:

  31. Skip_Counter: 0

  32. Exec_Master_Log_Pos: 77530910

  33. Relay_Log_Space: 521

  34. Until_Condition: None

  35. Until_Log_File:

  36. Until_Log_Pos: 0

  37. Master_SSL_Allowed: No

  38. Master_SSL_CA_File:

  39. Master_SSL_CA_Path:

  40. Master_SSL_Cert:

  41. Master_SSL_Cipher:

  42. Master_SSL_Key:

  43. Seconds_Behind_Master: 0

  44. Master_SSL_Verify_Server_Cert: No

  45. Last_IO_Errno: 0

  46. Last_IO_Error:

  47. Last_SQL_Errno: 0

  48. Last_SQL_Error:

  49. Replicate_Ignore_Server_Ids:

  50. Master_Server_Id: 163

  51. Master_UUID: ec5e1ee1-f6e2-11e8-949d-005033ee2217

  52. Master_Info_File: /work1/data/mysql/master.info

  53. SQL_Delay: 0

  54. SQL_Remaining_Delay: NULL

  55. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

  56. Master_Retry_Count: 86400

  57. Master_Bind:

  58. Last_IO_Error_Timestamp:

  59. Last_SQL_Error_Timestamp:

  60. Master_SSL_Crl:

  61. Master_SSL_Crlpath:

  62. Retrieved_Gtid_Set:

  63. Executed_Gtid_Set:

  64. Auto_Position: 0

  65. Replicate_Rewrite_DB:

  66. Channel_Name:

  67. Master_TLS_Version:

  68. 1 row in set (0.01 sec)

复制

执行成功之后主从数据不同步的问题就可以修复了。

总结

  1. 不停机:清除从库数据,然后采取dump方式,不reset master或先reset master之后再从master上dump,reset slave之后先将dump 出的文件导入从库中,然后从dump出的文件中找出当前的binlog文件和postition信息,执行change master命令。

  2. 停机: 清除从库数据,然后通过客户端工具或者dump方式,reset slave之后,将数据库文件导入从库中,然后通过在主库上show master status\G来找到当前主库的 binlog文件和position信息,执行change master命令。

文章转载自开发架构二三事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论