InfoGrab DocsInfoGrab Docs

다운타임 없이 데이터베이스 테이블 이름 변경

GitLab 내장 데이터베이스 헬퍼 메서드를 사용하여 다운타임 없이 데이터베이스 테이블 이름을 변경하는 방법을 설명합니다.

GitLab에 내장된 데이터베이스 헬퍼 메서드를 사용하면 다운타임 없이 데이터베이스 테이블 이름을 변경할 수 있습니다. 이 기법은 데이터베이스 뷰를 기반으로 하며, 다음 단계를 따릅니다: 데이터베이스 테이블 이름을 변경합니다. 새 테이블 이름을 가리키는 이전 테이블 이름으로 데이터베이스 뷰를 생성합니다. ActiveRecord의 스키마 캐시에 대한 해결 방법을 추가합니다. 예를 들어, issues 테이블 이름을 tickets 로 변경하는 경우 다음을 실행합니다: BEGIN; ALTER TABLE issues RENAME TO tickets; CREATE VIEW issues AS SELECT * FROM tickets; COMMIT; 데이터베이스 뷰는 기본 테이블 스키마(기본값, not null 제약 조건, 인덱스)를 노출하지 않으므로, 애플리케이션이 새 테이블 이름을 사용하도록 추가 단계가 필요합니다. ActiveRecord는 예를 들어 새 모델을 초기화할 때 이 데이터에 크게 의존합니다. 이 제한을 해결하려면 ActiveRecord에게 새 테이블 이름을 사용하여 다른 테이블에서 이 정보를 가져오도록 지시해야 합니다. 마이그레이션 전략 분석 # 릴리즈 N.M: ActiveRecord 모델의 테이블 표시 # 현재 릴리즈를 "릴리즈 N.M"이라고 가정합니다. 이 릴리즈에서는 데이터베이스 테이블을 등록하여 ActiveRecord가 새 테이블 이름(존재하는 경우)을 사용하여 데이터베이스 테이블 정보( SchemaCache )를 가져오도록 지시합니다. 그렇지 않으면 이전 테이블 이름으로 폴백합니다. 이는 다운타임이 없는 배포 중 오류를 방지하기 위해 필요합니다. lib/gitlab/database.rb 에서 TABLES_TO_BE_RENAMED 상수를 편집합니다: TABLES_TO_BE_RENAMED = { 'issues' => 'tickets' }.freeze 이 릴리즈(N.M)에서는 tickets 데이터베이스 테이블이 아직 존재하지 않습니다. 이 단계는 릴리즈 N.M+1에서의 실제 테이블 이름 변경을 준비하는 것입니다. 릴리즈 N.M+1: 데이터베이스 테이블 이름 변경 # 다음 릴리즈를 "릴리즈 N.M+1"이라고 가정합니다. 표준 마이그레이션(포스트 마이그레이션이 아닌)을 실행합니다: def up rename_table_safely(:issues, :tickets) end def down undo_rename_table_safely(:issues, :tickets) end 테이블의 사전 파일 ( db/docs 아래)을 새 이름으로 변경합니다(이 예시에서는 db/docs/tickets.yml ). introduced_by_url 및 milestone 속성을 업데이트합니다. 임시 뷰(이전 테이블 이름이 있는)에 대한 항목을 db/docs/deleted_views 에 생성합니다. 이는 동일한 머지 리퀘스트의 포스트 배포 마이그레이션에서 finalize_table_rename 에 의해 뷰가 삭제되기 때문입니다. 중요 사항 : 다른 개발자에게 테이블