※ 개발 환경
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가지 정도
- Slave_IO_Running과 Slave_SQL_Running이 Yes로 정상 작동 중인가
- Laster_Errno와 Last_Error를 통해 어떤 에러코드를 가진 에러가 발생했는가
- 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가지 정도였다
- 1062 Duplicate entry : 키 중복 오류
- 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이 재시작되었다면 완료.
'인간세상의 종말이 도래해따 > 오류' 카테고리의 다른 글
[Django] ImageField의 media 경로를 일부만 받아오는 오류 (0) | 2024.01.16 |
---|---|
[python] TypeError: warn() missing 1 required keyword-only argument: 'stacklevel' 해결 완료 (0) | 2023.09.26 |
(해결함) 갤럭시핏2 웨어러블 앱 연결실패 (0) | 2023.05.04 |
Windows 환경에서 github 여러 계정 사용할 때 ssh-add 오류 (1) | 2022.05.09 |
[MS 제품키 인증] 제품키 인증 오류 0x80070490 (0) | 2019.09.03 |
댓글