如何确保MySQL复制准确?

时间:2015-05-12 07:54:27

标签: mysql database-replication master-slave

我最近使用复制来备份我的sql数据库。但是,当我比较表格大小时,它们略有不同。我觉得这很奇怪,因为它们包含相同数量的行。

我读过这是因为奴隶服务器更加优化,这很好。然而,它很难知道是否有任何问题。

会定期用

检查奴隶
show slave status\G

足以检查是否存在任何不一致之处?这将显示是否存在错误或其中一个主线程已停止。

我以为我可以用

检查数据库大小
SELECT table_schema "Data Base Name", 
sum( data_length + index_length ) / 1024 / 
1024 "Data Base Size in MB", 
sum( data_free )/ 1024 / 1024 "Free Space in MB" 
FROM information_schema.TABLES 
GROUP BY table_schema ; 

是否有更简单的方法来检查从属设备是否与主设备相同?

3 个答案:

答案 0 :(得分:2)

检查数据完整性

使用Percona的pt-table-checksum验证数据完整性。

  

pt-table-checksum通过在主服务器上执行校验和查询来执行在线复制一致性检查,这会在与主服务器不一致的副本上产生不同的结果。可选DSN指定主主机。如果发现任何差异,或者出现任何警告或错误,该工具的“退出状态”不为零。

来源:http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html

检查从属设备是否正在运行

执行show slave status并检查Slave_IO_RunningSlave_SQL_Running是" "。

答案 1 :(得分:1)

此解决方案使用 awk 处理show命令输出,并在任何已处理字段中发生错误时发送邮件。在这种情况下,字段是Slave_IO_Running和Slave_SQL_Running。可以免费添加“显示奴隶状态”中的其他字段。输出 - 例如Last_Error / Seconds_Behind_Master或者唤醒其他show命令的输出。

 #!/bin/bash

 # get some slave stats

 Slave_IO_Running=mysql -u root --password="pwd" -Bse "show slave status\G" | grep Slave_IO_Running | awk '{ print $2 }'

 Slave_SQL_Running=mysql -u root --password="pwd" -Bse "show slave status\G" | grep Slave_SQL_Running | awk '{ print $2 }'

 Last_error=mysql -u root --password="pwd" -Bse "show slave status\G" | grep Last_error | awk -F : '{ print $2 }'  


if [ '$Slave_SQL_Running' == 'No' ] || [ '$Slave_IO_Running' == 'No' ];

 then

     echo "Last Error:" $Last_error | mail -s "Replication error on slavedb!!!" devops@company.com

 fi  

exit 0

我不会因为很多原因而比较大小,但是因为通常有一天你会想要在奴隶之上建立你的仓库而只能从它上面读取内容报告。 虽然在这方面我可以建议你比较上次备份之间每个数据库的从属大小(因为这是你应该备份的)的大小。有时看到一个非常大差异或负面可以引导您得出一些有用的结论

答案 2 :(得分:0)

的输出中,

seconds_behind_master值应小于50

显示奴隶状态\ G;

理想情况下,零值表示从属设备已完全复制。