[MYSQL] 从库 Last_SQL_Errno: 1197 问题处理

MySQL 从库复制错误 Last_SQL_Errno: 1197 表示在从库上执行的事务与主库不一致,通常是由于事务在从库上被回滚或无法执行。以下是该问题的详细分析和解决方法。


1. 错误原因

错误 1197 的具体描述是:

ER_SLAVE_CANT_FIND_PARTITION_IN_DML

表示从库在执行主库传来的 DML 语句(如 INSERTUPDATEDELETE)时,无法找到对应的分区。可能的原因包括:

  1. 主从表结构不一致

    • 主库和从库的表结构(特别是分区定义)不同。

  2. 分区表操作问题

    • 主库上对分区表进行了操作(如 ALTER TABLE),但从库未同步这些操作。

  3. 数据不一致

    • 主库和从库的数据不一致,导致从库无法找到对应的分区。


2. 解决方法

(1)检查主从表结构

确保主库和从库的表结构(特别是分区定义)完全一致。

步骤

  1. 在主库上查看表结构:

    SHOW CREATE TABLE table_name;
  2. 在从库上查看表结构:

    SHOW CREATE TABLE table_name;
  3. 对比两者的表结构,确保一致。

修复方法

如果表结构不一致,手动同步表结构:

  1. 在从库上执行主库的 CREATE TABLE 语句。

  2. 如果表中有数据,使用 mysqldump 导出数据并导入从库。


(2)跳过错误事务

如果错误是由于某个特定事务引起的,可以跳过该事务,继续复制。

步骤

  1. 停止从库复制:

    STOP SLAVE;
  2. 跳过错误事务:

    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    • 该命令会跳过当前错误事务。

  3. 启动从库复制:

    START SLAVE;

注意

跳过事务可能导致数据不一致,需谨慎使用。


(3)重新初始化从库

如果主从数据不一致,可以重新初始化从库。

步骤

  1. 在主库上导出数据:

    mysqldump -u root -p --all-databases > full_backup.sql
  2. 在从库上停止复制并重置从库:

    STOP SLAVE;
    RESET SLAVE ALL;
  3. 导入数据到从库:

    mysql -u root -p < full_backup.sql
  4. 重新配置复制:

    CHANGE MASTER TO
    MASTER_HOST='主库IP',
    MASTER_USER='replication_user',
    MASTER_PASSWORD='replication_password',
    MASTER_LOG_FILE='主库的binlog文件',
    MASTER_LOG_POS=主库的binlog位置;
  5. 启动从库复制:

    START SLAVE;

(4)检查分区表操作

如果错误是由于分区表操作引起的,检查主库和从库的分区表状态。

步骤

  1. 在主库上检查分区表状态:

    SELECT * FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'table_name';
  2. 在从库上检查分区表状态:

    SELECT * FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'table_name';
  3. 对比两者的分区表状态,确保一致。

修复方法

如果分区表状态不一致,手动同步分区表:

  1. 在主库上执行 ALTER TABLE 语句。

  2. 在从库上执行相同的 ALTER TABLE 语句。


(5)检查数据一致性

使用工具检查主从数据一致性,如 pt-table-checksumpt-table-sync

步骤

  1. 在主库上运行 pt-table-checksum

    pt-table-checksum --databases=database_name --tables=table_name
  2. 在从库上检查校验和:

    SELECT * FROM percona.checksums;
  3. 使用 pt-table-sync 修复不一致的数据:

    pt-table-sync --execute h=主库IP,D=database_name,t=table_name h=从库IP

3. 预防措施

  1. 定期检查主从表结构

    • 确保主库和从库的表结构一致。

  2. 避免直接操作从库

    • 不要在从库上直接修改数据或表结构。

  3. 监控复制状态

    • 定期检查 SHOW SLAVE STATUS,及时发现并处理复制错误。

  4. 使用自动化工具

    • 使用 pt-table-checksumpt-table-sync 定期检查并修复数据一致性。


4. 总结

错误 1197 通常是由于主从表结构不一致或数据不一致引起的。解决方法包括:

  1. 检查并同步主从表结构。

  2. 跳过错误事务(谨慎使用)。

  3. 重新初始化从库。

  4. 检查并修复分区表操作。

  5. 使用工具检查并修复数据一致性。

通过合理配置和监控,可以有效避免该错误的发生,确保 MySQL 主从复制的稳定性。

posted on 2025-02-03 09:59  阿陶学长  阅读(152)  评论(0)    收藏  举报