MySQL 복제에서 특정 오류를 건너뛰는 방법

MySQL 복제에서 특정 오류를 건너뛰는 방법

2022-10-19 last update

7 minutes reading mysql
MySQL 복제는 훌륭하지만 오류로 인해 중지될 수 있고 작업 복제를 복원하는 것이 어려울 수 있습니다. 일관된 MySQL 덤프를 얻으려면 마스터에 잠금을 설정해야 하며 그 동안 웹 사이트에 액세스할 수 없습니다. 그러나 slave-skip-errors 지시문을 사용하여 MySQL 슬레이브가 특정 오류를 무시하도록 하는 방법이 있습니다.

1 서문


slave-skip-errors를 사용하면 복제 슬레이브가 특정 오류 코드를 무시하도록 만들 수 있습니다(MySQL 오류 코드 목록은 여기에서 찾을 수 있습니다: Server Error Codes and Messages ). 그러나 이것은 주의해서 사용해야 합니다. 슬레이브가 일관성이 없게 만들 수 있으므로 복제를 복원하려는 마지막 도구여야 합니다. 먼저 다음 중 하나를 시도해야 합니다: How To Repair MySQL Replication 또는 슬레이브의 my.cnf 파일에 있는 replicate-ignore-db 또는 replicate-ignore-table 문을 사용하여 복제 실패를 유발하는 데이터베이스/데이터베이스 테이블에 대한 복제를 건너뜁니다(복제가 필요하지 않은 경우) 이러한 데이터베이스/데이터베이스 테이블의 경우).

2 슬레이브 스킵 오류 사용


복제가 중지되었고 슬레이브의 MySQL 셸에서 다음과 같은 결과가 나왔다고 가정해 보겠습니다.
SHOW SLAVE STATUS \G
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 1.2.3.4
                  Master_User: slave_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000024
          Read_Master_Log_Pos: 933201702
               Relay_Log_File: mysqld-relay-bin.000113
                Relay_Log_Pos: 63519994
        Relay_Master_Log_File: mysql-bin.000021
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB: mysql,information_schema,performance_schema,test
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1054
                   Last_Error: Error 'Unknown column 'tx_feuserbranch_agb' in 'field list'' on query. Default database: 'dbtest'. 
Query: 'INSERT INTO fe_users (email,first_name,last_name,address,ip,city,country,telephone,fax,company,tx_feuserbranch_brancha,
tx_feuserbranch_customernr,tx_feuserbranch_agb,username,password,name,usergroup,disable,by_invitation,tx_srfeuserregister_password,
tstap,crdate,cruser_id,fe_cruser_id,pid) VALUES ('[email protected]','John','Doe','test','55555','test','Deutschland','49111111111',
'','test','0','55','on','[email protected]','xxxxxxxxxxxxxx','John Doe','0','1','0','','1361359747','1361359747','0','0','33')'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120460827
              Relay_Log_Space: 3500841420
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
           Master_SSL_CA_Path:
              Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: /etc/mysql/newcerts/client-key.pem
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1054
               Last_SQL_Error: Last_Error: Error 'Unknown column 'tx_feuserbranch_agb' in 'field list'' on query. Default database: 'dbtest'. 
Query: 'INSERT INTO fe_users (email,first_name,last_name,address,ip,city,country,telephone,fax,company,tx_feuserbranch_brancha,
tx_feuserbranch_customernr,tx_feuserbranch_agb,username,password,name,usergroup,disable,by_invitation,tx_srfeuserregister_password,
tstap,crdate,cruser_id,fe_cruser_id,pid) VALUES ('test3[email protected]','John','Doe','test','55555','test','Deutschland','49111111111',
'','test','0','55','on','[email protected]','xxxxxxxxxxxxxx','John Doe','0','1','0','','1361359747','1361359747','0','0','33')'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

mysql>
Last_Errno 행에서 볼 수 있듯이 복제를 중지한 오류의 오류 코드는 1054(알 수 없는 열 '%s' in '%s')입니다. MySQL 슬레이브가 이러한 오류를 무시하도록 하려면 my.cnf를 엽니다(Debian 및 Ubuntu에서는/etc/mysql/my.cnf)...
vi /etc/mysql/my.cnf
... 그리고 slave-skip-errors = 1054 행을 추가합니다.


[...]
expire_logs_days        = 10
max_binlog_size         = 100M
server-id=2
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
slave-skip-errors = 1054
[...]

나중에 MySQL을 다시 시작하십시오.
/etc/init.d/mysql restart
MySQL에 다시 로그인...
mysql -u root -p
... 슬레이브의 상태를 다시 확인하십시오. 이제 다시 작동해야 합니다.
SHOW SLAVE STATUS \G
슬레이브가 여러 오류 코드를 무시하도록 하려면 쉼표로 구분하면 됩니다.
slave-skip-errors = 1062,1054
여기에서 MySQL 오류 코드 목록을 찾을 수 있습니다. Server Error Codes and Messages

3 링크


  • MySQL: http://www.mysql.com/
  • MySQL 오류 코드 및 메시지: http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
  • 슬레이브 스킵 오류: http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html#option_mysqld_slave-skip-errors