MySQL数据库各表最后一条记录获取及故障转移完整性检查方案
MySQL故障转移后的数据一致性校验方案
批量获取每张表的最后一条记录
如果你的表大多有自增主键,可以用系统表自动生成批量查询语句,不用手动写100次:
SELECT CONCAT( 'SELECT "', table_name, '" AS table_name, * FROM ', table_name, ' ORDER BY ', column_name, ' DESC LIMIT 1;' ) AS query_sql FROM information_schema.columns WHERE table_schema = '你的目标数据库名' AND extra LIKE '%auto_increment%';
执行后会得到每张表的查询语句,把结果复制出来批量执行就能拿到所有表的最后一条记录。
要是有些表没有自增主键,但有主键,换下面的SQL生成按主键排序的查询:
SELECT CONCAT( 'SELECT "', table_name, '" AS table_name, * FROM ', table_name, ' ORDER BY ', GROUP_CONCAT(column_name SEPARATOR ', '), ' DESC LIMIT 1;' ) AS query_sql FROM information_schema.columns WHERE table_schema = '你的目标数据库名' AND column_key = 'PRI' GROUP BY table_name;
更优的数据完整性校验方案
只查最后一条记录只能做简单验证,下面几个方案更靠谱:
批量Checksum校验
生成批量校验表的SQL,分别在故障转移前后的库执行,对比校验值:SELECT CONCAT('CHECKSUM TABLE ', table_name, ';') AS check_sql FROM information_schema.tables WHERE table_schema = '你的目标数据库名' AND table_type = 'BASE TABLE';两张库的Checksum值不一致,说明对应表数据有差异。
用pt-table-checksum工具
这是Percona工具集里的专用校验工具,能自动对比主备(或新旧库)的每张表数据,生成详细差异报告,还支持自动修复差异。执行示例:pt-table-checksum h=原库地址,u=账号,p=密码,P=端口 --databases=你的目标数据库名然后在新库查看校验结果,比手动操作高效得多。
全量导出对比
用mysqldump分别导出新旧库的全量数据,再用diff工具对比:# 导出原库 mysqldump -h原库地址 -u账号 -p密码 你的目标数据库名 > old_db_dump.sql # 导出新库 mysqldump -h新库地址 -u账号 -p密码 你的目标数据库名 > new_db_dump.sql # 对比差异 diff old_db_dump.sql new_db_dump.sql这个方法最彻底,但数据量大时耗时久,适合小库或核心业务库校验。
同步状态预校验
如果是主从架构的故障转移,先在备库执行SHOW SLAVE STATUS\G,确认Seconds_Behind_Master为0,Slave_IO_Running和Slave_SQL_Running均为Yes,说明转移前同步完全正常,再结合上面的方法做二次验证。
内容的提问来源于stack exchange,提问作者Seb_
相关产品推荐
相关产品推荐

