MySQL主从同步不一致后的数据同步
- 2026-02-28 23:22:00
- 丁国栋
- 原创 8
Percona Toolkit 主从数据一致性检查与修复指南
本文档详细介绍如何使用 Percona Toolkit 工具包中的 pt-table-checksum 和 pt-table-sync 工具,对 MySQL 主从复制环境进行数据一致性检查和修复。
一、环境准备
1.1 安装 Percona Toolkit
在需要进行操作的主机(通常为主库或一个管理节点)上安装 percona-toolkit。
apt-get install percona-toolkit
1.2 创建专用用户
在主库上执行以下 SQL 语句,创建一个用于数据校验和同步的专用账户。
-- 创建 percona 用户,请修改密码为强密码
CREATE USER 'percona'@'%' IDENTIFIED BY 'fF74cdm5Dhmydv24CJiD!';
-- 授予必要的全局权限
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE, INSERT, UPDATE, DELETE ON *.* TO 'percona'@'%';
-- 授予对 percona.checksums 表的操作权限
GRANT INSERT, UPDATE, DELETE ON `percona`.`checksums` TO 'percona'@'%';
安全提示:请将上述密码 fF74cdm5Dhmydv24CJiD! 替换为符合你安全策略的强密码,并在所有后续命令中保持一致。
二、配置从库 DSN 信息
2.1 创建配置数据库和表
在主库上创建用于存储从库连接信息的数据库和表。
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS percona;
USE percona;
-- 创建 dsns 表
CREATE TABLE IF NOT EXISTS dsns (
id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) DEFAULT NULL,
dsn varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
2.2 配置从库连接信息
清空旧数据并插入从库的 DSN(数据源名称)连接字符串。
-- 清空旧数据
TRUNCATE TABLE dsns;
-- 插入从库信息
-- 格式:h=主机IP,P=端口,u=用户名,p=密码
INSERT INTO dsns (dsn) VALUES
('h=10.0.7.194,P=23307,u=percona,p=fF74cdm5Dhmydv24CJiD!');
注意:
- 如果有多台从库,可以插入多条记录
- 请将 IP、端口、密码替换为实际值
- DSN 字符串中特殊字符可能需要转义
三、数据一致性检查
3.1 执行检查
使用 pt-table-checksum 检查主从数据一致性。
pt-table-checksum \
--databases=zdoo \
--recursion-method=dsn=D=percona,t=dsns \
--no-check-binlog-format \
--max-load=Threads_running=25 \
--chunk-size=1000 \
--set-vars innodb_lock_wait_timeout=1 \
--nocheck-replication-filters
3.2 参数说明
| 参数 | 说明 |
|---|---|
--databases=zdoo |
指定要检查的数据库 |
--recursion-method=dsn=D=percona,t=dsns |
从 percona.dsns 表读取从库信息 |
--no-check-binlog-format |
不检查 binlog 格式 |
--max-load=Threads_running=25 |
当 Threads_running > 25 时暂停检查 |
--chunk-size=1000 |
每个数据块的行数 |
--set-vars innodb_lock_wait_timeout=1 |
设置锁等待超时时间 |
--nocheck-replication-filters |
不检查复制过滤规则 |
四、数据不一致修复
4.1 生成修复语句(预览模式)
在真正修复前,先使用 --print 参数预览将要执行的修复语句。
pt-table-sync \
--print \
--sync-to-master \
--databases zdoo \
--tables welfare_clockin \
--chunk-size=1000 \
--verbose \
'h=10.0.7.194,P=23307,u=percona,p=fF74cdm5Dhmydv24CJiD!'
4.2 执行修复
确认生成的 SQL 语句正确后,使用 --execute 参数实际执行修复。
pt-table-sync \
--execute \
--sync-to-master \
--databases zdoo \
--tables welfare_clockin \
--chunk-size=1000 \
--verbose \
'h=10.0.7.194,P=23307,u=percona,p=fF74cdm5Dhmydv24CJiD!'
4.3 参数说明
| 参数 | 说明 |
|---|---|
--print |
仅打印修复语句,不执行 |
--execute |
实际执行修复操作 |
--sync-to-master |
以主库为基准同步从库 |
--databases zdoo |
指定数据库 |
--tables welfare_clockin |
指定要修复的表 |
--chunk-size=1000 |
每个数据块的行数 |
--verbose |
输出详细过程信息 |
| DSN 字符串 | 从库的连接信息 |
五、注意事项
- 操作时机:建议在业务低峰期执行,避免对生产环境造成影响
- 备份优先:在执行修复操作前,建议对从库相关表进行备份
- 网络要求:确保主从库之间的网络连通性良好
- 权限验证:确保 percona 用户在主从库上都有足够的权限
- 监控资源:操作期间监控数据库的 CPU、内存、IO 和复制延迟
- 批量修复:如需修复多个表,可以使用
--tables参数指定多个表,或用脚本批量处理
六、常见问题
6.1 权限不足
如果遇到权限错误,请检查 percona 用户是否具有所有必要的权限,并确保密码正确。
6.2 复制延迟增加
检查操作期间,可能会增加复制延迟。如果延迟过大,可以:
- 减小
--chunk-size值 - 降低
--max-load阈值 - 在业务最低峰时执行
6.3 字符集问题
如果主从表字符集不一致,可能导致检查失败。确保主从库的字符集配置一致。
七、自动化建议
对于定期检查需求,可以编写脚本自动化以下流程:
- 定期运行
pt-table-checksum检查 - 解析检查结果,标记不一致的表
- 在维护窗口自动或手动触发修复
- 发送检查结果通知
发表评论