首页 > 其他分享 >slave跳过错误

slave跳过错误

时间:2023-08-29 21:31:48浏览次数:29  
标签:slave Log 错误 Pos SSL Master mysql 跳过

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续 跳过错误有两种方式:

一、跳过指定数量的事务

mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1        #跳过一个事务
mysql>slave start

二、修改mysql的配置文件

通过slave_skip_errors参数来跳所有错误或指定类型的错误

vim /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
注意事项:

1)当配置文件里写两行:

slave-skip-errors=1062
slave-skip-errors=1032
 
#如果将跳过错误做多行写时,第二个参数会覆盖第一个参数。
#所以一定要写到同一行,并用逗号分隔。
2)虽然slave会跳过这些错误,继续复制,但是仍会以Warning的形式记录到错误日志中,如:

160620 10:40:17 [Warning] Slave SQL: Could not execute Write_rows event on table dba.t; Duplicate entry '10' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000033, end_log_pos 1224, Error_code: 1062

三、模拟错误场景

1、环境(一个已经配置好的主从复制环境)

master数据库IP:192.168.247.128
slave数据库IP:192.168.247.130
mysql版本:5.7.14
binlog-do-db = mydb
2、在master上执行以下语句:

mysql>use mysql;
mysql>create table t1 (id int);
mysql>use mydb;
mysql>insert into mysql.t1 select 1;
3、在slave上查看复制状态:

 

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000017
          Read_Master_Log_Pos: 2341
               Relay_Log_File: DBtest1-relay-bin.000011
                Relay_Log_Pos: 494
        Relay_Master_Log_File: mysql-bin.000017
             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: 1146
                   Last_Error: Error 'Table 'mysql.t1' doesn't exist' on query. Default database: 'mydb'. Query: 'insert into mysql.t1 select 1'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1919
              Relay_Log_Space: 1254
              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: 1146
               Last_SQL_Error: Error 'Table 'mysql.t1' doesn't exist' on query. Default database: 'mydb'. Query: 'insert into mysql.t1 select 1'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: f0f7faf6-51a8-11e3-9759-000c29eed3ea
             Master_Info_File: /var/lib/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: 131210 21:37:19
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

由结果可以看到:

Read_Master_Log_Pos: 2341,Exec_Master_Log_Pos: 1919 时出错了
Last_SQL_Error: Error 'Table 'mysql.t1' doesn't exist' on query.
原因:因为只对mydb记录了binlog,当在mydb库操作其它数据库的表,但该表在slave上又不存在时就出错了。我们可在master的binlog里看事务内容,这里一行代表一个事务

 

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000017' from 1919\G
*************************** 1. row ***************************
   Log_name: mysql-bin.000017
        Pos: 1919
 Event_type: Query
  Server_id: 1
End_log_pos: 1999
       Info: BEGIN
*************************** 2. row ***************************
   Log_name: mysql-bin.000017
        Pos: 1999
 Event_type: Query
  Server_id: 1
End_log_pos: 2103
       Info: use `mydb`; insert into mysql.t1 select 1
*************************** 3. row ***************************
   Log_name: mysql-bin.000017
        Pos: 2103
 Event_type: Xid
  Server_id: 1
End_log_pos: 2134
       Info: COMMIT /* xid=106 */
*************************** 4. row ***************************
   Log_name: mysql-bin.000017
        Pos: 2134
 Event_type: Query
  Server_id: 1
End_log_pos: 2213
       Info: BEGIN
*************************** 5. row ***************************
   Log_name: mysql-bin.000017
        Pos: 2213
 Event_type: Query
  Server_id: 1
End_log_pos: 2310
       Info: use `mydb`; insert into t1 select 9
*************************** 6. row ***************************
   Log_name: mysql-bin.000017
        Pos: 2310
 Event_type: Xid
  Server_id: 1
End_log_pos: 2341
       Info: COMMIT /* xid=107 */
6 rows in set (0.00 sec)

由上面的结果可知,我们需要跳过两个事务

(Pos: 1999 insert,Pos: 2103 commit),

(Pos:2213 insert , Pos:2310 commit)

4、在slave上的操作

