테이블 교체
GitLab v19.4요약
한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다.
한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 마이그레이션할 때는 해당 테이블의 사본을 만들고 백그라운드에서 새 테이블로 데이터를 삽입하고 마이그레이션하는 편이 나을 때가 많습니다.
먼저 해당 테이블이 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부터 시작합니다. 기존 데이터에 따라서는 이 때문에 중복 키 제약 조건 오류가 발생해 사용자가 새 데이터를 생성하지 못하게 될 수 있습니다.