Percona Toolkit 神器全攻略(复制类)

科技中介服务机构如何利用数智工具提升服务效率?.docx 科技中介服务机构如何利用数智工具提升服务效率? 立即下载

Percona Toolkit 神器全攻略(复制类)

file

Percona Toolkit 神器全攻略系列共八篇,前文回顾:

前文回顾
Percona Toolkit 神器全攻略
Percona Toolkit 神器全攻略(实用类)
Percona Toolkit 神器全攻略(配置类)
Percona Toolkit 神器全攻略(监控类)
Percona Toolkit 神器全攻略(系统类)
Percona Toolkit 神器全攻略(开发类)

全文约定:$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中,依据此约定进行理解与操作

复制类

在Percona Toolkit中复制类共有以下工具

  • pt-heartbeat:监控MySQL/GreatSQL复制延迟
  • pt-slave-delay:设定从落后主的时间
  • pt-slave-find:查找和打印所有MySQL/GreatSQL复制层级关系
  • pt-slave-restart:监控Salve错误,并尝试重启Salve
  • pt-table-checksum:校验主从复制一致性
  • pt-table-sync:高效同步表数据
  • pt-galera-log-explainer:对多个 Galera 日志进行过滤、聚合和汇总

pt-heartbeat

概要

用来监测主从延迟的情况,此工具的设计为向 Master 中插入一条带有当前时间(GreatSQL中的now()函数)的记录到心跳表中,然后,该记录会复制到 Slave 中。Slave 根据当前的系统时间戳(Perl中的time函数)减去heartbeat表中的记录值来判断主从的延迟情况。

用法

  • pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop

选项

至少指定 --stop 、 --update 、 --monitor 或 --check 之一

互斥关系

--update 、 --monitor 和 --check 是互斥的

--daemonize 和 --check 是互斥的

该工具所有选项如下

参数含义
--ask-pass连接MySQL/GreatSQL提示输入密码
--charset默认字符集
--check检查一次从机延迟并退出
--check-read-only检查服务器是否启用了read_only
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--create-table如果heartbeat表--table不存在,则创建它
--create-table-engine设置用于heartbeat表的引擎
--daemonize后台运行
--database用于连接的数据库
--dbi-driver指定连接的驱动程序
--defaults-file只从给定文件中读取 GreatSQL 选项
--file将最新的--monitor输出打印到此文件
--frames平均值的时间范围,默认为1m,5m,15m
--help显示帮助
--host连接到主机
--[no]insert-heartbeat-row如果--table中不存在心跳行,则插入该行
--interval更新或检查heartbeat表的频率,默认1秒
--log后台运行时将所有输出打印到此文件
--master-server-id根据此主服务器 ID 计算--monitor或--check的延迟
--monitor连续监控从机延迟
--fail-successive-errors如果指定,将在给定数量的连续 DBI 错误(无法连接到服务器或发出查询)后失败
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--print-master-server-id打印自动检测到的或给定的--master-server-id
--read-only-interval当指定--check-read-only 时,发现服务器处于只读状态时休眠的时间间隔
--recurse在--check模式下递归检查从站到此深度
--recursion-method用于查找从站的首选递归方法
--replace使用REPLACE而不是UPDATE进行 –update
--run-time运行时间
--sentinel如果该文件存在则退出
--slave-user设置用于连接从站的用户
--slave-password设置用于连接从站的密码
--set-vars在这个以逗号分隔的variable=value对列表中设置 MySQL/GreatSQL 变量
--skew延迟检查多久,默认值:0.5
--socket用于连接的套接字文件
--stop通过创建哨兵文件来停止运行实例
--table用于心跳的表
--update更新主机的心跳
--user登录的用户
--utc忽略系统时区并仅使用 UTC
--version显示版本
--[no]version-check版本检查

最佳实践

为演示该工具,在主机上部署单机多实例并搭建一主一从模式,环境如下:

数据库IP端口号角色
GreatSQL-8.0.32-25192.168.6.553306Master
GreatSQL-8.0.32-25192.168.6.553307Slave

首先需要在Master上添加表

$ pt-heartbeat --user=root --ask-pass -S /data/GreatSQL/mysql.sock -D test_db --master-server-id=103306 --create-table --update

-D:选择一个数据库中有的库

--master-server-id:设置主机的server_id

--create-table:用于创建表

--update:会每秒更新一次heartbeat表的记录

现在进入Master上可以看到在test_db库下有一张heartbeat表,这里有一条记录的数据。在Slave节点上也应该出现这张表

greatsql> SELECT * FROM test_db.heartbeat;
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
| ts                         | server_id | file          | position | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
| 2024-04-22T15:57:44.001900 |    103306 | binlog.000032 |    41464 | NULL                  |                NULL |
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
1 row in set (0.00 sec)

接下来我们更新主库上这张表,并让他在后台运行

$ pt-heartbeat --user=root --ask-pass -S /data/GreatSQL/mysql.sock -D test_db --master-server-id=103306 --update --daemonize

进入从机,开始监控主从延迟

$ pt-heartbeat --user=root --ask-pass -S /data/GreatSQL02/mysql.sock -D test_db --master-server-id=103306 --monitor --print-master-server-id
Enter password:
0.00s [  0.00s,  0.00s,  0.00s ] 103306
0.00s [  0.00s,  0.00s,  0.00s ] 103306
0.00s [  0.00s,  0.00s,  0.00s ] 103306
0.00s [  0.00s,  0.00s,  0.00s ] 103306

