专栏首页AustinDatabasesMYSQL 主从不一致怎么办?

MYSQL 主从不一致怎么办?

MYSQL 中主从不一致是很可能发生的,而怎么能发现不一致则并不是一个很简单的问题。尤其对数据量较大的情况下。废话说多无益,看下面的例子:

我们先建立一个存储过程,来插入我们的初始化数据

delimiter //

DROP PROCEDURE IF EXISTS insert_test_val;

##num_limit 要插入数据的数量,rand_limit 最大随机的数值

CREATE PROCEDURE insert_test_val()

BEGIN

DECLARE i int default 1;

DECLARE a varchar(20) ;

DECLARE b smallint ;

DECLARE c smallint ;

WHILE i<=1000000 do

set b = FLOOR(rand()*50);

set c = FLOOR(rand()*10);

if i mod 2 = 0 then

set a = 'peter';

elseif i mod 3 = 0 then

set a = 'jimmy';

elseif i mod 5 = 0 then

set a = 'Tim';

elseif i mod 4 = 0 then

set a = 'semon';

else

set a = 'lisa';

end if;

if b < 20 then

set b = b + 15;

end if;

INSERT into test.test values (null,a,b,c);

set i = i + 1;

END WHILE;

END

//

运行存储过程插入数据, 在插入数据后,我们开始搞破坏了,我们将在从库删除一些数据。

然后我们开始运行 $ pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums h=192.168.198.201,u=admin,p='1234.com',P=3306

注意:

1 每次pt-table-checksum 只能检查一个表

2 检查时不建议检查binlog format 否则会报错,pt-table-checksum 默认是要使用 statement 作为复制的方式

3 replicate 默认指定的表最好在需要鉴定数据是否一致的库下,这样在执行pt-table-sync 时候回比较方便。

4 给定检测的连接数据库的账户,应该具有建表或建库的权限

其中pt-table-checksum 主要是将需要检测的表(不是每行)通过块的方式(多行组成的数据),进行检测,通过CRC32的方式

通过命令检测,发现相关表上有数据chunck 不一致,并且在检测数据库的位置,建立了checksums 表,来记录相关的信息。

(相关的参数请查看官方文档)

同时在主库中在运行

pt-table-sync --replicate=test.checksums h=192.168.198.201,u=admin,p=1234.com,P=3306 h=192.168.198.202,u=admin,p=1234.com,P=3306 --print > /data/fix.sql

在导出SQL 后在相关的从库导入

然后回到主库,清理checksums 表,然后在执行一遍命令,在查看chekcsums表,可以很清晰的看到,每个chunk 的值都是相等的。

可以看到修复差异的数据是可以的。

刚才仅仅是数据不同(数据缺失),如果里面的数据并没有缺失,仅仅是里面的值变化了,会不会无法使用这个工具,答案是不可能

我们可以试试,从库修改name 值

截图中我们修改了NAME 的值

我们还是通过刚才的命令,可以清晰的看到,相关的修改的记录可以被找到并且可以被修复。

所以到目前为止,通过PT工具来修复主从不一致的方法还是很奏效的,但如果你大多数表都不一致了,那还是建议从做一次主从复制比较高效。

另外,MYSQL 提供一个 checksum table 的命令,也能快速的判断一个表和另一个表之间是否不相同。 注意这里用的是 不相同,通过官方的文提示两个不一样的table 也是有可能产生一致的值,当然这样的概率会比较低。

本文分享自微信公众号 - AustinDatabases(AustinDatabases),作者:carol11

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MYSQL 的老大难,instant ,inplace,copy, DDL 怎么弄, 我不想迷迷糊糊

    DDL 操作一直是我们的 MYSQL 的一个软肋,从MYSQL 5.6 其实相关的alter 语句已经有了改变,也就是题目的的inplace 和 copy 。其...

    AustinDatabases
  • MYSQL 查询条件的函数不要乱用, 与随机函数怎么走索引

    偶然想起一事,具体的人和场景就不提了,事情是一条语句,明明是很简单的一句话,有索引,验证也是很快了,但只要在程序里面就慢的要死。后来发现是在语句后面使用了某函数...

    AustinDatabases
  • MYSQL not in not exists 我们不一样, 坑你还得入?

    MYSQL 8 这个版本已经和简单的查询慢慢的说再见了,MYSQL 8.017的功能Antijoin 也登录了,但问题大面积的MYSQL 5.X 怎么办,NOT...

    AustinDatabases
  • 基于SpringBoot2.0开发的后台管理系统

    TIMO后台管理系统,基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块...

    程序源代码
  • 腾讯人工智能AI接口-Java客户端

    2.将下载的tai-java-sdk-version.zip解压后,复制到工程文件夹中。

    程序源代码
  • 马化腾:我们怎么看科技和商业的结合?|清华演讲全文

    image.png 9月8日,腾讯董事会主席兼首席执行官马化腾在清华大学洞见论坛上发表演讲,谈及科技和商业的融合时表示,随着数字经济的发展,科技越来越融...

    腾讯研究院
  • 在Windows上隐藏自己的渗透测试工具

    对于渗透测试人员来说,上传使用自己的工具是大多数都会进行的一步,那如何隐藏自己的工具不被管理员发现,甚至能够持续使用也是一个大问题。下面来介绍两种隐藏自己渗透测...

    Jumbo
  • 深度学习入门(一),从Keras开始

    安装环境:Anaconda(python3.6) 首先安装:tensorflow.(通过navigator,可参见直通车) 检验:import ten...

    学到老
  • java_面试_01_一个月的面试总结(java)

           JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻)

    shirayner
  • 优雅的使用 ThreadLocal

    在我们日常 Web 开发中难免遇到需要把一个参数层层的传递到最内层,然后中间层根本不需要使用这个参数,或者是仅仅在特定的工具类中使用,这样我们完全没有必要在每一...

    Java技术江湖

扫码关注云+社区

领取腾讯云代金券