Article

MariaDB/MySQL 빠르게 백업과 복원하기

MariaDB 빠르게 백업하고 복원하기

상황

RDS MariaDB에서 RDS Aurora로 마이그레이션하게 되었습니다.

매월 1~2만 명의 사용자가 증가하고 있었고, 피크 타임과 이벤트 타임에 데이터베이스를 유연하게 관리하기 위해 MariaDB에서 Aurora로 전환하기로 결정했습니다.

문제는 데이터가 너무 많았습니다.

초대형 사이트의 테라바이트 규모는 아니지만, 필자의 경력 중 가장 많은 데이터였습니다.

문제 발생

처음에는 아무런 옵션 없이 QA 서버를 백업/복원했더니 4시간 이상이 걸렸습니다.

(참고: 프로덕션 > 스테이징 > QA 서버 순으로 한 달 전 데이터가 배포됩니다)

무식한 방법임을 깨달았고, 최적화 방법을 찾아 이후 프로젝트를 위해 기록합니다.

최적화 옵션

1. —no-autocommit=1

역할: autocommit을 비활성화합니다. 테이블의 모든 작성이 완료된 후에 한 번에 커밋합니다.

장점:

  • 커밋 오버헤드 감소
  • 전체 프로세스 속도 향상

주의: 중간에 실패하면 처음부터 다시 시작해야 합니다.

2. —single-transaction=1

역할: 작업 후 변경 사항을 적용하지 않습니다.

의미: 이 옵션이 없으면 변경 사항이 적용되겠지만, 대용량 작업 시에는 서버를 내리고 진행하므로 필수입니다.

3. —extended-insert=1

역할: 여러 INSERT 문을 한 번에 처리합니다.

변환 예시:

변환 전:

INSERT INTO `A` VALUES (1);
INSERT INTO `A` VALUES (2);
INSERT INTO `A` VALUES (3);

변환 후:

INSERT INTO `A` VALUES (1), (2), (3);

이렇게 처리하면 네트워크 오버헤드와 데이터베이스 처리 횟수가 줄어듭니다.

AWS 환경에서의 추가 팁

AWS RDS를 사용 중이라면:

  • 같은 리전 사용
  • 같은 가용영역(Availability Zone) 사용

이 조건들을 맞추면 마이그레이션 속도가 매우 빨라집니다.

실제 백업 및 복원 명령어

최적화된 백업

mysqldump -h[HOST_URL] -u[DB_ID] -p[PASSWORD] \
--databases [DB_NAME] \
--no-autocommit=1 \
--single-transaction=1 \
--extended-insert=1 > [SQL_FILE_NAME].sql

복원

mysql -h[HOST_URL] -u[DB_ID] -p[PASSWORD] --database [DB_NAME] < [SQL_FILE_NAME].sql

특정 테이블 제외하기

단일 테이블 제외

mysqldump -u root -p DBname --ignore-table=DBname.tbname > 저장파일명.sql

다중 테이블 제외

mysqldump -u root -p DBname --ignore-table=DBname.tbname1 --ignore-table=DBname.tbname2 > 저장파일명.sql

최적화 효과 비교

본 경험에서 적용한 최적화 옵션들의 효과:

단계백업 시간개선사항
옵션 없음4시간+기준점
—extended-insert 만 적용~2시간50% 개선
모든 옵션 적용~1시간 이내75% 이상 개선

마치며

대용량 데이터베이스 백업은 작은 최적화가 모여 큰 효과를 만듭니다. 위의 옵션들을 올바르게 적용하면 백업 시간을 크게 단축할 수 있습니다.

특히 --extended-insert--no-autocommit 옵션만 적용해도 상당한 성능 향상을 기대할 수 있습니다. 대규모 마이그레이션이나 AWS RDS 환경에서 작업할 때는 꼭 이 옵션들을 사용하여 시간과 비용을 절약하시기 바랍니다.

댓글