• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
mysql主从数据不一致的问题解决过程
发布日期:2016-4-22 13:4:37

   mysql主从数据不一致的问题解决过程

    一、大致情况

  当时出现问题时的情况时这样的:

  昨天晚上主动2个机器都迁移了,然后今天才把主动重新连接上,但是从库的偏移量是从今天当前时刻开始的,也就是说虽然现在主动看似正常,其实是少了昨天的部分数据,因为从库的数据丢失了,早晚还是要填坑的。

  二、问题

  我们要解决问题就是:

  •     怎么对比不一致
  •     在不影响业务的情况下,修复数据不一致的问题,把从库缺少的数据补上

  我找到的几个方案,如下所示:

  •   从新从0开始同步,虽然对主库的使用没有影响,但是那么大的数据量,对性能,网络影响有点大,数据丢失的应该很少
  •   主库dump数据,锁库,然后同步,不好。 影响业务使用
  •   percona-toolkit 中的工具来校验和同步,从介绍上来看是符合现在的情况的,使用上还需要学习和认识才行。

  下面是我找到的几个参考链接:

  1.   percona-toolkit工具 官方地址
  2.   MySQL主从服务器数据一致性的核对与修复 简单描述下过程
  3.   用pt-table-checksum校验数据一致性 描述工具原理因为
  4.   用pt-table-sync修复不一致的数据 描述了工具原理

  三、操作过程

  只把过程与用到的东西解释了下,有些参数选项等还需要查阅文档。两台机器都是centos6.5 MySQL版本都是5.6 , 是线上环境,所以这里ip与密码等敏感信息修改了下。

  •   主 192.168.1.100
  •   从 192.168.1.98
  •   修复数据库名 radius

  1.工具安装

  工具安装在主库服务器安装,代码如图1所示:


 图1

  2.校验数据一致性

  建立用户并授权

  注意这里要在主从创建一个同名的用户,可以从主库访问从库,主库本地可以访问主库。工具的使用都是在主库的服务器上进行,使用

  pt-table-checksum校验数据一致性。

  从库mysql操作,代码如图2所示:


  图2  ​

  主库mysql操作,代码如图3所示:


 图3

  校验时候需要在主mysql 中新建一张表,新建用户需要有读写的权限,这里是把校验表建立在radius库中。

  pt-table-checksum 校验

  校验是在主库服务器上进行的

  主库shell中执行,代码如图4所示:


  图4

  这个脚本在主库机器上运行,会自动找到从库地址,并用相同的用户登录,然后对比。

  –replicate 选项是建立一个表来存储对比信息,这个表一定要能同步到从库中,如果checksums用户没有建表权限,请自行建立好表

  建表语句,代码如图5所示:


  图5

  我这里手动建立好表之后出现了如下的错误

这里手动建立好表之后出现了如下的错误,代码如图6所示:


图6

  之前的错误,导致主从复制有问题,去从库查看主动状态,调整是得主从正常。

  错误解决完了继续执行(结果有省略)

  下面继续在主库的shell上检查,代码如图7所示:


 图7  

   出现如图7所示的这种结果,说明已经check了,diffs一栏有不同,说明那些表数据不一致. 现在登录从库的mysql,执行如图8所示的语句,代码如下所示:


 图8

  一共有8条记录,这8张表数据不一致。 大概能看出来缺少了多少数据等。

  修复不一致数据

  修复不一致数据使用pt-table-sync 工具,使用pt-table-checksum工具的结果。不过这里还是有些坑。在修复之前最好把主mysql数据备份一下,因为会对主库有些写操作,有一点风险。

  主库服务器执行,代码如图9所示:


图9

  但是直接用mysql连接就没问题

  最后查了下文档,发现还是用户权限的问题。

  •   从库操作,代码如下所示:

  mysql> GRANT all ON radius.* TO 'checksums'@'192.168.1.100';

  Query OK, 0 rows affected (0.00 sec)

  mysql> flush privileges;

  Query OK, 0 rows affected (0.00 sec)1234512345

  •   主库操作,代码如下所示:

  mysql> GRANT all ON radius.* TO 'checksums'@'192.168.1.100';

  Query OK, 0 rows affected (0.00 sec)

  mysql> flush privileges;

  Query OK, 0 rows affected (0.00 sec)1234512345

  新增增删改查权限其实就够了 ,我这偷懒下。

  错误基本解决完了

  修复数据

  先修复一个不重要的表来实验下(主库操作),代码如下所示:

  pt-table-sync --execute --replicate radius.checksums --sync-to-master h=192.168.1.98,P=3306,u=checksums,p="slavecheck" --tables account_smslog,radcheck --print 11

  修复完成在执行一次check 主库操作,代码如下所示:

  pt-table-checksum h='192.168.1.100',u='checksums',p='slavecheck',P=3306 -d radius --nocheck-replication-filters --replicate=radius.checksums11

  在从库mysql中检查下,代码如下所示:

  mysql> select * from radius.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G11

  的确少了2张表,说明已经修复好了

  接着把其他表修复,然后检查下是否有问题就OK了。

  四、小结

  这里主要的问题如下所示:

  •   脚本在那里执行(都是在主库服务器,从库只是检查下结果)
  •   怎么建立用户,用户应该给予怎样的权限

  声明:

  本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/46532215 

上一条: MySQL的交互技巧

下一条: 8个MySQL陷阱