输出的结果为:实时延迟,[1分钟延迟,5分钟延迟,15分钟延迟] 主节点的Server_id

  1. 当然也可以使用--interval参数控制主库上的更新间隔,默认是1秒

  2. 如果使用守护进程的方式,要关闭的话可以采用pt-heartbeat --stop

  3. 单次查看Slave库上的延迟情况可以把monitor换成--check

pt-slave-delay

概要

可能在日常工作中会存在误删除数据的可能,所以可以用该工具设置Slave服务器落后于Master服务器,达到构建一个延迟从库

原理

通过启动和停止复制SQL线程来设置Slave库落后于Master库的指定时间

用法

  • pt-slave-delay [OPTIONS] SLAVE_DSN [MASTER_DSN]

选项

该工具所有选项如下

参数含义
--ask-pass连接时提示输入密码
--charset默认字符集
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--[no]continue退出后继续正常复制
--daemonize后台运行
--database用于连接的数据库
--defaults-file只从给定文件中读取MySQL/GreatSQL选项
--delay从库延迟于主库的时间,默认1小时
--help显示帮助
--host连接到主机的IP地址
--interval启动或停止的频率。默认1分钟
--log后台运行时日志输出的位置
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--quiet不要打印有关操作的信息性消息
--run-time运行时间,默认是一直运行
--set-vars在这个以逗号分隔的variable=value对列表中设置 MySQL/GreatSQL 变量
--socket用于连接的套接字文件
--use-master从Master库获取二进制日志位置,而不从Slave库获取
--user用于登录的用户
--version显示版本
--[no]version-check版本检查

最佳实践

此工具只需在Slave库运行即可,无需在Master节点运行

$ pt-slave-delay --user=root --ask-pass -S /data/GreatSQL02/mysql.sock --delay=1m --interval=15s --run-time=10m

将主从延迟设定为1分钟,每15秒进行一次检测,持续运行10分钟

输出结果如下

2024-04-23T09:29:00 slave running 0 seconds behind
2024-04-23T09:29:00 STOP SLAVE until 2024-04-23T09:30:00 at master position binlog.000032/500611
2024-04-23T09:29:15 slave stopped at master position binlog.000032/500611
2024-04-23T09:29:30 slave stopped at master position binlog.000032/500611
......中间省略
2024-04-23T09:30:30 Setting slave to run normally

如果在运行的过程中进入Slave节点查看SHOW SLAVE STATUS\G

Slave_IO_Running: Yes
Slave_SQL_Running: No

可以看到SQL线程已关闭,证明此工具精准控制SQL线程的启停,有效实现主从延迟

也可使用CHANGE REPLICATION SOURCE TO SOURCE_DELAY=3600;该命令来控制主从延迟的时间

pt-slave-find

概要

查找和打印主从架构中主库的从库个数,类似于拓扑图的意思

用法

  • pt-slave-find [OPTIONS] [DSN]

选项

参数含义
--ask-pass连接MySQL/GreatSQL提示输入密码
--charset默认字符集
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--databases仅检查此逗号分隔的数据库列表
--defaults-file只从给定文件中读取 MySQL/GreatSQL 选项
--help显示帮助
--host连接到主机
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--recurse层次结构中要递归的级别数,默认为无限
--recursion-method用于查找从库的首选递归方法,有三种 (processlist、hosts、none)
--report-format设置打印有关从库的哪些信息
--resolve-address将 IP 地址解析为主机名
--slave-user设置用于连接从库的用户
--slave-password设置用于连接从库的密码
--set-vars以逗号分隔的variable=value对列表中设置 MySQL/GreatSQL 变量
--socket用于连接的套接字文件
--user登录的用户
--version显示版本

最佳实践

连接到主从集群的Master节点,查看该集群的复制层次数

$ pt-slave-find h=192.168.6.55,u=root --ask-pass
192.168.6.55
Version         8.0.32-25
Server ID       103306
Uptime          20:38:01 (started 2024-04-22T14:09:23)
Replication     Is not a slave, has 1 slaves connected, is not read_only
Filters
Binary logging  ROW
Slave status
Slave mode      STRICT
Auto-increment  increment 1, offset 1
InnoDB version  8.0.32-8.0.32
+- 192.168.6.55:3307
   Version         8.0.32-25
   Server ID       103307
   Uptime          20:35:59 (started 2024-04-22T14:12:02)
   Replication     Is a slave, has 0 slaves connected, is not read_only
   Filters
   Binary logging  ROW
   Slave status    0 seconds behind, running, no errors
   Slave mode      STRICT
   Auto-increment  increment 1, o
   InnoDB version  8.0.32-8.0.32

可以看到该主节点下只有一个从节点,且输出也显示了主节点和总结点的信息

pt-slave-restart

概要

监视一个或多个 GreatSQL 复制从库是否有错误,并在复制停止时尝试重新启动复制

用法

  • pt-slave-restart [OPTIONS] [DSN]

选项

