언제 사용하는가?
MySQL 데이터를 다른 MySQL 인스턴스로 옮겨야 할 때가 있다.
- 운영 환경 DB 데이터를 개발 환경의 DB로 옮길 때
- 온-프레미스로 운영하던 DB를 AWS RDS 같은 클라우드 서비스로 옮길 때
- 데이터 백업, 아카이빙
- MySQL 재설치
사이드프로젝트에서 기존에는 비용 문제로 인해 docker-compose 를 이용해 단일 EC2 애플리케이션과 mysql 을 띄워 실행시켰다.
이번에 인프라 구성을 RDS 로 변경하게 되면서 RDS 로 기존 데이터를 옮기는 작업이 필요하므로, 2번 상황에 해당한다.
이 때 데이터 덤프, 임포트 작업이 필요하며 mysql 의 경우 mysql-client 를 이용한다. (Mysql Workbench 를 쓰더라도 내부적으로 mysql-client 의 mysqldump 명령어를 사용한다.)
mysqldump 를 사용하려면 mysql-client 가 설치되어 있어야 한다.
# Mac
brew install mysql-client
# Linux
apt-get update
sudo apt-get install mysql-client
데이터 Dump 하기
먼저 ssh 를 통해 인스턴스로 접속해 mysql 컨테이너에 있는 데이터들을 가져와 EC2 인스턴스에 dump 파일을 만든다.
docker exec -i ${CONTAINER_NAME} mysqldump -u ${DB_USER} -p ${DB_NAME} > dump.sql

- `-i`: 입력을 처리하기 위해 표준 입력이 필요하므로
- `>`: 리다이렉션
도커는 리눅스 기반 기술로 동작하고, docker exec 명령어는 컨테이너 내부에서 실행한 결과를 호스트의 stdout으로 전달한다. 이 stdout을 리다이렉션 `>` 하면 호스트의 파일로 저장된다.
추가 옵션
- --compact: 불필요한 주석이나 빈 줄을 제거하여 덤프 파일 크기를 줄임
- --extended-insert: 다중 행을 하나의 INSERT 문으로 생성해 덤프 파일 크기를 줄이고, 복원 속도를 높임
- --quick: 메모리를 절약하기 위해 한 번에 한 행씩 데이터를 가져옴. 큰 데이터베이스를 백업할 때 유용
- --single-transaction: 데이터베이스를 백업할 때 트랜잭션을 사용 (백업 중 데이터가 일관성 유지 필요시)
데이터 import 하기
ec2 에 있는 dump 파일을 rds에 존재하는 데이터베이스에 적용시켜줘야 한다.
필자의경우 보안그룹참조를 이용해 EC2에서 RDS로 접근할 수 있도록 구성되어 있어 아래 명령어로 적용이 가능했다.
mysql -h ${RDS_ENDPOINT} -P ${RDS_PORT} -u ${RDS_USER} -p ${RDS_DATABASE} < dump.sql
Bastion Host 를 통해 ssh포트포워딩 후 Datagrip 에서 정상적으로 테이블이 생성된 것을 확인했다.

References
