mysql主从数据一致性校验和修复
1. 安装
yum install -y perl-IO-Socket-SSL.noarch perl-Digest-MD5
yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install percona-toolkit -y
2. 创建校验用户并授权限
GRANT REPLICATION SLAVE,PROCESS,SUPER, SELECT ON *.* TO `checksum_user`@'%' IDENTIFIED BY 'checksum_xxxxxx'; GRANT ALL PRIVILEGES ON percona.* TO `checksum_user`@'%';
3. 校验
全库校验
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
不校验mysql和test库
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --ignore-databases mysql,test h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
只校验db1,db2两个库
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --databases db1,db2 h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
只校验db1.t1,db2.t2两张表
pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --tables db1.t1,db2.t2 h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
使用dsn表校验
使用dns表进行校验的好处是,当校验多个slave不标准3306端口,或者使用不同的校验账号密码,或者只想校验其中一个slave,可以使用这种方法。通过--recursion-method参数指定dns,recursion-method选项有以下几种
METHOD USES
=========== =============================================
processlist SHOW PROCESSLIST
hosts SHOW SLAVE HOSTS
cluster SHOW STATUS LIKE
'wsrep\_incoming\_addresses'
dsn=DSN DSNs from a table
none Do not find slaves
首先需要在主库创建一张dsn表,我在percona库下创建,并输入从库连接信息,id和parent_id字段可随意
在新版本的pt-table-ckecksum不用自己添加checksums表,在pt-table-checksum 表时,会在master库上默认生成percona库和表checksums
mysql> create database percona;
mysql> use percona;
mysql> CREATE TABLE `dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
mysql> SELECT * FROM dsns;
+----+-----------+------------------------------------------------------------+
| id | parent_id | dsn |
+----+-----------+------------------------------------------------------------+
| 1 | 1 | h=192.168.0.134,u=checksum_user,p=checksum_xxxxxx,P=3306 |
| 2 | 2 | h=192.168.0.132,u=checksum_user,p=checksum_xxxxxx,P=3307 |
+----+-----------+------------------------------------------------------------+ # 开始验证
shell> pt-table-checksum --replicate percona.checksums --no-check-binlog-format h='master_host',u=checksum_user,p=checksum_xxxxxx --recursion-method dsn=h='dsn_host',u='dsn_user',p='dsn_pass',P='dsn_port',D=percona,t=dsns
4. 列出与主库数据不一致的表
可以在主库上通过--replicate-check-only 参数仅打印数据不一致的表,不会再进行校验
pt-table-checksum --replicate=percona.checksums --replicate-check-only --no-check-binlog-format --ignore-databases mysql h=localhost,u=checksum_user,p=checksum_xxxxxx
也可以在每台从库slave执行下面SQL语句查找哪些表数据和主库不一致
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;
5. 输出结果说明
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
10-20T08:36:50 0 0 200 1 0 0.005 db1.tbl1
10-20T08:36:50 0 0 603 7 0 0.035 db1.tbl2
10-20T08:36:50 0 0 16 1 0 0.003 db2.tbl3
10-20T08:36:50 0 0 600 6 0 0.024 db2.tbl4
TS:工具完成校验和表时的时间戳
ERRORS:校验表时发生的错误和警告的数量
DIFFS:一个或多个副本上与主节点不同的块的数量,大于0说明这些表数据和主库不一致
ROWS:从表中选择和校验的行数
CHUNKS:表被分成的块的数量
SKIPPED:校验出错跳过块的数量
TIME:校验表时花费的时间
TABLE:已进行校验和的数据库和表
6. 加--replicate-check-only输出结果说明
如果指定了--replicate-check-only,则只会打印检测到的副本上的校验和差异。
输出不同:每个副本一个段落,每行一个校验和差异,值之间用空格分隔.
Differences on h=127.0.0.1,P=12346
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
db1.tbl1 1 0 1 PRIMARY 1 100
db1.tbl1 6 0 1 PRIMARY 501 600
Differences on h=127.0.0.1,P=12347
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
db1.tbl1 1 0 1 PRIMARY 1 100
db2.tbl2 9 5 0 PRIMARY 101 200
每段第一行列出有差异的从库
TABLE :与主库数据不一致的表。
CHUNK :与主库数据不一致的表的块编号。
CNT_DIFF :从库上的块行数减去主库上的块行数。
CRC_DIFF :如果是1表示从库块上的块的CRC与主库块上的CRC不致,否则为0
CHUNK_INDEX :用于分块表的索引。
LOWER_BOUNDARY :定义块的下边界的索引值。
UPPER_BOUNDARY:定义块的上边界的索引值。
7. 常用参数
--replicate: 将校验结果记录到percona.checksums表中,如果表不存在,默认会自动创建
--databases:指定需要校验的库,多个库用逗号分隔
--ignore-databases: 不需要校验的库,多个库用逗号分隔
--tables:指定需要校验的表,多个表用逗号分隔,不同库的表可以写成db1.t1,db2.t1
--ignore-tables:不需要校验的表,多个表用逗号分隔
--no-check-binlog-format:不检查binlog 格式
数据修复
检测数据不一致的情况使用pt-table-sync进行修复:
pt-table-sync --print --replicate percona.checksums --databases db12 h=172.16.1.168,u=checksum_user,p=checksum_xxxxxx h=172.16.1.131,u=checksum_user,p=checksum_xxxxxx
--replicate :指定通过pt-table-checksum得到的表。
--databases : 指定执行同步的数据库,多个用逗号隔开。
--tables= :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主
h=127.0.0.1 :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址
u=root :帐号
p=123456 :密码
--print :打印修复的命令,但不执行
--execute :执行命令
mysql主从数据一致性校验和修复的更多相关文章
- MySQL主从数据一致性问题修复
MySQL主从数据一致性问题修复 前面,我们使用pt-table-checksum 可以检测出主从数据是否一致的问题.发现问题后,我们怎么解决这些问题,也是我们必须要会的技能. 修复主从数据一致性问题 ...
- 利用mk-table-checksum监测Mysql主从数据一致性操作记录
前面已经提到了mysql主从环境下数据一致性检查:mysql主从同步(3)-percona-toolkit工具(数据一致性监测.延迟监控)使用梳理今天这里再介绍另一种Mysql数据一致性自动检测工具: ...
- 恢复MySQL主从数据一致性的总结
今日上午,同事告知,MySQL主从数据库的数据不一致,猜测备库在同步过程中出现了问题,于是,登上备库,使用 mysql> show slave status\G查看,果然,备库在insert语句 ...
- pt-table-checksum校验mysql主从数据一致性
主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的数据不一致,这会令人沮丧.通常我们仅有一种办法,热备主库,然后替换掉所有的从库.这不仅代价非常大,而且类似治标不治本 ...
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- mysql主从同步(4)-Slave延迟状态监控
mysql主从同步(4)-Slave延迟状态监控 转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...
- pt工具校验主从数据一致性之dsns方式
mysql主从数据一致性校验,常用的方法是Percona-Toolkit的组件pt-table-checksum,这东西怎么用网上一大堆,就不啰嗦了.主要说一下通过dsns方式发现从库的一种方式. p ...
- MySQL主从修复
MySQL主从故障修复 测试库:192.168.1.2 主192.168.1.3 从 192.168.1.4 主 4又是2的从库192.168.1.5 从 有人修改了192.168.1.2和192.1 ...
- shell脚本修复MySQL主从同步
发布:thebaby 来源:net [大 中 小] 分享一例shell脚本,用于修改mysql的主从同步问题,有需要的朋友参考下吧. 一个可以修改mysql主从同步的shell脚本. 例子 ...
随机推荐
- jade-for-each-while
if else还是for循环,在jade里面都是可执行的代码 for循环 - var lession = {course:'jade', level:'high'} - for (var k in l ...
- Python+request 测试结果结合unittest生成测试报告《四》
测试报告示例图: 目录结构介绍: 主要涉及更改的地方: 1.导入 Common.HTMLTestRunner2文件 2.run_test.py文件中新增测试报告相关的代码 具体代码实现: 1 ...
- jQuery获取父窗口的元素
js获取父页面的元素可以用 $(window.parent.document).find("#customer_id").val();这里的customer_id表示父页面某一个元 ...
- python2和python3编程差异杂谈(-)
python2 默认编码ascii 在使用中文时要显示的声明 #-*-encoding:utf-8-*- python3 默认编码utf-8,良好的支持了中文输入 python2: print函数 ...
- javascript逻辑或(||)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP mysqli_dump_debug_info() 函数
mysqli_dump_debug_info() 函数转储调试信息到日志中. <?php mysqli_dump_debug_info($con); ?>
- Ubuntu下dpkg安装软件遇到包依赖问题的处理方法
造冰箱的大熊猫@cnblogs 2019/9/10 向灵魂工程师致敬! 在Ubuntu环境下通过dpkg命令安装deb包时,如果遇到包依赖问题,如 $sudo dpkg -i xxx.deb (Rea ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 如何更改电脑ip
首先打开控制面板==>点击网络和internet==>点击网络和共享中心==>点击更改适配器设置==>右键无线连接或宽带连接(视情况而定)==>属性==>双击ipv ...
- vscode设置VUE eslint开发环境
我的使用vscode开发VUE的常用设置 1.安装插件 ESLint Vetur Beautify Prettier - Code formatter Auto Rename Tag -重命名标签,闭 ...