AWS -> NCloud로 데이터베이스 옮기기(mysqldump, docker)

2023. 6. 18. 22:36Database

Intro

AWS 지원이 중단되면서, NCP로 기존에 운영중인 서버를 옮겼습니다.
같은 Ubuntu 22.04 환경으로 설정한 덕분에 도커나 Nginx 설정은 금방 할 수 있었습니다.

하지만 기존 서버의 데이터는 다 날라가고 없었기 때문에 mysqldump를 이용해 기존 서버의 데이터를 그대로 가져와서 덮어쓰기 했습니다.

해당 포스팅은 mysqldump를 이용해 AWS  -> NCloud로 이관하는 과정을 다룹니다.

작업은 크게 3단계로 나뉩니다.

1. AWS EC2의 도커 MySQL 컨테이너에 접속하여 dump 파일 생성

2. 생성한 dump 파일을 NCloud 서버로 전송

3. 전송한 dump 파일을 NCloud의 도커 MySQL 컨테이너로 전달


mysqldump란?

MySQL의 대표적인 백업 프로그램입니다. 스토리지 엔진이 무엇이든 데이터를 저장하고 불러오는 tool입니다.
따라서 dump하려는 테이블에 SELECT, SHOW VIEW, TRIGGER 권한이 필요합니다. 
저는 두 서버 모두 root 계정을 이용해서 dump를 진행했습니다.

dump 파일을 살펴보면 다음과 같이 구성되어 있습니다.
dump할 데이터베이스의 모든 테이블과 데이터를 Create, Insert 쿼리로 저장하고 있습니다. 저희 프로젝트에서는 데이터의 양이 적어서 dump를 수행하는데에 매우 짧은 시간이 걸렸습니다. 

 


작업

1. AWS EC2의 도커 MySQL 컨테이너에 접속하여 dump 파일 생성

# 실행중인 Docker의 컨테이너 확인
docker ps

# Docker MySQL의 sh 접속
docker exec -it [Container-ID] sh
  
# MySQL 데이터 Dump(컨테이너 내부 /tmp 하위에 dump 파일 생성)
mysqldump -uroot -p [Database-Name] > /tmp/[File-Name].sql
  
# 해당 경로에 생성 확인
ls -al /tmp
  
# Docker Container 밖으로 파일 복사
docker cp [Container-ID]:/tmp/[File-Name].sql [PC의 저장할 경로]

저는 dump 파일명을 backup.sql로 지정했습니다. backup.sql 파일을 도커 컨테이너 내부 /tmp에 생성합니다.

이후 도커 컨테이너 /tmp에서 ubuntu의 /tmp 디렉토리로 backup.sql 파일을 옮깁니다.
 
ubuntu의 /tmp 디렉토리로 이동하면 dump 파일이 성공적으로 생성되어 복사까지 완료된 것을 확인할 수 있습니다.
tmp 이름을 가진 디렉토리가 두 개 이상일 수 있으니 헷갈리시면 안됩니다(경험담).

 

2. 생성한 dump 파일을 NCloud 서버로 전송

이 backup.sql 파일을 NCloud 서버로 전송해보겠습니다.
여기서는 리눅스의 scp(secure copy) 명령어를 사용합니다. ssh를 이용하여 네트워크로 연결된 호스트간에 파일을 주고받는 명령어입니다. 

scp -P portnumber [이동할_파일] [이동할_디바이스_id]@[이동할_디바이스_ip]:[이동할_디바이스_내부_디렉토리]
default 포트번호가 22이므로 전송할 서버에 ssh 접속 포트가 22라면 생략할 수 있습니다.

저는 NCloud에도 destination을 동일하게 /tmp로 입력했습니다.

명령어를 입력하면 접속 패스워드를 요구합니다. 
이 패스워드는 NCloud의 관리자 비밀번호입니다. 

Ncloud > Server > 서버 관리 및 설정 변경 > 관리자 비밀번호 확인 탭에서 해당 서버의 인증 키를 넣어주면 발급받을 수 있습니다.

 

 

3. 전송한 dump 파일을 NCloud의 도커 MySQL 컨테이너로 전달

2번까지 진행하셨다면 NCloud(혹은 다른) 서버의 /tmp 디렉토리 내부에 dump 파일이 전달되었을 것입니다.

이제 해당 서버의 docker 컨테이너로 이 dump 파일을 전송하면 끝입니다.

# PC의 dump 파일을 Docker 안으로 복사
docker cp [PC의 SQL 파일 경로] [Container-ID]:/tmp
  
# Docker MySQL의 sh 접속
docker exec -it [Container-ID] sh
  
# MySQL 데이터 Import
mysql -uroot -p [Database-Name] < /tmp/[File-Name].sql

먼저 ubuntu의 /tmp에 있는 backup.sql을 도커 내부의 /tmp 디렉토리로 전송합니다.


이후 MySQL의 sh에 접속한 뒤 [Database-Name]에 해당 backup.sql을 덮어쓰기합니다. 

 


주의할 점

저는 애플리케이션 서버를 그대로 띄워놓고 데이터를 덮어쓰기했습니다.

데이터를 덮어쓰기 전에 애플리케이션에 로그인해두었는데, 데이터를 덮어쓰기하고 새로고침 해보니 다른 유저 정보로 로그인이 되어 있었습니다. 심지어 로그인 된 상태라 모든 기능을 이용할 수 있었습니다. 

아무래도 애플리케이션 서버를 재시작하는 과정은 꼭 필요할 것 같습니다.