一、系统环境css
系统 | IP | 主机名 | 说明 | server_id |
---|---|---|---|---|
centos6.7 | MasterIP | master | 数据库:主 | 177 |
centos6.7 | SlaveIP | slave | 数据库:从 | 148 |
二、软件环境mysql
软件 | 版本 | 安装方式 | 说明 |
---|---|---|---|
pt工具 | 3.0.4 | 编译安装 | 这是一个综合工具包,包含不少pt命令 |
mysql数据库 | 5.6.37 | yum安装 | 主从环境 |
三、须要用到库算法
库名 | 表名 | 用途 |
---|---|---|
percona | checksums | 存储pt命令监测的结果,第一次执行检测命令时会本身建立sql 修复工具修复的时候会读取该表数据库 |
#本表格也能够本身建立,在使用pt工具的时候指定库表名字,详见下面的参数解释。centos
注意:自建库表测试还没有经过。服务器
一、主从复制是基于binlog的逻辑复制,不免出现复制数据不一致的风险架构
二、这个风险不但会引发用户数据访问先后不一致的风险ide
三、并且会致使后续复制出现103二、1062错误进而引发复制架构停滞的隐患工具
四、为了及时发现并解决这个问题
五、咱们须要按期或不按期地开展主从复制数据一致性的校验和修复工做
用到的命令:
一、pt-table-check #监测主从一致
二、pt-table-sync #修复主从一致
mysql主从一致性校验,基于pt工具进行。
#限制及问题
一、在检查阶段,超过1000行的数据,若是没有设定索引或者主键,则报错,该表会跳过检查。
二、在修复阶段,若是表没有设置主键或索引,则修复报错,能够手动进行修复。
三、监测是基于块进行的,若是mysql表的数据没有进行分块,那么当表过大时,会形成监测一段时间后发现没有问题会跳过改表。
四、当数据库两个数据不一致,可是checksum检测一致时,没有比对出不一致。
主库和从库帐号一致,密码不一致发现了这种问题。
缘由:对于修改密码的操做,chencksum的值并无发生变化。
最好全部主库从库都安装
一、安装依赖
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
二、下载安装包
一、官网下载
三、安装
tar xzvf percona-toolkit-3.0.4_x86_64.tar.gz
cd percona-toolkit-3.0.4
perl Makefile.PL --安装到非默认路径PREFIX=${HOME}
make
make test
make install
一、建立监测帐号
grant all on *.* to 'zxfly_check'@'192.168.22.% ' identified by 'zxfly';
flush privileges;
二、监控用的表为:percona.checksum该表会自动建立。
监测:
#指定库名
pt-table-checksum --databases zxfly -u'zxfly' -p'zxfly' -hMasterIP -P3306 2>/logs/pt_error.log 1>/logs/pt_info.log
#不指定库,监测全部数据库(除information_schema、percona、performance_schema库)
pt-table-checksum --quiet -u'zxfly' -p'zxfly' -hMasterIP -P3306 2>/logs/pt_error.log 1>/logs/pt_info.log
pt-table-checksum --replicate-check-only -u'zxfly' -p'zxfly' -hMasterIP -P3306
打印修复sql:指定库表
pt-table-sync --databases=dataname --tables=table1,table2 h=MasterIP,u=zxfly,p=zxfly h=SlaveIP,u=zxfly,p=zxfly --charset=utf8 --print
修复:
pt-table-sync --databases=dataname --tables=table1,table2 h=MasterIP,u=zxfly,p=zxfly h=SlaveIP,u=zxfly,p=zxfly --charset=utf8 --exec
一、pt-table-checksum
参数 | 参数说明 | 备注 |
---|---|---|
--[no]check-replication-filters | 不检查复制过滤器,建议启用。后面能够用--databases来指定须要检查的数据库。 | 当前环境不须要该参数,默认开启 |
--no-check-binlog-format | 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。 | 默认是监测,使用默认值,若是添加该参数可能致使diff不出来 |
--replicate-check-only | 只显示不一样步的信息。 | 开启这个,能够减小输出而且显示不一致的从库主机名 不过这个只是显示已经检测过的不一致信息,并不能显示当前的。 |
--replicate= | 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。不须要指定 | 默认会建立percona库下checksum表 |
-h -u -p -P | masterIP 监测帐号 密码 端口 | |
--databases= | 指定须要被检查的数据库,多个则用逗号隔开。 | |
--tables= | 指定须要被检查的表,多个用逗号隔开 | |
--recursion-method | 指定监测从库的模式,默认使用processlist,也能够指定dsn | 多个从库能够这样指定。--recursion-method=dsn=h=host,D=pt,t=dsns D 库名 t 表名 |
--quiet | 安静模式,最小化打印,纸打印错误行 | 与--replicate-check-only相似,但不显示从库信息 |
dsn库表结构及用法为:
二、pt-table-sync
参数 | 参数说明 | 备注 |
---|---|---|
--replicate= | 指定经过pt-table-checksum获得的表 | 默认会建立percona库下checksum表时不须要指定 |
--databases= | 指定执行同步的数据库 | 在只修复指定的库时使用 |
--tables= | 指定须要被修复的表,多个用逗号隔开 | |
--sync-to-master | 指定一个DSN,即从的IP | 会经过show processlist或show slave status 去自动的找主。报错找不到主库时使用 |
h= u= p= | 服务器地址,帐号,密码 | 命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。 |
打印修复的sql语句 | 只打印不执行。 | |
--exec 或 --execute | 执行修复 | |
--algorithms=c | 指定修复算法 | default Chunk,Nibble,GroupBy,Stream 在报错算法问题的时候须要指定算法 |
--charset= | 指定默认字符集 | 若是数据中包含中文不指定次字符集的话修复不成功 |
三、输出信息解释
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不一样的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :因为错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
一、监测报错(找不到从库,使用--recursion-method指定模式)
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
二、binlog模式问题(因为指定为row行复制形成 使用--no-check-binlog-format跳过监测,不过这样有可能监测不出来主从不一致的信息,row行模式对于主历来说不须要进行主从监测)
Replica centos-1 has binlog_format ROW which could cause pt-table-checksum to break replication. Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation. If you understand the risks, specify --no-check-binlog-format to disable this check.
三、没有索引或主键致使的,在数据较少的时候(低于1000行,没有测试出该信息,超过1000行会报错)
Cannot checksum table test.t: There is no good index and the table is oversized. at ./pt-table-checksum line 6370.
四、等待信息,已检测的百分比,这是由于设置了主键可是没有索引致使没有分块且表过大形成。
Checksumming database.table: 27% 01:17 remain
pt-table-checksum监测数据库结果:
数据大小 | 监测花费时间 | 监测报错的表 | 缘由 |
---|---|---|---|
93G | 30m28.523s | 4个 |
#字符集bug(工具自带,没法解决) 正式平台这些表都没有 |
1个 | 未监测到(中文表名监测不到) 正式平台无此表 |
||
1个 | 没有主键或者索引(数据条数:132835) |
在使用pt-table-checksum进行检测后,发现主从不一致的状况后可使用pt-table-sync工具进行修复操做。
其原理为:基于pt-table-checksum监测的结果进行检查并生成修复语句去修复从库中的数据。
遇到的报错:
一、修复时候没有任何提示,可是修复报错。使用–print打印修复语句发现又乱码。
处理方法:查看表的字符集,经过--charset=命令指定默认字符集
二、报错:Failed to prepare TableSyncChunk plugin: Cannot chunk table `zxfly_zxfly1`.`mongo_task_data` using the character column guid, most likely because all values start with the same character. This table must be synced separately by specifying a list of --algorithms without the Chunk algorithm at /usr/local/bin/pt-table-sync line 4088. while doing table on 192.168.0.177
缘由是在默认的算法中,要保证主键字段的数据前一位有不同字符出现,而该表的主键数据第一个字符是同样的。
解决办法:
使用--algorithms=参数指定算法,固然这种应该最好分库分表进行恢复。
六、修复报错(缘由:没有惟一索引或主键致使的,1000之内的,1000行以上没有索引或主键在监测时就会跳过。)
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.