InfoGrab DocsInfoGrab Docs

테이블 교체

데이터 마이그레이션 시 대용량 테이블을 무중단으로 교체하는 방법을 설명합니다.

한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 마이그레이션할 때는 해당 테이블의 사본을 만들고 백그라운드에서 새 테이블로 데이터를 삽입하고 마이그레이션하는 편이 나을 때가 많습니다. Note 먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 해당 테이블의 구성 파일이 db/siphon/tables 에 있으면 복제 대상입니다. 논리 복제는 이름 변경을 반영하지 않으므로, 이 경우에는 테이블 이름 변경 또는 교체 도 함께 수행합니다. 예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다. events 의 이름을 events_temporary 로 변경합니다. events_for_migration 의 이름을 events 로 변경합니다. events_temporary 의 이름을 events_for_migration 으로 변경합니다. Rails에서는 rename_table 메서드로 이 작업을 수행할 수 있습니다. rename_table :events , :events_temporary rename_table :events_for_migration , :events rename_table :events_temporary , :events_for_migration 3개의 rename_table 호출이 같은 데이터베이스 트랜잭션에서 실행되는 한 다운타임은 발생하지 않습니다. Rails는 기본적으로 마이그레이션에 데이터베이스 트랜잭션을 사용하지만, 그렇지 않은 경우에는 다음과 같이 직접 트랜잭션을 시작해야 합니다. Event .transaction do rename_table :events , :events_temporary rename_table :events_for_migration , :events rename_table :events_temporary , :events_for_migration end 교체한 뒤에는 새 테이블의 기본 키를 반드시 재설정해야 합니다. PostgreSQL에서는 다음과 같이 reset_pk_sequence! 메서드를 사용합니다. reset_pk_sequence!( 'events' ) 기본 키를 재설정하지 않으면 새로 생성되는 행의 ID 값이 1부터 시작합니다. 기존 데이터에 따라서는 이 때문에 중복 키 제약 조건 오류가 발생해 사용자가 새 데이터를 생성하지 못하게 될 수 있습니다.