参数含义
--always永不停止Slave线程
--ask-pass连接MySQL/GreatSQL提示输入密码
--charset默认字符集
--[no]check-relay-log在检查从库错误之前检查最后一个中继日志文件和位置
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--daemonize后台运行
--databases数据库列表
--defaults-file只从给定文件中读取 MySQL/GreatSQL 选项
--error-length要打印的错误消息的最大长度
--error-numbers指定跳过哪些错误,可用,进行分隔
--error-text根据错误的信息进行匹配跳过
--help显示帮助
--host连接到主机
--log后台运行时,将输出打印到此文件
--max-sleep再次轮询从库之前休眠的最长时间
--min-sleep再次轮询从库之前休眠眠的最短时间
--monitor是否监控从机(默认)
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--quiet抑制正常输出(禁用--verbose)
--recurse在主库执行,监控从库,默认深度 0 表示“仅监视指定的从库”
--recursion-method用于查找从库的首选递归方法
--run-time运行时间
--sentinel如果该文件存在则退出,默认值:/tmp/pt-slave-restart-sentinel
--slave-user设置用于连接从库的用户
--slave-password设置用于连接从库的密码
--set-vars以逗号分隔的variable=value 对列表中设置 MySQL/GreatSQL 变量
--skip-count重新启动从库时要跳过的语句数,默认1
--master-uuid使用 GTID 时,应创建一个空事务以便跳过它
--sleep检查从库之间的初始睡眠秒数
--socket用于连接的套接字文件
--stop停止运行实例
--until-master运行到指定的master_log_pos,file位置后停止
--until-relay运行到指定的中继日志文件和位置后停止
--user用于登录的用户
--verbose向输出添加更多信息
--version显示版本
--[no]version-check版本检查

最佳实践

在主库创建一张t1表,并插入5条数据

greatsql> CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL);
greatsql> INSERT INTO t1 (name) VALUES ('张三');  
greatsql> INSERT INTO t1 (name) VALUES ('李四');  
greatsql> INSERT INTO t1 (name) VALUES ('王五');  
greatsql> INSERT INTO t1 (name) VALUES ('赵六');  
greatsql> INSERT INTO t1 (name) VALUES ('孙七');

主库查看数据

greatsql> SELECT * FROM test_db.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 王五   |
|  4 | 赵六   |
|  5 | 孙七   |
+----+--------+
5 rows in set (0.00 sec)

从库查看数据

greatsql> SELECT * FROM test_db.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 王五   |
|  4 | 赵六   |
|  5 | 孙七   |
+----+--------+
5 rows in set (0.00 sec)
主动处理错误

在从库执行pt-slave-restart工具监控从库

$ pt-slave-restart h=192.168.6.55,P=3307,u=root --ask-pass

注意,若使用该工具,参数slave_parallel_workers必须设置为0,否则会报错”Cannot skip transactions properly because GTID is enabled and slave_parallel_workers > 0. See 'GLOBAL TRANSACTION IDS' in the tool's documentation.“ 如果不关闭多线程复制,工具会分不清到底哪个线程复制出了问题

此时已经开启了从库监控,我们在主库上人为造成一个主从复制错误

greatsql> SET sql_log_bin=0;
greatsql> INSERT INTO t1 VALUES(6,'周八');
greatsql> SET sql_log_bin=1;
greatsql> DELETE FROM t1 WHERE id=6;

此时工具检测到了主从复制异常,并且马上修复了该错误,使主从复制正常运行

$ pt-slave-restart h=192.168.6.55,P=3307,u=root --ask-pass
# 时间戳 + 从库端信息 + relay log + relat log 位置 + 主从复制报错码
2024-04-24T10:33:54 P=3307,h=192.168.6.55,u=root myarch-relay-bin.000003   36702 1032
手动处理错误

如果一直运行工具,检测到错误会直接修复。如果是已经有错误了要如何使用该工具修复?还是同样的错误,再次主库手动执行

greatsql> SET sql_log_bin=0;
greatsql> INSERT INTO t1 VALUES(6,'周八');
greatsql> SET sql_log_bin=1;
greatsql> DELETE FROM t1 WHERE id=6;

此时查看从库报错

greatsql> SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Error: Could not execute Delete_rows event on table test_db.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binlog.000032, end_log_pos 504208

记住报错的错误码1032,接着在从库机器上使用该工具

$ pt-slave-restart h=192.168.6.55,P=3307,u=root --ask-pass --error-numbers=1032

使用--error-numbers=指定错误码

此时就会输出对应的信息

$ pt-slave-restart h=192.168.6.55,P=3307,u=root --ask-pass --error-numbers=1032

2024-04-24T10:49:26 P=3307,h=192.168.6.55,u=root myarch-relay-bin.000003     37046 1032

接着在从库上查看主从状态,就可以看到主从复制已经是正常的了

greatsql> SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_SQL_Error:

pt-table-checksum

这款数据校验与修复工具虽广受欢迎,却存在不容忽视的短板:不支持MySQL/GreatSQL的MGR场景、国内普遍的上云下云业务,以及MySQL/GreatSQL与Oracle间的异构数据库等多元化场景。为了攻克这些难题,GreatSQL推出了名为gt-checksum的校验&修复工具,旨在全面满足各类业务需求!

概要

检查 MySQL/GreatSQL 的主从数据是否一致

用法

  • pt-table-checksum [OPTIONS] [DSN]

选项

