sklass의 s-class 프로그래밍 blog

MySQL/MariaDB 데이터를 AWS RDS MySQL/MariaDB로 migrate 하는 법 본문

MySQL

MySQL/MariaDB 데이터를 AWS RDS MySQL/MariaDB로 migrate 하는 법

sklass 2021. 11. 29. 18:07

로컬 MySQL에서 AWS에서 제공하는 RDS MySQL로 데이터베이스를 교체하려 할 때, 현재 로컬 DB의 데이터를 RDS로 복사를 시켜야 하는 경우가 있습니다. 그런 경우 아래와 같이, mysqldump 명령어를 사용하여 처리하면 됩니다.

$ mysqldump -u <LOCAL_USER> \
    --databases <LOCAL_DATABASE_NAME> \
    --single-transaction \
    --compress \
    --order-by-primary  \
    --routines=0 \
    --triggers=0 \
    --events=0 \
    --no-tablespaces \
    -p<LOCAL_PASSWORD> | mysql -u <RDS_USER> \
        --port=<RDS_PORT> \
        --host=<RDS_ENDPOINT_URL> \
        -p<RDS_PASSWORD>

사용되는 옵션들은 다음과 같습니다.

  • -u <LOCAL_USER>: 로컬 MySQL의 유저 name을 입력합니다.
  • --databases <LOCAL_DATABASE_NAME>: 로컬 MySQL 또는 MariaDB 의 데이터베이스 name을 입력해줍니다.
  • --single-transaction: 로컬 데이터베이스에서 로드한 모든 데이터가 단일 시점에서 일치하는지 확인하기 위해 사용합니다. mysqldump 가 데이터를 읽는 동안 데이터를 변경하는 다른 프로세스가 있는 경우, 이 옵션을 사용하여 데이터 무결성을 유지합니다.
  • --compress: 데이터를 Amazon RDS로 전송하기 전에 로컬 데이터베이스에서 데이터를 압축하여 네트워크 대역폭 사용을 줄이기 위해 사용합니다.
  • --order-by-primary: 기본 키를 기준으로 각 테이블의 데이터를 정렬하여 로드 시간을 줄이기 위해 사용합니다.
  • --routines=0: stored routines 정보를 포함하지 않고 dump합니다.
  • --triggers=0: 트리거 정보를 포함하지 않고 dump합니다.
  • --events=0: dump 파일에 이벤트 관련 정보를 포함하지 않고 dump 합니다.
  • --no-tablespaces: 이 옵션을 추가하지 않으면, 아래와 같은 에러가 떠서 추가해 주었습니다. 옵션 자체가 하는 역할은 output으로 CREATE LOGFILE GROUP 나 CREATE TABLESPACE를 포함하지 않는 것 입니다.
    • mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) 
      for this operation' when trying to dump tablespaces
  • -p<LOCAL_PASSWORD>: 로컬 데이터베이스의 암호를 입력해줍니다. 주의할 점은, -p 옵션과 입력한 암호사이에 공백이 없어야 합니다.
  • mysql -u <RDS_USER>: RDS에 설정된 MySQL 유저 name을 입력합니다.
  • --port=<RDS_PORT>: RDS가 지정한 포트를 입력합니다.
  • --host=<RDS_ENDPOINT_URL>: RDS의 Endpoint url을 입력합니다.
  • -p<RDS_PASSWORD>: RDS MySQL의 암호를 입력해줍니다.

 

그 후, Django의 settings.py에 가서, DATABASES 의 설정을 아래와 같이 바꿔줍니다.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": <RDS_DATABASE_NAME>,
        "USER": <RDS_USER>,
        "PASSWORD": <RDS_PASSWORD>,
        "DEFAULT_CHARACTER_SET": "utf8",
        "HOST": <RDS_ENDPOINT_URL>,
        "PORT": <RDS_PORT>,
        "OPTIONS": {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

 

이렇게 하면, 먼저 로컬에 저장된 MySQL 데이터를 RDS로 복사시킨뒤, Django와 같은 웹프레임워크에서 DB관련 설정을 RDS로 교체해주면서 로컬에서 리모트로 안전하게 데이터베이스 이전이 가능해집니다.

 

References

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.SmallExisting.html

 

MySQL 또는 MariaDB DB에서 MySQL 또는 MariaDB DB 인스턴스로 데이터 가져오기 - Amazon Relational Database Servic

MySQL 또는 MariaDB DB에서 MySQL 또는 MariaDB DB 인스턴스로 데이터 가져오기 시나리오에서 이 방법이 지원되는 경우 백업 파일 및 Amazon S3를 사용하여 Amazon RDS 내부 및 외부로 데이터를 더 쉽게 이동할

docs.aws.amazon.com