[MySQL][Master-Slave] GTID 복제 에러 건너뛰기

복제 에러 건너뛰기

MySQL 마스터-슬레이브 복제 환경에서 운영시 복제가 멈추는 상황이 발생합니다. 예를 들면

데이터 중복오류

슬레이브에 존재하지 않는 데이터베이스에 데이터 입력

슬레이브에 존재하지 않는 테이블에 데이터 입력 시도

여러가지가 있습니다. 이런 이유들로 인해 데이터 복제가 멈추게 됩니다. 여기에서는 이런 에러에 대해 해결하는 방법에 대해 알아보겠습니다.

 

에러 상황

복제 중지 에러가 발생하게 되면 보통 다음과 같은 에러가 발생하게 됩니다. 아래에 나와있는 show slave status 명령을 입력하게 되면 에러 내용에 대해 자세히 나오게 됩니다.

위에 보면 Last_Errno Last_Error 있습니다. 이곳에서 에러가 발생했는지 원인을 파악해 있습니다.

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.42
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binarylogs.000010
          Read_Master_Log_Pos: 194
               Relay_Log_File: relay-bin.000004
                Relay_Log_Pos: 1103
        Relay_Master_Log_File: binarylogs.000009
             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: 1062
                   Last_Error: Could not execute Write_rows event on table gtid_db.gtb; Duplicate entry '2' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log binarylogs.000009, end_log_pos 1122
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 888
              Relay_Log_Space: 2282
              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: 1062
               Last_SQL_Error: Could not execute Write_rows event on table gtid_db.gtb; Duplicate entry '2' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log binarylogs.000009, end_log_pos 1122
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 894c1e20-e34b-11ec-944f-0050562bebcc
             Master_Info_File: mysql.slave_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: 220612 08:44:36
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 894c1e20-e34b-11ec-944f-0050562bebcc:17-23
            Executed_Gtid_Set: 894c1e20-e34b-11ec-944f-0050562bebcc:1-22
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)


ERROR: 
No query specified

 

그리고 performance schema replication_applier_status_by_worker 테이블을 확인해보면 좀더 자세한 원인을 확인해볼 있습니다.

mysql> select * from performance_schema.replication_applier_status_by_worker\G;
*************************** 1. row ***************************
         CHANNEL_NAME: 
            WORKER_ID: 0
            THREAD_ID: NULL
        SERVICE_STATE: OFF
LAST_SEEN_TRANSACTION: 894c1e20-e34b-11ec-944f-0050562bebcc:23
    LAST_ERROR_NUMBER: 1062
   LAST_ERROR_MESSAGE: Could not execute Write_rows event on table gtid_db.gtb; Duplicate entry '2' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log binarylogs.000009, end_log_pos 1122
 LAST_ERROR_TIMESTAMP: 2022-06-12 08:44:36
1 row in set (0.00 sec)


ERROR: 
No query specified

 

위의 Executed_Gtid_Set(show slave status 내용중) 어디까지 트랜잭션을 완료시켰는지 나타내는 상태 변수입니다. 내용을 보면 894c1e20-e34b-11ec-944f-0050562bebcc:1-22 내용이 있습니다. 내용은 894c1e20-e34b-11ec-944f-0050562bebcc UUID 가진 서버(보통 마스터 서버)에서 1번부터 22번까지의 트랜잭션을 실행시켰다는 의미입니다. 이후 다음 트랜잭션을 실행하는데 에러가 발생했다는 의미입니다.

아래 replication_applier_status_by_worker 조회에서 나오는 LAST_SEEN_TRANSACTION 보면 어떤 트랜잭션에서 멈추었는지 좀더 정확하게 있습니다.

 

해결 방법

위의 에러같은 경우는 프리머리 키를 가진 테이블에 중복데이터가 들어와 중복 데이터 에러가 발생한 케이스입니다. 이럴때는 현재 데이터를 건너뜀으로써 에러 상태를 해결할 있습니다.

위와 같은 상황뿐만 아니라 다른 상황에서도 현재 상태를 건너뛰어 해결해야 상황이 발생할 있습니다. 이때 사용하는 방법입니다. 거의 90%이상은 위와 같은 방법으로 해결합니다.

 

트랜잭션 주입

현재 트랜잭션을 무시하기 위해 일부러 아무런 내용이 없는 트랜잭션을 설정합니다. 그리고 트랜잭션을 강제로 실행하도록 합니다.

mysql> set gtid_next="894c1e20-e34b-11ec-944f-0050562bebcc:23";

 

그리고 다음 명령어를 입력합니다.

mysql> begin;
mysql> commit;
mysql> set gtid_next='AUTOMATIC';

 

그리고 슬레이브를 실행합니다.

mysql> start slave;

 

상태확인을 합니다.

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.42
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binarylogs.000010
          Read_Master_Log_Pos: 194
               Relay_Log_File: relay-bin.000006
                Relay_Log_Pos: 409
        Relay_Master_Log_File: binarylogs.000010
             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: 194
              Relay_Log_Space: 650
              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: 894c1e20-e34b-11ec-944f-0050562bebcc
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 894c1e20-e34b-11ec-944f-0050562bebcc:17-23
            Executed_Gtid_Set: 894c1e20-e34b-11ec-944f-0050562bebcc:1-23
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)


ERROR: 
No query specified

 

아래 내용으로 복제가 정상적으로 것을 확인해 있습니다.

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 

GTID 복제 이론

https://myinfrabox.tistory.com/29

 

[MySQL][Master-Slave] GTID를 이용한 복제 - 이론

이 섹션에서는 GTID (Global Transaction Identifier)를 사용한 트랜잭션 기반 복제에 대해 설명합니다. GTID를 사용할 때 각 트랜잭션은 원래 서버에서 커밋되고 슬레이브에 의해 적용될때 식별되고 추적

myinfrabox.tistory.com

 

GTID 복제 구성 방법

https://myinfrabox.tistory.com/30

 

[MySQL][Master-Slave] GTID를 이용한 복제 - 구성방법

■ GTID를 이용한 복제 설정. 여기에서는 처음으로 GTID를 이용하여 처음 설정하는 "콜드 스타트"방법입니다. 이 포스트를 통해서 복제를 어떻게 설정하고, 주의할점은 무엇인지 알아봅니다. ■ 서

myinfrabox.tistory.com

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.

Designed by JB FACTORY