MySQL pt-table-checksum及pt-table-sync校验及修复主从一致性

【pt-table-checksum】
pt-table-checksum是percona-toolkit系列工具中的一个, 可以用来检测主、 从数据库中数据的一致性。其原理是在主库上运行, 对同步的表进行checksum, 记录下来。 然后对比主从中各个表的checksum是否一致, 从而判断数据是否一致。检测过程中以块为单位, 对于大的表可以区分为多个块, 从而避免锁表( 根据唯一索引将表切分为块)检测时会自动判断复制延迟、 master的负载, 超过阀值后会自动将检测暂停。

【pt-table-sync】
pt-table-sync,顾名思义,它用来修复多个实例之间数据的不一致。它可以让主从的数据修复到最终一致,也可以使通过应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。

  • 校验(Master服务器运行)
pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=120 --databases newtable -u‘checksums‘ -p‘checksums‘ -h10.1.1.6

#-h -u -p -P -S -d 连接信息
#--nocheck-replication-filters 检测中忽略mysql 配置参数binlog_ignore_db等。
#--nocheck-binlog-format 不检测日志格式
#--replicate 指定checksum 存储的db和表, 如test.checksum
# --chunk-size, --chunk-size-limit 用于指定检测块的大小。 可控性更强
# --ignore-databases/tables/column 跳出指定元素的过滤
# --lock-wait-timeout innodb 锁的超时设定, 默认为1
# --max-load 设置最大并发连接数
# --replicate-check-only 只输出数据不一致的信息。
# --help 有这个就行了, 以及其他的详见文档。

备注:--no-check-binlog-format 忽略检查binlog格式,否则会报错,默认会去检查statement模式,一般我们都用row模式

  

TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。

备注:主要观察DIFFS列,标识差异数。

  • 查看差异(Slave库运行)
select db, tbl, sum(this_cnt) as total_rows, count(*) as chunks
 from checksums
where ( master_cnt <> this_cnt OR master_crc <> this_crc OR isnull(master_crc) <> isnull(this_crc) )
 group by db, tbl;

  

  • 复制,消除差异(Master服务器运行)

假设newtables数据库tb1表存在差异

i.自动消除差异(不推荐)
pt-table-sync --print --execute --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘ --databases=newtables --tables=tb1

ii.打印出sql语句,人工干预到Slave库执行(推荐)
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘ --databases=newtables --tables=tb1
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘--replicate pt.checksums

#--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
#--replicate :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
#--print :打印,但不执行命令。
#--execute :执行命令。

  备注:Slave需要授权主库Drop 和Create Temporary Tables权限

  • 检验

重新执行一次pt-table-checksum,查看是否还存在差异。

时间: 2024-10-13 22:21:47

MySQL pt-table-checksum及pt-table-sync校验及修复主从一致性的相关文章

mysql主从一致性校验工具-pt

一.环境 1.系统环境 系统 IP 主机名 说明 server_id centos6.7 MasterIP master 数据库:主 177  centos6.7 SlaveIP slave 数据库:从 148 2.软件环境 软件 版本 安装方式 说明 pt工具 3.0.4 编译安装 这是一个综合工具包,包含很多pt命令 mysql数据库 5.6.37 yum安装 主从环境 3.需要用到库 库名 表名 用途  percona checksums 存储pt命令监测的结果,第一次执行检测命令时会自己

mysqldump导出报错&quot;mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `file_storage` at row: 29&quot;

今天mysql备份的crontab自动运行的时候,出现了报警,报警内容如下 mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `file_storage` at row: 29 mysqldump: Couldn't execute 'show table status like 'property'': MySQL server has gone away (2006)

&#39;mysql.column_stats&#39; doesn&#39;t exist and Table &#39;mysql.index_stats&#39; doesn&#39;t exist

在生产库MariabDB中修改字段类型,提示如下错误:?Table 'mysql.column_stats' doesn't existTable 'mysql.index_stats' doesn't exist ?MariaDB版本如下:??MariaDB [mysql]> select @@version;+---------------------+| @@version |+---------------------+| 10.0.12-MariaDB-log |+----------

Mysql -- You can&#39;t specify target table &#39;address&#39; for update in FROM clause

做地址管理时,需要先根据要设为默认的地址的用户将用户的其他地址都设置为非默认 需要select出用户id然后update 原语句 update address set isdeafult = 0 where user_id = (select user_id from address where id = ?) 报错 -- You can't specify target table 'address' for update in FROM clause 大意是不能先select出同一表中的某些

MySQL ERROR 1005: Can&#39;t create table (errno: 150)的错误解决办法

在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1.外键的引用类型不一样,主键是int外键是char 2.找不到主表中 引用的列 3.主键和外键的字符编码不一致 4.还有要建立外键的话,要先建立索引.没有建立索引也会出错. MySQL ERROR 1005: Can't create table (errno: 150)的错误解决办法

mysql: you can&#39;t specify target table 问题解决

首先创建一个表: CREATE TABLE `t1` ( `id` INT(11) NULL DEFAULT NULL, `name` VARCHAR(20) NULL DEFAULT NULL ) 插入几条数据: mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | chen | | 2 | li | | 3 | huan | +------+------+ 3 rows in set (0.0

NXP ARM Vector Table CheckSum

Signature Creator for NXP Cortex-M Devices Algorithm for creating the checksum The reserved Cortex-M3 exception vector location 7 (offset 0x001C in the vector table) should contain the 2’s complement of the check-sum of table entries 0 through 6. Thi

mysql 命令重命名表RENAME TABLE 句法

mysql 命令重命名表RENAME TABLE 句法 RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2,...]更名是以原子方式(atomically)执行,这就意味着,当更名正在运行时,其它的任何线程均不能该表.这使得以一个空表替换一个表成为可能. CREATE TABLE new_table (...);RENAME TABLE old_table TO backup_table, new_table TO

MySQL关于表碎片整理OPTIMIZE TABLE操作

MySQL关于表碎片整理OPTIMIZE TABLE操作的官方建议1.MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可,可以写成定时任务来做.2.OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显.此外,并不是所有表都需要进行碎片整理,一般只需要对包含上述可变长度的文本数据类型的表进行整理即可.3.在OPTIMIZE TABLE运行过程中,MySQL会锁定表.4.默认情况下,直接对