readonly복제본 DB의 복제 중단 이슈

hyuckhoon.ko·2024년 3월 7일
0

서비스를 운영하다보면 readonly 복제본 DB가 필요할 때가 있다.
API 중 읽기는 모든 요청의 대부분을 차지한다.
읽기만 하는 API에 읽기 전용 DB를 사용하면 좋다.
또는 읽기 전용 DB에 복잡한 쿼리를 질의하는 것도 좋다.

복제본 DB 파업 선언!

Read Replica Replication Error - SQLError: 1062, reason: Could not execute Write_rows event on table {테이블 이름(보안은 위해 수정)}; Duplicate entry '537273' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin-changelog.114186, end_log_pos 389929

요약해보면 이렇다.

에러코드에러명상세
1062HA_ERR_FOUND_DUPP_KEY테이블에 PK(537273)가 이미 있는데, 중복된 PK를 갖는 데이터를 추가.

추가 디테일한 사항은 로그 파일을 찾아보라고 하고 있다.(mysql-bin-changelog.114186)

AWS 공식문서 확인하기

MySQL RDS의 replication errors를 어떻게 트러블 슈팅하나요

Error 1062

  • Handler error HA_ERR_FOUND_DUPP_KEY

AWS에서는 이 에러는 주로 아래의 원인들로 발생한다고 한다.
1) 트랜잭션이 중복된 PK값을 지닌 데이터를 넣으려고 할 때
2) 트랜잭션이 중복된 유니크 값을 지닌 데이터를 넣으려고 할 때
3) 트랜잭션이 중복된 PK 또는 유니크한 값 constraint이 걸려있는 데이터를 넣으려고 할 때
4) 이벤트 스케줄러로 개시된 트랙잭션이 데이터 비일관성을 만들었을 때

또한, AWS에서는 이 문제를 해결하기 위해 중복된 키 이슈가 발생한 테이블을 확인하라고 한다.
그리고 중복된 에러를 일으킨 문제의 애플리케이션 코드를 개선하라고 한다.

바이너리 로그 다운받기

show binary logs;

저기 바이너리 로그가 있다.

두 가지 걱정이 앞선다.

  • 저 바이너리 로그는 언제 제거되지?
  • 제거되기 전에 다운로드 받아야 하는데, 어떻게 하지?

바이너리 로그는 언제 제거되지?

show global variables like 'expire%';

5.7 버전에서는 expire_logs_days로 검색이 가능하다.(deprecated 예정)

결과가 0인 것을 보니 로그를 삭제하지 않고 있다.

바이너리 로그 어떻게 다운받지?

역시 AWS에서 제공하는 공식문서를 확인했다.
MySQL binary logs 접근하기

터미널에서 아래 명령어를 입력했다.

mysqlbinlog \
--read-from-remote-server \
--host={호스트 주소} \
--port={포트번호} \
--user {사용자명} \
--password \
--raw \
--verbose \
--result-file=/tmp/ \
mysql-bin-changelog.114186

다운로드받은 바이너리 로그 파일을 읽어보자.

mysqlbinlog ~/Desktop/mysql-bin-changelog.114186 > ~/Desktop/로그분석.txt

바이너리 로그 확인하기

로그분석.txt 파일을 vscode로 확인했다.
최초의 에러 메시지에서 나왔듯이, end_log_pos 389929 를 검색해봤다.

#240306 19:57:22 server id {서버 ID} end_log_pos 389847 CRC32 0xb9175278 	Table_map: `profile` mapped to number 120
# at 389847
#240306 19:57:22 server id {서버 ID}  end_log_pos 389929 CRC32 0x3215e711 	Write_rows: table id 120 flags: STMT_END_F

구체적으로 어떤 에러가 발생했다는 것은 알기 어려웠다.
19시 57분 22초에 최초 에러가 발생했다는 점 이외에 특별한 내용을 파악하기가 어려웠다.

역시 코드를 수정해야 한다.

0개의 댓글