mysq 主从复制 1032、Error Duplicate column name 等错误异常的处理方法

mysq 主从复制 突然停止, 查看原因多种多样: 有1032、Error 'Duplicate column name

一、示例1:Error ‘Duplicate column name ‘idcardno’’ on query

1)异常

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.104
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 695915226
               Relay_Log_File: myslql-relay-bin.000002
                Relay_Log_Pos: 1158321
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1060
                   Last_Error: Error 'Duplicate column name 'idcardno'' on query. Default database: ''. Query: '/* ApplicationName=DBeaver 7.0.2 - Main */ ALTER TABLE supervise.tb_shixinren_repeat ADD idcardno varchar(18) NULL COMMENT '身份证号''
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 232019583
              Relay_Log_Space: 1220890
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1060
               Last_SQL_Error: Error 'Duplicate column name 'idcardno'' on query. Default database: ''. Query: '/* ApplicationName=DBeaver 7.0.2 - Main */ ALTER TABLE supervise.tb_shixinren_repeat ADD idcardno varchar(18) NULL COMMENT '身份证号''
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: bf74ddb4-bf46-11ea-8a18-fa163e9cbb6a
             Master_Info_File: /data/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 200722 08:13:13
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 32c3a368-625e-11e8-9951-5254001e3af9:1-534019428,
c4c51a79-625f-11e8-88a4-525400c0fdcf:1-10
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

2)分析

从上面得到报错原因:

Error ‘Duplicate column name ‘idcardno’’ on query. Default database: ‘’. Query: ‘/* ApplicationName=DBeaver 7.0.2 - Main */ ALTER TABLE supervise.tb_shixinren_repeat ADD idcardno varchar(18) NULL COMMENT ‘身份证号’’

业务需要,要增加 idcardno 身份证号 字段。

开发或运维人员 同时在 主库和从库的表中增中idcardno 身份证号 字段, 这样导致当从库同步主库的数据时,因为从库的表中有同样的字段,无法再同步主库中相同的字段,所以报错。

正确的操作 只能主库写,从库绝对不能写,在主库中增加字段后, 从库自动同步。

3)解决方法

既然 从库 中已经有相同的数据,不同步这条数据,跳过这个异常。

操作方式如下:

mysql> stop slave;
Query OK, 0 rows
affected (0.00 sec)
 
mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows
affected (0.00 sec)
 
mysql> start slave;
Query OK, 0 rows
affected (0.00 sec)

二、示例2、Error_code: 1032

1)异常

mysql> show slave status\G;
***************************1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.250
                  Master_User: mysync
                  Master_Port: 2503306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 3918
               Relay_Log_File: HE1-relay-bin.000007
                Relay_Log_Pos: 484
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table test.helei; Can't find record in 'helei',Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000005, end_log_pos 3887
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3711
              Relay_Log_Space: 1626
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1032  
               Last_SQL_Error: Could not execute Update_rows event on table test.helei; Can't find record in 'helei', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000005, end_log_pos 3887
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2503306
                  Master_UUID:f7c96432-f665-11e5-943f-000c2967a454
             Master_Info_File:/data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp: 160331 09:25:02
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00sec)

2)分析

从上面得到报错原因:

Could not execute Update_rows event on table test.helei; Can’t find record in ‘helei’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event’s master log mysql-bin.000005, end_log_pos 3887

通过沟通,发现 开发或运行人员 在从库的 test 数据库的 helei 表中,删除了一条数据库, 而当主库中的操作(删除或修改)此条数据, 当从库同步数据时, 在从库中找不到这条数据。 所以会报错。

3)解决方法

方法1: 从库 中被删除的数据,恢复原状。

方法2: 在 主库 中找到此数据的现在的状态,在 从库 中恢复与其一致的数据。slave线程 跳过这个异常。

方法3: 主库 删除此数据,slave线程 跳过这个异常, 让业务人员重新录入。(如果业务允许的情况下,但是不推荐)

三、示例2、Error_code: 1062

1)异常

Could not execute Write_rows event on table study.test; 
Duplicate entry '119' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; 
the event's master log mysql-bin.000006, end_log_pos 258195089

2)分析

PRIMARY 是主键, 主库数据同步到从库数据时,主键冲突,主键的值是 119

  • 主库有一条 id=119 的数据, 从库中也有一条 id=119 的数据,这两条是同一步数据吗?
  • 如果当前是主从同步,这两条数据应该是同一条数据,
  • 如果当前是主主同步,master1 和 master2 的主键起始值 (auto-increment-offset )和 自增量 (auto-increment-increment) 参数 是否有问题。

四、总结

从上面的示例可以看出, mysql 主从复从出现错误的更多的是人为因素,不规定的操作造成的。

开发人员在从库上执行除了读以外的其它操作,导致主从失败。

 主库只能写,从库只能读

必须严重控制权限,从库的用户账号权限设置成 只读 权限,才能彻底解决问题。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/107503806