서비스를 운영하다보면 readonly 복제본 DB가 필요할 때가 있다.
API 중 읽기는 모든 요청의 대부분을 차지한다.
읽기만 하는 API에 읽기 전용 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
요약해보면 이렇다.
에러코드 | 에러명 | 상세 |
---|---|---|
1062 | HA_ERR_FOUND_DUPP_KEY | 테이블에 PK(537273)가 이미 있는데, 중복된 PK를 갖는 데이터를 추가. |
추가 디테일한 사항은 로그 파일을 찾아보라고 하고 있다.(mysql-bin-changelog.114186
)
MySQL RDS의 replication errors를 어떻게 트러블 슈팅하나요
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초에 최초 에러가 발생했다는 점 이외에 특별한 내용을 파악하기가 어려웠다.
역시 코드를 수정해야 한다.