mysql> stop slave;   #停止slave
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2        #跳过两个事务
mysql>start slave    #开启slave
mysql> show slave status\G  #查看slave状态
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: mydb
 
 
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000017
          Read_Master_Log_Pos: 3613
               Relay_Log_File: DBtest1-relay-bin.000018
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000017
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3613
              Relay_Log_Space: 458
              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: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: f0f7faf6-51a8-11e3-9759-000c29eed3ea
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.01 sec)

备注:排查应该跳过几个事务时应该要仔细,如果跳过的事务过多,也就说明slave I/O线程读取二进制的位置已经远远超过了master 的二进制存储位置,所以此时当master进行写操作时,slave不会有数据更新。

标签:slave,Log,错误,Pos,SSL,Master,mysql,跳过
From: https://blog.51cto.com/u_13482808/7280970

相关文章

  • docker build过程中遇到错误qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so
    Removingintermediatecontainer70af516d5d6b--->a69229847153Step5/6:RUNGO111MODULE="on"gogetgithub.com/jsonnet-bundler/jsonnet-bundler/cmd/jb;ln-s$(goenvGOPATH)/bin/jb/usr/bin/jb--->Runningin13545862fffeqemu-x86_64:......
  • 【HMS Core】在线语种检测返回结果错误
    【关键字】在线语种检测、机器学习【问题描述】集成在线语种检测服务,检测蒙古文之后,返回结果为中文【问题分析】1、在线语种服务目前不支持蒙古文,具体可见官网语种支持列表:【MLKit】语种检测支持的语言列表2、目前该服务是在支持语言进行置信度识别的,没有达到置信度会固定返回一种......
  • Data source rejected establishment of connection,message from serverToo many con
    1、临时修改生效,不需要重启数据库showvariableslike"max_connections";#显示最大连接数showprocesslist;#显示当前连接数setglobalmax_connections=1000;#设置最大连接数1000showvariableslike"max_connections";#显示最大连接数2、找到mysql安装目录下的m......
  • 李跳跳跳过APP开屏广告,附下载地址
    最近,李跳跳APP宣布永久停止更新。据称,该应用导致了消费者权益的减损,被指构成不正当竞争,并因此遭受某大厂的投诉,甚至收到了一封法律函件的威胁。面对压力,最终李跳跳APP选择了退出舞台。李跳跳APP是什么?它又做了什么恶?如果你不熟悉这个应用,李跳跳最初只是一个利用无障碍权限来跳过APP......
  • flutter升级错误“Your flutter checkout has local changes that would be erased by
    在升级FlutterSDK时可能会报如下错误:Yourfluttercheckouthaslocalchangesthatwouldbeerasedbyupgrading.Ifyouwanttokeepthesechanges,itisrecommendedthatyoustashthemvia“gitstash”orelsecommitthechangestoalocalbranch.Ifitisok......
  • XApool连接池报空指针错误解决
    atorg.enhydra.jdbc.pool.GenericPool.getFromPool(GenericPool.java:200)atorg.enhydra.jdbc.pool.GenericPool.checkOut(GenericPool.java:351)atorg.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:194)atorg.enhydra.jdb......
  • python+playwright 学习-76 playwright 忽略SSL 错误
    前言playwright设置ignore_https_errors参数忽略SSL错误context上下文中设置browser.new_context()创建上下文时fromplaywright.sync_apiimportsync_playwright,expectwithsync_playwright()asp:browser=p.chromium.launch(headless=False)conte......
  • Long-read error correction: a survey and qualitative comparison (长读错误纠正:一
    BasicInformation:Title:Long-readerrorcorrection:asurveyandqualitativecomparison(长读错误纠正:一项调查和定性比较)Authors:PierreMorisse,ThierryLecroq,ArnaudLefebvreAffiliation:NormandieUniversité,UNIROUEN,INSARouen,LITIS,76000Rouen,......
  • Struts2标签错误:using Struts tags without the associat解决
    <filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping> struts,在使用标签的时候,出现了这样一个问题。    原本使用标签,引用方法是默认配置:    web.xml:<filter><filter-name&......
  • Struts2输入校验以及错误信息处理(2)——用Struts2定义好的校验框架进行校验
    Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。不管是哪种方式,程序执行的流程都是一样的,执行流程如下:1、对表单传递过来的数据,先进行类型转换......