요구사항
AWS에 구성된 MariaDB(RDS), MongoDB 운영DB 데이터를 개발로 이관(백업)하자
제약사항
- MariaDB(운영)는 Private Subnet에 존재해서 로컬에서 직접 접근이 불가하다.
- MariaDB(개발, 운영)은 RDS로 서비스 중이므로 서버 명령어를 직접적으로 실행시킬 수 없다.
- 이관 시 새로운 스키마/DB를 개발 DB에 미리 생성하고, 생성한 스키마/DB에 운영 데이터를 이관해야한다.
작업 시작
빠르게 처리해야만 하는 Task여서 여러가지 방법을 비교하거나 고려하지는 못했다.
더 좋은 방법이 있을 것 같지만, Task를 진행하는 순간에는 아래 방법이 가장 빠르다고 판단했다.
나는 운영DB에서 데이터를 로컬로 백업한 다음, 다시 개발 DB에 넣어주는 플로우를 선택했다. (모든 작업은 로컬에서 진행했다.)
step 1. 커넥션 맺기
운영 환경에 배포된 데이터를 가져오기 위해서는 우선 데이터를 가져올 DB와 커넥션을 맺어야한다. MongoDB(운영)는 직접 접근이 가능하여 문제는 없었지만, MariaDB(운영)은 AWS Private Subnet에 존재하여 로컬에서 직접 접근이 불가했었다.
MariaDB(운영)에 접속할 수 있는 베스천 서버로 터널링하여 로컬에서 MariaDB(운영)에 접속할 수 있도록 했다. 대충 그림을 그려보면 아래와 같다.
ssh를 통해 bastion 서버를 터널링하는 명령어
ssh -i ~/keys/connect-bastion.pem ec2-user@124.123.23.32 -L 33306:prod.dqdqwfwehfbewhjfbw.ap-northeast-2.rds.amazonaws.com:3306 -N
-i : 접속할 때 사용할 keypair를 지정한다.
-L : 로컬 포트포워딩, localhost:33306으로 접속하면 prod.dqdqwfwehfbewhjfbw.ap-northeast-2.rds.amazonaws.com:3306으로 접속한 것처럼 사용할 수 있다.
-N : bastion 서버에서 아무 명령어를 사용하지 않는다는 옵션 (생략 시 bastion 서버 쉘에 접속, 생략가능)
step 2. 데이터 백업(덤프)
주의사항: 로컬에서 운영DB에 명령어 수행하기 위해 로컬PC에 MariaDB와 MongoDB가 미리 설치되어 있어야한다. (Client 역할 수행)
MariaDB(운영) 백업
mysqldump -P 33306 -h 127.0.0.1 --routines --triggers -u dbuser -pPassword!@ table_name --default-character-set utf8 > ~/works/backup/dump.sql
-P: 접속할 서버의 Port 입력. 터널링 한 Port 입력 (33306)
-h: 호스트/IP 주소, 로컬 포트포워딩을 수행했으니 호스트는 결국 localhost(127.0.0.1)
--routines: 프로시저와 함수 백업
--triggers: 트리거 백업
-u: DB 서버에 로그인할 사용자 이름 (dbuser)
-p: DB 서버에 로그인할 사용자의 비밀번호를 지정합니다. -p와 패스워드 사이 공백없이 입력
table_name: 백업하려는 테이블 이름
--default-character-set utf8: 백업 파일의 문자셋을 utf8로 설정
~/works/backup/dump.sql: 백업 데이터를 저장할 경로와 파일명을 지정
MongoDB(운영) 백업
mongodump --uri="mongodb+srv://username:password@prod-example-monog.wdfw.mongodb.net/example-db“ --out=works/backup-mongo
--uri: MongoDB에 연결하기 위한 URI를 지정
--out: 백업 데이터를 저장할 디렉터리를 지정
step 3. DB/Schema 생성
MariaDB(개발), MongoDB(개발)에 각각 운영데이터를 넣을 DB/Schema를 생성한다. 이 부분은 굳이 명령어를 사용하지 않고 DB접속 Tool를 이용해 생성했다.
신규 생성한 DB/Schema 이름은 아래와 같다고 가정한다.
MariaDB: example_prod
MongoDB: example-prod
step 4. 데이터 이관
MariaDB(개발) 데이터 이관
mysql -P 3306 -h dev-example-rds.fqewfwq.ap-northeast-2.rds.amazonaws.com -u dbuser -pPassword!@ example_prod < ~/works/backup/dump.sql
(옵션은 백업할 때와 동일)
MongoDB(개발) 데이터 이관
mongorestore --uri="mongodb+srv://username:password@dev-example-mongod.dqwdwqfw.mongodb.net" -d example-prod works/backup-mongo/example
-d: 데이터를 이관할 DB명 지정
MongoDB는 백업할 때 지정했던 경로와 이관할 때 지정한 경로가 상이하다. MariaDB와는 다르게 백업할 파일명을 지정하는게 아니라 디렉토리를 지정하기 때문에, DB가 여러개 있으면 전부 백업된다. DB목록 중 선택해서 넣어줄 수 있다.
'Backend > 데이터베이스' 카테고리의 다른 글
[PostgreSQL] Logical Replication로 데이터 Migration하기 (1) | 2024.10.13 |
---|---|
오라클 19c 설치 (REHL 8) with RPM (1) | 2024.02.13 |
MariaDB 명령어 정리 (테이블/유저/백업/복구) (0) | 2024.02.13 |
[데이터베이스 / DB] Error Code: 1175, You are using safe update mode and you tried to update a table without a WHERE.... 처리방법 (0) | 2021.02.23 |