본문 바로가기
AWS & CICD

[AWS] RDS를 cmd로 localhost에 복제하기

by rla124 2025. 2. 23.

문제 상황

2024년 2월부터 배포했던 프로젝트에서 AWS 프리티어가 이번달 (2025.02)에 종료가 되는 상황이다. 내가 2024년 2월에 시작했던 또 다른 프로젝트를 운영하면서 이용했던 rds를 따로 복제해두지 못한 것에 대한 후회가 남아 AWS의 서로 다른 RDS 인스턴스 간 Replication이 가능하지만 새로운 계정으로 서버 마이그레이션을 하기 전 이 서비스는 내 로컬 상에도 기록 용으로 복제를 해두고자 한다.

 

먼저 db 복제라는 것은 물리적 기기를 복제하는 것이 아니라 테이블간 관계, 그 내부의 운영 시 테이블 내 데이터 등 모든 정보를 "SQL" 파일로 만들어서 내가 원하는 db에 그 sql 파일을 그대로 실행하여 똑같은 db를 만드는 것이다.

 

특별한 rdb 툴 설치 없이(이제 윈도우 드라이브 용량이 가득 찬 관계로... 진짜 컴공 학생 다 됐다...) 윈도우 cmd에서도 간단하게 이 작업이 가능한데 이 과정을 기록하고자 한다.

 

해결 과정

먼저 AWS RDS를 만들 당시 복제를 위해 필요한 정보는 아래와 같다.

1. rds 엔드포인트 

2. 사용자 이름

3. db 이름

위 세 가지면 충분하다.

 

윈도우 cmd 창을 열고 아래와 같은 명령어를 입력한다.

mysqldump -h <RDS-ENDPOINT> -u <USERNAME> -p --databases <DB_NAME> --single-transaction --quick --compress > backup.sql

 

실제 운영 서비스라 내가 실행했던 명령어 원본 공개는 불가능하여 <> 형식으로 표기를 대체하였다.

 

하지만 아래와 같은 오류에 직면했다.

Enter password: ******** (위 명령어 실행 후 AWS RDS 비번을 입력했더니)
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'master'@'%' (using password: YES) (1045)

 

원인 : rds 계정에 복제 시 필요한 권한이 부족하기 때문

만약 rds가 innoDB 테이블이라면 아래와 같은 옵션을 추가하면 해결 가능했다.

1. --single-transaction

musqldump를 사용하면 데이터가 변경될 가능성이 있다. 특히 지금처럼 서비스를 운영했던 db의 경우 데이터 변경 가능성이 있기 때문에 innoDB 엔진(MyISAM은 해당사항 없음)을 데이터베이스에서 데이터 일관성 및 정합성을 유지하면서 백업을 진행하기 위해  FLUSH TABLES WITH READ LOCK 명령어로 모든 테이블을 잠그고 백업을 하게 된다. 하지만 rds 상에 lock tables 권한이 없어서 실행이 안되는 문제가 있어 해당 옵션을 추가한다. 

이 옵션을 사용하면 테이블을 잠그지 않고 하나의 트랜잭션 범위에서 dump를 하여 dump 시작 시점의 데이터를 복제하게 된다. 따라서 백업 진행 중에도 crud가 가능해서 서비스가 정상적으로 운영된다.

 

2. --quick

메모리 사용 최적화를 하기 위해 사용한 옵션이다. mysqldump는 모든 데이터를 메모리에 로드 후 백업을 수행하려고 하는데 한꺼번에 로드하지 않고 한 줄 씩 읽어서 안정적으로 처리하도록 한다. 

 

3. --compress

aws rds 서버에서 데이터를 가져올 때 네트워크 트래픽이 많아지면 속도가 느려질 수 있기 때문에 대량 데이터 백업 시 네트워크 병목 발생을 방지하고자 네트워크 부하를 줄이는 옵션이다.

 

4. --set-gtid-purged=OFF

현재 내 환경에서 rds는 GTID(Global Transaction ID) 기반 복제가 활성화 되어있다. 따라서 mysqldump는 기본적으로 FLUSH TABLES WITH READ LOCK을 실행하려고 하는데 GTID가 활성화 된 경우 강력한 권한이 필요할 수 있다. 따라서 이 옵션으로 mysqldump이 기본적으로 SET @@GLOBAL.GTID_PURGED 값을 설정하려고 하는데 이를 변경하지 않고 백업이 진행되도록 한다.

 

실제 성공 명령어

C:\Users\{나의 윈도우 사용자 명}>mysqldump -h <RDS-ENDPOINT> -u <USERNAME> -p --single-transaction --quick --compress --set-gtid-purged=OFF --databases <DB_NAME> > backup.sql
WARNING: --compress is deprecated and will be removed in a future version. Use --compression-algorithms instead.
Enter password: ********

 

 

그러면 이제 cmd가 실행되던 경로!
내 경우는 c 드라이브의 내 윈도우 사용자 명 경로에 backup.sql이 저장된 것을 확인할 수 있었다.

만들어진 backup.sql

 

이제 이 파일을 mysql workbench에서 읽어들여 실행하면 내 로컬 호스트에 완전히 db가 복제된 것을 확인할 수 있다~ 내부 데이터까지~~

local instance에도 db가 복제된 상황이다!!

 

로컬 환경에서 replica 생성 완료!