데이터베이스 마이그레이션 - woowacourse-teams/2020-songpa-people GitHub Wiki

배경

현재 HashtagMap-DB 인스턴스는 24시가 되면 자동으로 종료된다.

새로운 인스턴스에 데이터베이스 서버를 구축하기 위해 기존에 수집한 데이터를 옮겨야 한다.

데이터를 옮길 때 기존의 데이터베이스와 동일한 환경을 구축한 후 데이터를 다시 수집하는 방법이 있지만 시간이 오래 걸리고 아직 수집 기능이 완성되지 않았기 때문에 어플리케이션 내에서 수행할 수 없다.

따라서 기존의 데이터베이스에서 저장되어 있는 데이터만 추출한 후 다른 데이터베이스로 옮기는 작업이 필요하다.

지금은 개발용 데이터베이스끼리 데이터를 옮기지만 이 데이터를 배포용 데이터베이스에 저장할 때도 사용할 수 있다.

기술

  • EC2 인스턴스 2개(기존 데이터베이스 인스턴스, 배포용 데이터베이스를 설치할 인스턴스)
  • MariaDB 10.1 → 지원 기간이 2020년 10월 까지이므로 추후에 버전 업데이트가 필요하다.
  • sftp

마이그레이션

기본 설정

  • EC2-HashtagMap-DB: 24시에 종료되는 인스턴스. 여기에 설치된 데이터베이스에서 데이터를 추출한다.
  • EC2-HashtagMap-ProdDB: 자동으로 종료되지 않는 인스턴스. 기존의 데이터베이스에서 추출한 데이터를 저장할 데이터베이스를 구축한다.

MariaDB 설치 방법은 다음 사이트를 참고한다.

MariaDB - Setting up MariaDB Repositories - MariaDB

우리가 사용하는 인스턴스는 Ubuntu 18.04 LTS 이다.

인스턴스에 MariaDB를 설치한 후 /etc/mysql/my.cnf 의 bind-address 설정 값을 주석 처리해서 외부 접속을 허용해준다.

데이터를 추출할 데이터베이스에서 데이터를 추출하는 과정을 덤프라고 한다.

먼저 새로운 데이터베이스에 기존 데이터베이스와 동일한 계정 정보를 추가해준다.

예를 들어, 우리 서비스의 경우 songpapeople, songpa-dev 라는 계정을 추가해서 외부에서 데이터베이스에 접근 가능한 권한을 부여해 놓았다.

계정 정보는 접근 권한 때문에 테이블 정보를 덤프해서 직접 넣어줄 수 없으므로 직접 추가해 주어야 한다.

  • 기존 데이터베이스 정보

image

  • 추가할 데이터베이스 정보

image

database dump

우리가 기존 데이터베이스 인스턴스에서 추출할 데이터베이스 정보는 hashtagmap, hashtagmap-dev 이다.

먼저 ssh 를 이용해서 기존 데이터베이스 인스턴스에 접속한다.

그 후 데이터베이스 정보 덤프 명령어를 실행한다.

image

덤프 명령어는 다음과 같다.

$ mysqldump -u root -p --databases hashtagmap hashtagmap_dev > original-db.sql
  • mysqldump: 지정한 데이터베이스를 덤프하는 명령어다.
  • -u root -p: -u 옵션은 데이터베이스 접속 권한을 가진 계정을 선택하는 것이다. root 는 접속할 계정 이름이다. -p 는 패스워드를 사용해 데이터베이스에 접속한다는 뜻이다.
  • —databases: 지금 우리가 덤프할 데이터베이스는 총 두 개이다. 따라서 복수의 데이터베이스를 덤프하겠다는 옵션을 주는 것이다.
  • hashtagmap hashtagmap_dev: 덤프를 수행할 데이터베이스를 적어준다. 현재 —databases 옵션으로 복수의 데이터베이스를 선택한다. 데이터베이스 이름은 공백으로 구분해서 적어준다.
  • original-db.sql: 덤프를 수행한 정보를 저장할 sql 파일 이름을 지정한다.

sftp를 사용한 덤프 파일 전송

sftp를 이용해 파일을 전송하는 과정은 다음과 같다.

기존의 데이터베이스 인스턴스에서 original-db.sql 파일을 내 로컬로 다운받기 
→ 
로컬에서 original-db.sql 파일을 새로운 데이터베이스 인스턴스로 전송하기

mac 사용자는 터미널에서 sftp 연결을 이용하고 windows 사용자는 Filezilla를 이용해서 sftp 연결을 사용한다.

sftp를 이용하기 위해서는 인스턴스들의 pem 파일이 필요하다.

기존의 인스턴스와 로컬 연결하기

기존 인스턴스의 pem 파일이 저장된 디렉토리로 이동해서 다음 명령어를 수행한다.

image

  • ssh 연결과 동일하게 sftp 연결을 수행한다.
  • sftp 연결이 완료되면 ls 명령어를 이용해서 덤프한 파일이 있는지 확인한 후 get 명령어를 이용해 데이터를 로컬로 다운받는다.
  • 파일이 다운로드 되는 위치는 기본적으로 sftp 연결을 수행한 디렉토리다.

로컬과 새로운 인스턴스 연결해서 파일 전송하기

새로운 인스턴스의 pem 파일이 저장된 디렉토리로 이동해서 다음 명령어를 수행한다.

image

  • sftp 연결을 수행한 상태에서 !명령어 를 수행하면 로컬 환경에 명령어를 적용한 결과가 나타난다.
  • put 명령어를 이용해서 로컬에 있는 파일을 인스턴스로 전송한다.

인스턴스에 파일이 전송된 결과화면이다.

image

덤프 파일을 데이터베이스에 추가하기

다음 명령어를 이용해서 덤프 파일의 정보를 데이터베이스에 반영한다.

image

$ mysql -u root -p < original-db.sql
  • 기존의 덤프를 수행하는 명령어와 차이점은 데이터베이스 정보를 반영하기 위해 다른 옵션을 주지 않아도 되는 것이다.

  • 만약 특정 단일 데이터베이스를 추출한 후 새로운 데이터베이스에 추가할 때는 다음 사이트를 참고한다.

    How To Import and Export Databases in MySQL or MariaDB | DigitalOcean

  • 새로 추가된 결과를 보면 데이터베이스가 생성되었다.

기존 데이터베이스 중 hashtagmap은 테이블만 존재하고 내부에 데이터가 없었으므로 hashtagmap_dev 데이터베이스를 이용해 제대로 값이 추가되었는지 확인해본다.

image

마이그레이션이 정상적으로 적용된 모습이다.

추후 과제

  • MariaDB의 지원이 종료되기 전 버전을 업그레이드 한다.
  • hashtagmap_dev 데이터베이스에 실제 배포에 사용할 데이터가 쌓이면 이 데이터를 hashtagmap 으로 마이그레이션 한다.