티스토리 뷰
MariaDB 빠르게 백업하고 복원하기
이번에 RDS mariadb 에서 RDS auroradb 로 이전하게 되었다.
한달에 회원이 1~2만명 씩 꾸준히 늘어나고 있고,
피크 타임, 이벤트 타임 때 DB를 유연하게 움직이기 위해서 mariadb 를 보내줘야 했기 때문이다.
문제는 데이터가 너무 많았다. 물론 초대형 사이티들의 테라급은 아니지만,
적어도 내 경험 (이력) 에서 가장 많은 데이터다.
그냥 무작정 툴로 QA 서버를 백업과 복원을 했더니 4시간이 넘게 걸렸다.
(우리는 production 서버의 한달 전 데이터가 staging, staging 의 한달전 데이터가 QA 다)
아무런 옵션 없이 하는 것은 무식한 짓인 것을 깨달아 경험을 공유할겸 나중에 내가 보고 다시 하려고 적어둔다.
--no-autocommit=1
autocommit 을 끄는 옵션이다. 테이블의 작성이 모두 완료 된후에 커밋을 남긴다.
주의 중간에 실패하면 처음부터
--single-transaction=1
작업 후에 변경된 내용을 적용하지 않는다. 반대로 생각하면 이 옵션이 없으면 변경된 내용이 적용되겠지?
그런데 이렇게 대용량 작업을 할때는 서버를 내리고 할테니 필수로 넣어주는게 좋을 것 같다.
--extened-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 DB의 경우
그리고 AWS DB를 사용하는 경우 같은 리전, 같은 가용영역을 사용하면 많이 쾌적하게 빠르다 ;;;
// 백업
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
'개발 > SQL' 카테고리의 다른 글
Offset 기반 paginate 의 문제점 (0) | 2020.10.17 |
---|---|
AWS RDS 비용 줄이는 방법 (성능 개선 도우미) (2) | 2020.09.26 |
데이터 컬럼에 empty 확인 (0) | 2020.01.09 |