MySQL主从服务器数据一致性的核对与修复

我上一次遇到MySQL主从服务器数据一致性问题,想一想是几年前的事情了,还依稀记得当时惶恐不安的情景,好在最后借助Maatkit解决了问题。 几年后,当我再次面对一样的问题时,Maatkit已经不复存在,转而成为了Percona Toolkit的一部分,不变的是我依旧手忙脚乱,因此仍是记录一下吧,保不许啥时候又会遇到这个问题。mysql

若是你在MySQL从服务器上遇到相似下面的错误信息,那么恭喜你中招了:sql

mysql> SHOW SLAVE STATUS\G Last_Error: Error 'Duplicate entry '...' for key ...' on query.

为啥会出现惟一索引键值重复?最大的多是错误的对从服务器作了写操做!出现此类错误的时候,不少人会用sql_slave_skip_counter操做跳过错误,甚至有人写了脚本,若是有多个错误,就循环屡次执行sql_slave_skip_counter:shell

mysql> SET GLOBAL sql_slave_skip_counter = 1; mysql> START SLAVE;

惋惜,即使sql_slave_skip_counter操做可以暂时让主从恢复工做,但多半数据一致性已经被破坏的更严重了,迟早有一天被掩盖的问题会再次爆发出来。安全

Percona Toolkit里的pt-table-checksum和pt-table-sync能够搞定此类问题。它们的安装很简单,能够依照本身的操做系统选择下 载rpm或者deb软件包来安装,固然也可使用源代码来安装,不过要注意的是,必须确保系统已经安装了依赖的Perl软件包:服务器

shell> perl -MCPAN -e 'install DBI' shell> perl -MCPAN -e 'install DBD::mysql' shell> perl -MCPAN -e 'install Term::ReadKey'

顺便说一下,我在安装某些Perl模块的时候,出现相似下面的错误提示:ide

Can’t locate object method “install” via package “…”

若是你也遇到了相似的问题,能够进入到Perl命令行安装:函数

shell> perl -MCPAN -e shell cpan> install ...

安装Percona Toolkit的剩余步骤就是Perl软件的固定打法了:this

shell> perl Makefile.PL shell> make shell> make install

前戏进行到这里应该能够了,下面让咱们直捣黄龙,看看如何解决问题:操作系统

MySQL主从服务器数据一致性的核对命令行

经过在主服务器上运行pt-table-checksum,它会经过一系列的MySQL函数计算每一个表的散列值,利用主从复制关系,把一样的计算过程在从服务器上重放,从而就拿到了主从服务器各自的散列值,只要比较散列值是否相同就OK了。

这里面有两点须要说明:

计算表的散列值时,pt-table-checksum并非直接计算整个表的散列值,而是分块计算,这样就避免了形成从服务器长时间的延迟。

由于经过MySQL函数计算散列的过程须要在从服务器上重放,因此主从复制的格式必须是基于STATEMENT的,不能是基于ROW的。

实际操做时的命令大体以下:

shell> pt-table-checksum \ --replicate=percona.checksums \ --host=<MASTER_HOST> \ --user=<MASTER_USER> \ --password=<MASTER_PASSWORD>

说明:replicate选项指定告终果保存到哪一个库和表中,若是你愿意,能够手动查询:

SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM percona.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;

BTW:多数状况下,只要比较「master_crc <> this_crc」就能够了。

MySQL主从服务器数据一致性的修复

经过在主服务器上运行pt-table-sync,它会重建数据,数据经过复制从主服务器同步到从服务器,从而修复了一致性,在操做过程当中,能够利用pt-table-checksum的结果。

shell> pt-table-sync \ --execute \ --replicate=percona.checksums \ --charset=<CHARSET> \ --host=<MASTER_HOST> \ --user=<MASTER_USER> \ --password=<MASTER_PASSWORD>

说明:由于pt-table-sync会重建数据,因此有必定的风险,最好提早备份好数据。若是仍然不放心,可使用它提供的「print」选项,它会打印出相应的SQL,你能够审查一下到底执行了那些操做,而后经过手动执行来完成同步。

本文例子中,咱们为了方便,在运行Percona Toolkit命令的时候直接键入了密码等敏感信息,这在不少时候是不安全的,好比说别人能够经过查看命令历史拿到密码。还好咱们有「ask-pass」 选项能够解决此类问题,实际上咱们还能够更进一步,直接把密码等敏感信息保存到配置文件中,最容易想到的配置文件是「~/.my.cnf」,此外,还有几 个更官方的配置文件可供选择,咱们能够在源代码里看到它们的踪迹:

default_files => [ "/etc/percona-toolkit/percona-toolkit.conf", "/etc/percona-toolkit/$program_name.conf", "$home/.percona-toolkit.conf", "$home/.$program_name.conf", ] …

俗话说:不怕贼偷,就怕贼惦记着。看待问题的态度亦是如此:不怕出问题,就怕问题潜伏在暗处窥视着你,而你却一无所知。你们没事儿的时候多查查主从一致性吧。

相关文章
相关标签/搜索