参数含义
--ask-pass连接MySQL/GreatSQL提示输入密码
--channel指定复制通道
--[no]check-binlog-format检查所有服务器上的binlog_format系统参数是否相同
--binary-index修改--create-replicate-table的行为,使复制表的上下边界列以 BLOB 数据类型创建
--check-interval指定因选项--max-lag检查之间休眠时间
--[no]check-plan检查查询执行计划的安全性
--[no]check-replication-filters指定检测主从复制是否有设置复制过滤器
--check-slave-lag指定复制延迟大于选项--max-lag指定的值之后暂停检查校验操作
--[no]check-slave-tables检查从库上的表是否存在并具有所有校验和--columns
--chunk-index指定使用哪个索引对表进行chunk分块操作
--chunk-index-columns指定使用选项--chunk-index的索引使用最左前缀几个索引字段,只适用于复合索引
--chunk-size为每个校验和查询选择的行数,允许的后缀单位为k、M、G
--chunk-size-limit指定chunk的行数最多可以超过选项--chunk-size指定的行数的多少倍
--chunk-time动态调整每个chunk的大小使相应的表行数都在指定的时间内完成校验操作
--columns指定只需要校验的字段,如有多个则用逗号隔开
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--[no]create-replicate-table创建选项--replicate指定的数据库和表
--databases仅对逗号分隔的数据库列表进行校验
--databases-regex仅名称与此正则表达式匹配和数据库进行校验
--defaults-file只从给定文件中读取 MySQL/GreatSQL 选项
--disable-qrt-plugin如果启用了 QRT(查询响应时间)插件,请将其禁用
--[no]empty-replicate-table在对表进行校验和之前,删除每个表之前的校验和
--engines仅校验使用这些存储引擎的表
--explain显示但不执行校验和查询(禁用--[no]empty-replicate-table)
--fail-on-stopped-replication若复制停止,则会失败并显示错误(退出状态 128),而不是等到复制重新启动
--float-precisionFLOAT 和 DOUBLE 数字到字符串转换的精度
--function指定校验操作使用的哈希函数。可选函数有SHA1、MD5等
--help显示帮助
--host连接到主机
--ignore-columns指定需要忽略校验的字段
--ignore-databases指定需要忽略校验的数据库
--ignore-databases-regex指定采用正则表达式匹配忽略校验的数据库
--ignore-engines指定需要忽略校验的存储引擎列表
--ignore-tables指定需要忽略校验的表
--ignore-tables-regex指定采用正则表达式匹配忽略校验的表
--max-lag指定允许主从复制延迟时长的最大值,单位秒
--max-load在每个块之后检查`SHOW GLOBAL STATUS,如果任何状态变量高于阈值则暂停
--password连接时使用的密码
--pause-file当此参数指定的文件存在时,执行将暂停
--pid创建给定的 PID 文件
--plugin定义pt_table_checksum_plugin类的 Perl 模块文件
--port用于连接的端口号
--progress将进度报告打印到 STDERR
--quiet仅打印最重要的信息(禁用 --progress )
--recurse指定搜寻从库的层级,默认无限
--recursion-method指定获取从库的方式
--replicate将校验和结果写入此表
--[no]replicate-check指定在校验完每张表后检查主从当前表是否出现不一致
--replicate-check-only检查副本的一致性,而无需执行校验和查询
--replicate-check-retries指定当校验出主从数据不一致重试校验的次数
--replicate-database指定工具在执行校验操作时在哪个数据库下进行
--resume指定从最后完成校验的chunk开始恢复校验
--retries指定当出现非严重性错误时重复校验一个块的次数
--run-time指定校验操作运行的时间
--separator用于 CONCAT_WS() 的分隔符
--skip-check-slave-lag指定DSN连接从库时跳过主从延迟检查,可以指定多个从库检查
--slave-user设置用于连接从库的用户
--slave-password设置用于连接从库的密码
--set-vars运行检查时指定参数值,如有多个用逗号分隔
--socket用于连接的套接字文件
--slave-skip-tolerance当主表被标记为仅在一个块中进行校验和,但从表超过了可接受的最大大小时,该表将被跳过
--tables仅对这个以逗号分隔的表列表进行校验和
--tables-regex仅对名称与此 Perl 正则表达式匹配的表进行校验
--trim将 TRIM() 添加到 VARCHAR 列(在比较 4.1 和 >= 5.0 时有帮助)
--truncate-replicate-table在开始校验和之前截断复制表
--user登录的用户
--version显示版本
--[no]version-check版本检查
--where仅执行与此 WHERE 子句匹配的行

最佳实践

校验主从数据是否一致(主从端口一致)

主从机器端口一致时,可以使用此方法

检测差异,并写入差异到checksums表中,主库上执行如下命令

pt-table-checksum --create-replicate-table --replicate=test_db.checksums --nocheck-replication-filters --nocheck-binlog-format --recursion-method=processlist --databases=test_db --user=root --ask-pass --host=192.168.6.55 --port=3306
  • --nocheck-replication-filters:不检查复制过滤器,建议启用

  • --no-check-binlog-format:不检查复制的binlog模式,要是binlog模式是ROW,则会报错

结果如下

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
04-24T15:57:13      0      0        9          0       1       0   0.008 test_db.test_t1
  • TS:完成检查的时间
  • ERRORS:检查时候发生错误和警告的数量
  • DIFFS:0表示一致,非0表示不一致
  • DIFF_ROWS:主库和从库差异的数据行数
  • CHUNKS:被划分到表中的块的数目
  • SKIPPED:由于错误或警告或过大,则跳过块的数目
  • TIME:执行的时间
  • TABLE:被检查的表名

同时结果也保存到了表中

greatsql> select * from checksums;
+---------+--------------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db      | tbl                | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+---------+--------------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| test_db | t1                 |     1 |   0.001848 | NULL        | NULL           | NULL           | 6d60e23f |        5 | 6d60e23f   |          5 | 2024-04-24 16:29:30 |
+---------+--------------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
1 rows in set (0.01 sec)
校验主从数据是否一致(主从端口不一致)

主从机器端口不一致时,可以使用此方法

在主库创建一张DSN表

greatsql> CREATE TABLE test_db.dsns ( id int(11) NOT NULL AUTO_INCREMENT, parent_id int(11) DEFAULT NULL,dsn varchar(255) NOT NULL, PRIMARY KEY (id) );

greatsql> INSERT INTO test_db.dsns(dsn) VALUES ('h=192.168.6.55,P=3307,u=root,p=');

使用工具校验,注意此时--recursion-method就要改为DSN模式

$ pt-table-checksum --replicate=test_db.checksums --nocheck-replication-filters --no-check-binlog-format --host=192.168.6.55 --port=3306 --user=root --ask-pass --databases=test_db --recursion-method dsn=h=192.168.6.55,D=test_db,t=dsns

结果如下

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
04-24T17:04:42      0      0        1          0       1       0   0.035 test_db.dsns
04-24T17:04:42      0      0        1          0       1       0   0.022 test_db.heartbeat
04-24T17:04:42      0      0        0          0       1       0   0.036 test_db.my_table
04-24T17:04:42      0      2    10000       9823       4       0   0.097 test_db.ptosc
04-24T17:04:42      0      0        5          0       1       0   0.021 test_db.t1
04-24T17:04:42      0      1       15         15       1       0   0.026 test_db.tc10011_ta4
04-24T17:04:42      0      1        9          9       1       0   0.078 test_db.test_t1
04-24T17:04:42      0      0        0          0       1       0   0.066 test_db.test_table

可以看到有三张表被检测出来不一致。如果连表都不存在则会报错Table 'XXXX' doesn't exist

出现了主从数据不一致,就要使用pt-table-sync工具进行修复

pt-table-sync

概要

高效同步 MySQL/GreatSQL 表数据

用法

  • pt-table-sync [OPTIONS] DSN [DSN]

选项

至少指定 --print 、 --execute 或 --dry-run 之一。--where 和 --replicate 是互斥的

参数含义
--algorithms比较表时使用的算法(按优先顺序),默认值:Chunk、Nibble、GroupBy、Stream
--ask-pass连接 MySQL/GreatSQL 提示输入密码
--bidirectional启用第一个和后续主机之间的双向同步
--[no]bin-log指定同步操作记录二进制日志,相当于执行SET SQL_LOG_BIN=1
--buffer-in-mysql指定 MySQL/GreatSQL 在其内存中缓冲查询
--[no]buffer-to-client比较时从 MySQL/GreatSQL 中逐一获取行
--channel指定复制通道
--charset默认字符集
--[no]check-child-tables检查--execute是否会对子表产生不利影响
--[no]check-master指定当选项--sync-to-master时,尝试验证工具连接到的主库是否是真正的主库
--[no]check-slave检查目标服务器是否为从服务器
--[no]check-triggers检查目标表上是否未定义触发器
--chunk-column指定根据表中字段对表进行chunk操作
--chunk-index指定使用哪个索引对表进行chunk分块操作
--chunk-size每个块的行数或数据大小
--columns比较以逗号分隔的列列表
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--conflict-column当--bidirectional同步期间发生行冲突时比较此列
--conflict-comparison选择具有此属性的--conflict-column作为源
--conflict-error如何报告无法解决的冲突和冲突错误,默认为:warn(警告)
--conflict-threshold一个--conflict-column必须超过另一个的数量
--conflict-value将此值用于某些--conflict-comparison
--databases仅同步的数据库列表,如有多个用逗号分隔
--defaults-file只从给定文件中读取 GreatSQL 选项
--dry-run分析、决定要使用的同步算法、打印并退出
--engines仅同步的存储引擎列,如有多个用逗号分隔
--execute执行查询以使表具有相同的数据
--explain-hosts打印连接信息并退出
--float-precisionFLOAT 和 DOUBLE 数字到字符串转换的精度
--[no]foreign-key-checks启用外键检查 (SET FOREIGN_KEY_CHECKS=1)
--function选择使用哪个哈希函数作为校验和,默认为 CRC32
--help显示帮助
--[no]hex-blobHEX() BLOB、TEXT和 BINARY列
--host连接到主机
--ignore-columns要忽略的列,如有多个用逗号分隔
--ignore-databases要忽略的数据库,如有多个用逗号分隔
--ignore-engines要忽略的引擎,如有多个用逗号分隔
--ignore-tables要忽略的表,如有多个用逗号分隔
--ignore-tables-regex要忽略的表正则表达式,如有多个用逗号分隔
--[no]index-hint将 FORCE/USE INDEX 提示添加到块和行查询中
--lock锁定表:0=永不锁表,1=每个同步周期锁表,2=表操作时锁表,3=每个DSN连接的服务器锁表
--lock-and-rename指定锁定源表和目标表,执行同步操作,然后进行表名交换
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--print打印将解决差异的查询
--recursion-method用于查找从站的首选递归方法
--replace将所有INSERT和UPDATE语句写为REPLACE
--replicate同步此表中列为不同的表
--slave-user设置用于连接从库的用户
--slave-password设置用于连接从库的密码
--set-vars以逗号分隔的variable=value对列表中设置 MySQL/GreatSQL 变量
--socket用于连接的套接字文件
--sync-to-master指定将DSN连接信息确认为从库,并同步信息到主库
--tables要同步的表,如有多个用逗号分隔
--timeout-ok指定当选项--wait导致工具执行失败时跳过失败继续执行
--[no]transaction指定工具操作使用事务代替LOCK TABLES语句进行锁表
--trimBIT_XOR 和 ACCUM 模式下的 TRIM() VARCHAR 列
--[no]unique-checks启用唯一键检查 ( SET UNIQUE_CHECKS=1 )
--user用于连接的用户
--verbose打印同步操作的结果
--version显示版本
--[no]version-check版本检查
--wait指定存在主从复制延迟时从库可以等待多长时间追上主库,如果超过时间依然存在延迟就中止退出
--whereWHERE 子句用于限制同步到表的一部分
--[no]zero-chunk为具有零或零等值的行添加块

最佳实践

同步单个表

注意,同步时候两台机器不能是主从关系。第一DSN为源库,第二个DSN为被同步库

将192.168.6.55机器上的test_db.test_t1表同步至192.168.6.129机器

$ pt-table-sync --execute h=192.168.6.55,u=root,p=,P=3306,D=test_db,t=test_t1 h=192.168.6.129,p=test,u=test,P=3306
同步单个库

注意,同步时候两台机器不能是主从关系。第一DSN为源库,第二个DSN为被同步库

$ pt-table-sync --execute h=192.168.6.55,u=root,p=,P=3306 h=192.168.6.129,u=test,p=test --databases test_db

此时如果有表不存在,则会报错

Table test_db.checksums does not exist on P=3306,h=192.168.6.129,p=...,u=test  while doing test_db.checksums on 192.168.6.129

此时只需手动建表即可

同步所有库表

注意,同步时候两台机器不能是主从关系。第一DSN为源库,第二个DSN为被同步库

$ pt-table-sync --execute h=192.168.6.55,u=root,p=,P=3306 h=192.168.6.129,u=test,p=test
主从复制同步从库

同步test_db.checksums中记录的数据不一致的表。该表中的数据是由pt-table-checksum工具检测出来的

$ pt-table-sync --execute --replicate 'test_db.checksums' --sync-to-master h=192.168.6.55,P=3307,u=root,p=

本文完 :) 下章节将介绍Percona Toolkit 神器全攻略(性能类)


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

支付对账系统|Spring Cloud Alibaba微服务架构 分库分表+双边账比对引擎 一套基于 Spring Cloud Alibaba 的微服务支付对账系统完整工程,解决支付业务中"本地账与渠道账不一致"这一核心问题。技术栈为 JDK 8 + Spring Boot 2.7 + Spring Cloud 2021 + Nacos + OpenFeign + MyBatis-Plus + ShardingSphere 5.3 + Redisson + RocketMQ,共 8 个 Maven 模块、104 个 Java 文件、约 8800 行代码,含建表脚本与中间件编排文件。 工程按商户中心、渠道中心、结算中心、对账中心、调度中心、网关分层。核心实现有四块:一是双边账比对引擎,支持渠道单号优先、商户订单号回退的匹配主键,分位容差抹平,自动判定本地多单、渠道多单、金额不一致、状态不一致四类差异;二是差异处置策略,覆盖查单补偿、本地账补记、人工工单与挂账结转下期,并内置防资损约束——渠道查单接口失败时不判定为"渠道无此单",避免把超时误判成掉单而错误关闭已收款订单;三是分库分表落地,4 库 × 32 表,自定义按账期落表的分片算法,跨账期范围查询可精确裁剪表;四是渠道账单适配器,处理 GBK 编码、表头按列名定位、CSV 引号切分与金额元转分。网关侧实现了商户 HMAC-SHA256 签名验签加时间戳防重放、运营台 JWT 加登出黑名单双身份鉴权。另有雪花 ID、账期 T+N 计算、幂等切面、统一错误码与异常体系、对账任务状态机配分布式锁与乐观锁双保险。 立即下载

相关推荐

科技中介服务机构如何实现服务流程的标准化与高效化?.docx

科技中介服务机构如何实现服务流程的标准化与高效化?

深度解析Percona Toolkit工具集

介绍 Percona Toolkit是一套专业的MySQL和MariaDB数据库管理工具,涵盖了从性能优化到数据同步和备份恢复的多个方面。本文将深入探讨Percona Toolkit工具集的核心功能和使用场景,帮助你更好地理解和利用这些强大的数据库工具。主要功能和用途性能优化和分析:l使用pt-query-digest分析慢查询,优化数据库性能。l使用pt-index-usage检查和...

qq_34692500的博客 910

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)内容概要:本文档标题为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际上内容并未围绕Plecs或全桥LLC谐振变换器展开详细论述,而是罗列了大量基于Matlab/Simulink和Python的科研仿真项目标题及相关技术方向,涵盖电力系统、无人机控制、微电网优化、路径规划、状态估计、信号处理、电动汽车调度、电力电子变换器等多个领域。其中包括多种优化算法(如粒子群、遗传算法、NSGA-II)、控制策略(如PID、MPC、滑模控制)、仿真建模(如LLC谐振变换器、DAB变换器、PWM整流器)以及具体应用场景的研究实现。尽管提及“隔离型全桥LLC谐振变换器建模及参数设计资料”,但全文缺乏对该主题的具体描述、模型细节或仿真分析,仅作为条目之一出现。因此,该文档实质是一份科研项目资源清单或代码合集目录,而非针对某一主题的深入文章。; 适合人群:具备一定Matlab/Simulink或Python编程基础,从事电气工程、自动化、控制科学、电力电子、新能源系统等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的课题参考与复现资源,涵盖优化调度、控制系统设计、电力电子仿真等方向;②辅助完成硕士/博士论文、期刊论文复现、课程设计或项目开发,提升研究效率与创新性;③通过已有模型和代码快速搭建仿真平台,聚焦算法改进与性能优化。; 阅读建议:此文档应作为科研资源索引使用,读者可根据自身研究方向筛选相关条目,结合配套代码与参考资料进行深入学习与实践。对于希望研究全桥LLC谐振变换器的用户,需注意本文档未提供完整内容,建议查找标注的“仿真+设计报告+计算书”等附件资源以获取详细信息。

mysql主从 mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。pt-table-checksum 默认情况下可以应对绝大部分场景,官方说,即使上千个库、上万亿的行,它依然可以很好的工作,这源自于设计很简单,一次检查一个表,不需要太多的内存和多余的操作;可以指定1个,如:--frames=1s,多个用逗号隔开。

分享技术架构、运维、程序开发经验 800

高校技术转移办公室在推动成果转化过程中,如何高效完成技术成果的信息整合与价值挖掘.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员,如何精准挖掘并分析企业的技术需求?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Percona Server数据导入导出工具总结

经历了一些项目,在使用mysql数据库管理工具的时候,遇到的一些问题做了一些总结: 1.不用Navicat工具针对MySQL做数据导入导出 请使用heidisql 10.3.0完成,具体步骤如下: ①首先,选择你要导出的数据库,点击鼠标右键:如下图所示 ②这里是进行对你要导出的某个数据库的内容进行选择导出 ③对于操作过程中操作中各个选项的含...

astra_zhao的专栏 581

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文档是一套关于隔离型全桥LLC谐振变换器的综合性技术资料,系统涵盖了拓扑建模、参数设计、闭环控制策略及仿真验证等关键环节。资料整合了Simulink仿真模型、详细设计报告、Mathcad计算书以及控制算法说明文档,深入探讨了恒压恒流双闭环控制、变频与移相混合控制、软启动机制等核心技术,并提供了多应用场景实例,包括双向全桥LLC、多相交错LLC以及电动汽车V2G系统中的CLLC变换器设计。此外,配套资源还包含了多种先进控制与状态估计算法(如EKF、UKF、PF及其与神经网络融合算法)的Matlab实现代码,强化了科研复现与工程实践能力。; 适合人群:适用于电气工程、电力电子及相关专业的研究生、科研人员,以及从事高频开关电源、新能源变换器开发的工程师;需具备扎实的电路理论基础与一定的仿真软件操作经验。; 使用场景及目标:①支持全桥LLC变换器的高效参数设计与动态性能优化;②服务于高校或企业的科研项目,助力拓扑创新与控制系统开发;③作为毕业设计、学术论文或工业级产品原型开发的重要技术参考,提升系统效率、稳定性和响应速度。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注谐振元件匹配、控制环路设计与系统稳定性分析,充分利用提供的Matlab/Simulink环境进行仿真调试与二次开发,深化理论认知与实际工程应用的融合。

Percona Toolkit 神器全攻略(性能类)

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。过读取日志(例如:慢查询日志)中的查询语句,然后分析语句是如何使用表的,即:表之间的数据流向。indexes:此表包含了数据库中所有表的索引信息。它记录了每个表的索引名称、列、类型等。进程的堆栈信息是通过gdb获取的,所以在获取过程中,会对数据库的性能有一定的影响。

GreatSQL2021的博客 1220

三相交错并联Buck变换器+低纹波输出+双闭环控制仿真【附参考文献】(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的三相交错并联Buck变换器仿真模型,重点实现了低输出纹波特性和双闭环控制策略。通过三相交错并联结构有效抑制输入与输出电流的纹波成分,显著提升电源系统的稳定性和电能质量;控制系统采用电压外环与电流内环相结合的双闭环架构,增强了系统的动态响应能力和抗干扰性能。资源包涵盖完整的Simulink仿真模型、技术说明文档及参考文献,具有较强的工程实践价值,适用于电力电子变换器的科研开发与教学实验。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校本科生、研究生及科研人员,尤其适合从事直流变换器拓扑结构与先进控制策略研究的专业人士,具备电路理论基础和Simulink仿真操作经验者更佳。; 使用场景及目标:①用于高效低纹波DC-DC变换器的拓扑创新与控制算法研究;②支撑科研项目中对多相并联技术与双闭环控制系统的性能验证;③作为课程设计、毕业设计或实验教学的技术范例,帮助深入理解交错并联的工作机理与闭环系统的设计方法。; 阅读建议:建议结合所提供的参考文献系统学习控制策略的理论依据,并动手调整仿真参数以观察系统在不同工况下的动静态响应特性,进一步掌握模型搭建、控制器设计与性能优化的全流程,强化理论与工程实践的融合能力。

Allan方差读图分析IMU误差指标

Allan方差标定IMU参数实测分析

weixin_44927558的博客 3566

Percona Toolkit 神器全攻略(开发类)

Percona Toolkit 神器全攻略(开发类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾 Percona Toolkit 神器全攻略 Percona Toolkit 神器全攻略(实用类) Percona Toolkit 神器全攻略(配置类) Percona...

weixin_41474971的博客 206

InsightFace实战:如何在树莓派上部署轻量级人脸识别系统(附完整代码)

本文详细介绍了如何在树莓派上部署基于InsightFace框架的轻量级人脸识别系统。通过硬件选型、环境配置、模型优化(如MobileFaceNet)及完整代码实战,指导开发者构建本地化、低功耗的智能应用,如智能门铃,并提供了性能调优与系统服务化的进阶技巧。

weixin_29043895的博客 351

Percona Toolkit 神器全攻略

Percona Toolkit简称(PT工具),是一组高级命令行工具,用于管理MySQL/GreatSQL的工具。可以用它来执行各种难以手动执行的MySQL/GreatSQL和系统任务。其功能包括检查主从复制的数据一致性、检查重复索引、定位IO占用高的表文件、在线DDL等,DBA熟悉掌握PT工具后将极大提高工作效率。本系列只介绍和探讨Percona Toolkit中针对MySQL/GreatSQL数据库的实用工具。

GreatSQL2021的博客 708

告别浏览器崩溃!EasyPlayer.js长时间播放FLV视频内存泄漏排查指南

本文针对EasyPlayer.js长时间播放FLV视频导致浏览器内存泄漏和崩溃的问题,提供了一套系统性排查与解决方案。核心策略包括将视频编码从H.265转为H.264以降低解码压力,以及将传输协议从HTTP-FLV切换至WebRTC以优化资源管理。文章还详细介绍了播放器实例生命周期管理、浏览器开发者工具监控等精细化排查手段,帮助开发者实现稳定、长时间的多路视频播放。

weixin_29229055的博客 174

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

Percona Toolkit 神器全攻略(监控类)

Percona Toolkit 神器全攻略(监控类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾 Percona Toolkit 神器全攻略 Percona Toolkit 神器全攻略(实用类) Percona Toolkit 神器全攻略(配置类) 全文约定:...

weixin_34672875的博客 188

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1057

SQL工具全攻略:从入门到精通,数据分析师与开发者的效率利器

SQL作为数据领域的核心语言,是操作和查询数据库的通用标准。其工作原理是通过声明式语法,将用户的数据需求转化为数据库系统可执行的指令,实现对数据的增删改查与复杂分析。掌握SQL的价值在于能够高效、精准地从海量数据中提取信息,支撑业务决策、应用开发和系统优化。在数据分析、后端开发、数据仓库构建等应用场景中,SQL能力直接影响工作效率与成果质量。而一款优秀的SQL工具,如DBeaver或DataGrip,能通过智能补全、执行计划可视化等功能,显著提升SQL编写与调试效率,是数据工作者从“会写”迈向“高效”的关键

weixin_30527423的博客 287

Qt之QSqlTableModel:高效数据库操作与视图绑定的实战指南

本文深入探讨了Qt框架中的QSqlTableModel组件,它作为连接数据库与Qt视图的智能中介,能极大简化数据库的增删改查操作。通过实战代码演示,详细讲解了如何快速构建可编辑的数据表格、理解并设置关键的数据编辑策略(如OnManualSubmit),以及实现数据过滤、排序等高级功能。文章还提供了性能优化、事务处理及常见避坑指南,帮助开发者高效、稳健地开发数据库驱动的桌面应用。

y4z5a6b7的博客 440

泛微OA与泛微OA之间打通实现统一待办配置

问题:学校OA与集团OA均为泛微Ecology8.0 ,由于流程审批互通的需要,要将两套OA系统打通,实现跨系统的流程流转。

symstandsun的博客 2269

MySQL大表结构修改神器:pt-online-schema-change(pt-osc)全攻略

在MySQL数据库运维中,修改大表结构是一个经典痛点——传统ALTER TABLE命令会锁表(尤其是InnoDB引擎在MySQL 5.7及更早版本),导致业务读写阻塞、服务不可用。为解决这一问题,Percona Toolkit提供的pt-online-schema-change(简称pt-osc)工具应运而生,它能在不锁表的前提下安全修改表结构。本文将从工具选型、环境准备、原理解析到实操避坑,全面讲解pt-osc的使用。

专注Java和MySQL领域知识分享 1915

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

GreatSQL社区2024年全年总结(免费领红包封面)

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。社区2024年总结GreatSQL 社区在2024年度上持续迈进,成果斐然。一方面,开放了 GreatSQL 单机版以及三节点 MGR 集群的在线测试体验环境,让用户能够在线体验各种 GreatSQL 创新特性。另一方面,社区手册也持续更新,方便用户查阅。同时,社区积极拓展教育合作领域,成功走进郑州大学,联合开设 “G...

老叶茶馆 195

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: GreatSQL执行Update失败案例分析
下一篇: GreatSQL 异步复制及搭建
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值