본문 바로가기
인간세상의 종말이 도래해따/오류

[MySQL] Replication 오류 1032, 1062 복구

by 민곰 2019. 7. 25.
728x90

※ 개발 환경

Ubuntu 18.04.2 LTS

Mysql 5.7.26


◆ 현상

mysql replication 깨짐
mysql replication 오류
mysql replication 동기화 안됨

갑자기 Slave와 Master의 동기화가 잘 이루어지지 않는다

Slave의 상태 정보를 확인해봤다

 

▼ 해결방안 바로 확인 ▼

 

반응형

◆ Slave에 접속해 상태 확인

# mysql -u root -p
Enter Password:

mysql> show slave status\G;

∴ 출력 결과

*************************** 1. row ***************************
...
(생략)
...
              Master_Log_File: mysql-bin.000104
          Read_Master_Log_Pos: 53302
               Relay_Log_File: mysql-relay-bin.000016
                Relay_Log_Pos: 53515
        Relay_Master_Log_File: mysql-bin.000104
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
...
(생략)
...
                   Last_Errno: 1062
                   Last_Error: Error 'Duplicate entry 'P2031' for key 'PRIMARY'' on query.
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 53302
              Relay_Log_Space: 53769
...
(생략)
...
1 row in set (0.00 sec)

 

여기서 확인해야 할 부분은 3가지 정도

  1. Slave_IO_Running과 Slave_SQL_Running이 Yes로 정상 작동 중인가
  2. Laster_Errno와 Last_Error를 통해 어떤 에러코드를 가진 에러가 발생했는가
  3. Read_Master_Log_Pos가 Master의 Position과 매칭이 되고 있는가

1. Slave_IO_Running과 Slave_SQL_Running이 Yes로 정상 작동 중인가

 Slave_SQL_Running: No 

현재 Slave는 제대로 Master의 로그를 읽어오지 못하고 있다

우리는 비가동 상태의 원인을 바로 2번에서 확인할 에러로 추정할 수 있다

 

2. Laster_Errno와 Last_Error를 통해 어떤 에러코드를 가진 에러가 발생했는가

 Last_Errno: 1062
 Last_Error: Error 'Duplicate entry 'P2031' for key 'PRIMARY'' on query.

여기서 확인할 수 있는 에러 중 주로 확인할 수 있는 에러는 (지금까지 직접 경험한 바에 따르면) 2가지 정도였다

  1. 1062 Duplicate entry : 키 중복 오류
  2. 1032 HA_ERR_KEY_NOT_FOUND : 키 없음 오류

처음에는 단순하게 맞지 않는 부분을 Slave DB에 강제로 적용하고,

예를 들어, TABLE_A에 'TEST1'이라는 키가 없는데 UPDATE를 하려고 한다는 오류가 발생하면
Slave의 TABLE_A에 Master 테이블과 동일한 데이터를 넣어주는 노가다 방식

Slave MySQL 커맨드에서 stop, start를 해줬더니 해결되는 경우도 있었다

mysql> stop slave;
mysql> start slave;

# Slave 상태 다시 확인
mysql> show slave status\G;

 

3. Read_Master_Log_Pos가 Master의 Position과 매칭이 되고 있는가

Master_Log_File: mysql-bin.000104
Read_Master_Log_Pos: 53302

위에 보이는 정보와 Master의 상태 정보에서 확인할 수 있는 File, Position 값이 동일한지 확인한다

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000104 |    53416 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

File이 다를 경우 CHANGE MASTER TO ~ 의 설정을 통해 File과 Position 지정을 다시 해줘야 하며,

Position의 경우 아래 해결방안을 따른다

 

◆ 해결방안

위 에러들은 Replication이 이루어지면서 주로 발생하는 오류들로 초기 대응 후 Slave의 MySQL 설정 파일에서 에러를 무시하는 옵션을 추가해주었다

 

1. 초기 대응 : skip-counter를 설정해주며 slave 껐다 켜기

mysql> stop slave;
mysql> set global sql_slave_skip_counter=1;
mysql> start slave;

# Slave 상태 다시 확인
mysql> show slave status\G;

이렇게 했을 때,

1번에서 No로 되어있던 Slave Running 상태가 둘 다 Yes로 변해있으면서 Master의 Position과 동일하다면 문제가 해결된 것이다

 

다시 발생하지 않도록, 설정파일에 옵션을 추가한다

 

2. 설정 옵션 slave-skip-errors 추가

Slave DB가 있는 서버에서 작업한다

설정 파일의 경로는 설치 방식에 따라 다를 수 있다

# vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
slave-skip-errors=1062,1032

# systemctl restart mysql

이렇게 해서 문제없이 mysql이 재시작되었다면 완료.

728x90

댓글