반응형
MySQL 복제를 운영하다 보면 처음에는 잘 작동하지만,
시간이 지나면서 다양한 이유로 복제가 중단되거나 지연되는 문제가 발생한다.
이 문제들은 대부분 사소한 실수나 설정 누락에서 시작되며,
사전 예방이나 정확한 원인 파악만으로도 쉽게 해결 가능하다.

❗ 1. 복제 중단 (Replica_SQL_Running: No)
원인 예시
- Master에서 DROP/ALTER된 테이블을 Slave에서 찾지 못함
- 제약 조건 충돌 (PK 중복, FK 오류 등)
- 데이터 불일치로 쿼리 실행 실패
해결 방법
SHOW REPLICA STATUS\G
-- 또는
SHOW SLAVE STATUS\G
Last_SQL_Error 메시지 확인 후, 데이터 손실을 감수할 수 있다면 다음 명령으로 복구 가능
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START REPLICA;
주의: 오류가 반복될 경우, Slave 데이터를 초기화 후 재복제하는 것이 안전
반응형
❗ 2. Seconds_Behind_Source 값이 계속 증가함
원인 예시
- Slave 서버 리소스 부족 (CPU, Disk I/O 등)
- Master에서 대량 트랜잭션 발생
- 네트워크 지연으로 I/O 쓰레드가 밀림
해결 방법
- SHOW PROCESSLIST로 Slave SQL 쓰레드 상태 확인
- SHOW ENGINE INNODB STATUS로 록 병목 확인
- 리소스 부족 시 인스턴스 사양 업그레이드 또는 Slave 분산 구성
❗ 3. 바이너리 로그 삭제로 복제 불가능
상황 예시
Master에서 오래된 binlog가 자동 삭제되었고,
Slave가 아직 해당 위치를 읽지 못했을 경우
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log
해결 방법
- RESET REPLICA ALL 또는 RESET SLAVE ALL 후
새로 백업을 받아 복제 재구성 필요
STOP REPLICA;
RESET REPLICA ALL;
CHANGE REPLICATION SOURCE TO ...
START REPLICA;
반응형
❗ 4. GTID 복제에서 복제 안됨 (GTID Mismatch)
원인 예시
- GTID가 충돌함 (같은 GTID가 Master, Slave 양쪽에 존재)
- Slave가 실행한 트랜잭션을 Master가 갖고 있지 않음
해결 방법
- Slave에서 현재 GTID 목록 확인
SHOW VARIABLES LIKE 'gtid_executed';
- 문제 해결이 복잡할 경우, Slave 재동기화가 가장 빠름
❗ 5. Duplicate entry 에러로 복제 멈춤
Last_SQL_Error: Error 'Duplicate entry '1001' for key 'PRIMARY''
원인
- Slave에서 수동으로 입력한 데이터가 Master와 충돌
- 복제 쿼리 실행 시 PK 충돌 발생
해결 방법
- 데이터 정합성 확보 후 SQL_SLAVE_SKIP_COUNTER로 건너뛰기
- 또는 Slave 초기화 후 Master에서 다시 덤프 복제
🧠 실무 팁 요약
- SHOW REPLICA STATUS\G는 복제 트러블슈팅의 핵심
- 복제 지연 원인은 대부분 I/O, SQL 쓰레드, 락, 자원 부족
- Slave 서버에는 read_only = 1 설정 필수
- 정기적으로 binlog 보존일 수명 설정 확인 (expire_logs_days)
- 장애 발생 시 대비해 복제 백업 자동화 스크립트 구축 권장
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/replication-solutions.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (고가용성4️⃣) Group Replication vs MHA 실무 비교와 선택 가이드 (0) | 2025.07.17 |
|---|---|
| [MySQL] (고가용성3️⃣) MHA 구성 방법과 장애 복구 흐름 정리 (2) | 2025.07.17 |
| [MySQL] (고가용성2️⃣) Group Replication 구성과 특징 완전 분석 (0) | 2025.07.17 |
| [MySQL] (고가용성1️⃣) MySQL 고가용성 개념과 클러스터링 구조 이해하기 (3) | 2025.07.17 |
| [MySQL] (복제구조3️⃣) GTID 기반 복제 완전 이해하기 (0) | 2025.07.16 |
| [MySQL] (복제구조2️⃣) Master-Slave 복제 설정 실습 가이드 (0) | 2025.07.16 |
| [MySQL] (복제구조1️⃣) MySQL 복제란? 구조와 개념 완전 정리 (0) | 2025.07.16 |
| [MySQL] (보안설정5️⃣) 실무에서 자주 놓치는 보안 설정 체크리스트 (0) | 2025.07.16 |