본문 바로가기

Database

(3)
[mysql] 무중단으로 대량 테이블 전체 데이터 교체하기 업무중 대량의 데이터가 있는 테이블의 데이터를 insert, update, delete를 통한 데이터 교체가 아닌 무중단으로 한번에 테이블의 데이터를 교체해야 하는 요구사항이 생겼습니다. 다양한 방법을 고민 끝에 임시 테이블과 테이블 rename을 통해 해결한 과정을 공유합니다. 사전 작업으로는 대상 테이블과 똑같은 스키마의 _tmp postfix를 붙힌 다음과 같은 테이블을 생성합니다. {tableName}_tmp. 그 이후에는 매 배치별로 아래와 같은 3단계의 작업을 진행하면 됩니다. 1. 임시 테이블을 truncate를 하여 전체 데이터를 지워줍니다. 첫 작업에는 데이터가 존재하지 않기 때문에 truncate를 할 필요가 없지만 배치로 반복적으로 작업이 일어난다면 기존 데이터를 삭제하기 위해 tru..
[Mysql] 잠금(Lock) 정리 Mysql 잠금 글로벌 락(Global Lock)- FLUSH TABLES WITH READ LOCK 명령으로 획득할 수 있으며, mysql에서 제공하는 잠금 가운데 가장 범위가 크다. - 한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 대부분의 DDL이나 DML을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기상태로 남는다.- MyISAM이나 MEMORY 테이블에 대해 mysqldump로 일관된 백업을 받아야 할 때 글로벌 락을 사용해야 한다. 테이블 락(Table Lock)- 개별 테이블 단위로 설정되는 잠금- LOCK TABLES table_name [READ | Write] 명령으로 특정 테이블의 락을 획득 할 수 있다.- 명시적으로 획득한 잠금은 UNLOCK TA..
[mysql] rownum을 결과에 반환하기 mysql에는 쿼리 결과에서 rownum을 반환하는 방법이 3가지가 있다. 1. where절에서 rownum을 생성하여 반환하는 방법. SELECT @rownum:=@rownum+1 FROM MyTable WHERE (@rownum:=0)=0; 2. from절에서 rownum을 생성하여 반환하는 방법. SELECT @rownum:=@rownum+1 FROM MyTable, (SELECT @rownum:=0)=0; 3. set문을 이용하여 rownum을 생성하여 반환하는 방법 SET @rownum:=0; SELECT @rownum:=@rownum+1 FROM MyTable;