본문 바로가기

Database

[mysql] 무중단으로 대량 테이블 전체 데이터 교체하기

업무중 대량의 데이터가 있는 테이블의 데이터를 insert, update, delete를 통한 데이터 교체가 아닌 무중단으로 한번에 테이블의 데이터를 교체해야 하는 요구사항이 생겼습니다.


다양한 방법을 고민 끝에 임시 테이블과 테이블 rename을 통해 해결한 과정을 공유합니다.


사전 작업으로는 대상 테이블과 똑같은 스키마의 _tmp postfix를 붙힌 다음과 같은 테이블을 생성합니다.  {tableName}_tmp.


그 이후에는 매 배치별로 아래와 같은 3단계의 작업을 진행하면 됩니다.


1. 임시 테이블을 truncate를 하여 전체 데이터를 지워줍니다. 첫 작업에는 데이터가 존재하지 않기 때문에 truncate를 할 필요가 없지만 배치로 반복적으로 작업이 일어난다면 기존 데이터를 삭제하기 위해 truncate를 시켜줍니다.


2. truncate한 임시 테이블에 변경할 전체 데이터를 insert 합니다.


3. rename table 명령어를 이용하여 오리지널 테이블을 tmp2 테이블로 변경, tmp 테이블을 다시 오리지널 테이블로 변경 그리고 마지막으로 tmp2 테이블을 tmp 테이블로 변경하는 명령어를 실행합니다.


아래와 같이 명령어를 실행하면 하나의 트랜잭션에 처리되어 무중단으로 전체 데이터를 교체할 수 있습니다.

rename table {originalName} to {originalName_tmp2}
, {originalName_tmp} to {originalName}
, {originalName_tmp2} to {originalName_tmp}


'Database' 카테고리의 다른 글

[Mysql] 잠금(Lock) 정리  (0) 2017.03.25
[mysql] rownum을 결과에 반환하기  (0) 2017.03.16