MySQL主从同步不一致后的数据同步

2026-02-28 23:22:00
丁国栋
原创 8
摘要:本文档详细介绍如何使用 Percona Toolkit 工具包中的 pt-table-checksum 和 pt-table-sync 工具,对 MySQL 主从复制环境进行数据一致性检查和修复。

Percona Toolkit 主从数据一致性检查与修复指南

本文档详细介绍如何使用 Percona Toolkit 工具包中的 pt-table-checksumpt-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 字符串 从库的连接信息

五、注意事项

  1. 操作时机:建议在业务低峰期执行,避免对生产环境造成影响
  2. 备份优先:在执行修复操作前,建议对从库相关表进行备份
  3. 网络要求:确保主从库之间的网络连通性良好
  4. 权限验证:确保 percona 用户在主从库上都有足够的权限
  5. 监控资源:操作期间监控数据库的 CPU、内存、IO 和复制延迟
  6. 批量修复:如需修复多个表,可以使用 --tables 参数指定多个表,或用脚本批量处理

六、常见问题

6.1 权限不足

如果遇到权限错误,请检查 percona 用户是否具有所有必要的权限,并确保密码正确。

6.2 复制延迟增加

检查操作期间,可能会增加复制延迟。如果延迟过大,可以:

  • 减小 --chunk-size
  • 降低 --max-load 阈值
  • 在业务最低峰时执行

6.3 字符集问题

如果主从表字符集不一致,可能导致检查失败。确保主从库的字符集配置一致。

七、自动化建议

对于定期检查需求,可以编写脚本自动化以下流程:

  1. 定期运行 pt-table-checksum 检查
  2. 解析检查结果,标记不一致的表
  3. 在维护窗口自动或手动触发修复
  4. 发送检查结果通知
发表评论
博客分类