InfoGrab DocsInfoGrab Docs

테이블 교체

요약

한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다.

한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 마이그레이션할 때는 해당 테이블의 사본을 만들고 백그라운드에서 새 테이블로 데이터를 삽입하고 마이그레이션하는 편이 나을 때가 많습니다.

Note

먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 해당 테이블의 구성 파일이 db/siphon/tables에 있으면 복제 대상입니다. 논리 복제는 이름 변경을 반영하지 않으므로, 이 경우에는 테이블 이름 변경 또는 교체도 함께 수행합니다.

예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다.

  1. events의 이름을 events_temporary로 변경합니다.
  2. events_for_migration의 이름을 events로 변경합니다.
  3. 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부터 시작합니다. 기존 데이터에 따라서는 이 때문에 중복 키 제약 조건 오류가 발생해 사용자가 새 데이터를 생성하지 못하게 될 수 있습니다.

테이블 교체

GitLab v19.4
원문 보기

요약

한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다.

한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 마이그레이션할 때는 해당 테이블의 사본을 만들고 백그라운드에서 새 테이블로 데이터를 삽입하고 마이그레이션하는 편이 나을 때가 많습니다.

Note

먼저 해당 테이블이 Siphon을 통해 ClickHouse로 복제되는지 확인합니다. 해당 테이블의 구성 파일이 db/siphon/tables에 있으면 복제 대상입니다. 논리 복제는 이름 변경을 반영하지 않으므로, 이 경우에는 테이블 이름 변경 또는 교체도 함께 수행합니다.

예를 들어 events 테이블을 events_for_migration 테이블과 교체하려면 다음을 수행합니다.

  1. events의 이름을 events_temporary로 변경합니다.
  2. events_for_migration의 이름을 events로 변경합니다.
  3. 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부터 시작합니다. 기존 데이터에 따라서는 이 때문에 중복 키 제약 조건 오류가 발생해 사용자가 새 데이터를 생성하지 못하게 될 수 있습니다.