가동 중단없이 스키마 변경 및 라이브 데이터베이스로의 데이터 마이그레이션에 대한 모범 사례?


43

가동 중지 시간없이 라이브 데이터베이스에 대한 스키마 변경을 어떻게 수행합니까?

예를 들어 전자 메일 주소 등과 같은 다양한 사용자 데이터를 포함하는 테이블이있는 PostgreSQL 데이터베이스가 있다고 가정 해 보겠습니다. 전자 메일 주소를 새로운 전용 테이블로 이동하려면 스키마를 변경 한 다음 전자 메일 데이터를 새 테이블로 마이그레이션해야합니다. 원래 테이블에 대한 쓰기를 중지하지 않고 어떻게 할 수 있습니까? 확실히 이전 테이블에서 새 테이블로 데이터를 덮어 쓰는 동안 새 데이터가 이전 테이블에 계속 기록되어 누락 될 수 있습니다.

이 문제는 자주 발생하지만 문제를 해결하기위한 표준 솔루션을 찾을 수 없습니다.

이 기사 는 문제를 다루고 있지만 실제로 3 단계를 이해하지 못했습니다. 두 테이블 모두에 기록한 다음 이전 데이터를 첫 번째 테이블에서 새 테이블로 마이그레이션한다고 말합니다. 오래된 데이터 만 마이그레이션하는지 어떻게 확인합니까?

( Heroku에서 PostgreSQL을 사용 합니다 .)


2
Facebook 은이를 위해 MySQL을위한 도구개발했습니다 .
Nick Chammas

2
K. Scott Allen은 여기에서 스키마 버전 관리 시스템에 대해 썼습니다 . 버전 인식 스키마 배포를위한 오픈 소스 도구 인 DbUpdater를 만들었습니다. 자세한 내용은 여기 - http://www.tewari.info/dbupdater

@NickChammas 공유해 주셔서 감사합니다. 나는 그것에 대해 많은 질문이 있습니다. 비트 로그, 비 클러스터형 인덱스와 같은 항목을 설명하고 다음과 같은 질문에 답변하는보다 자세한 자습서 인 비디오를 제안하십시오. 직접 테이블. 2. 복사 단계는 언제 종료됩니까? 이것들은 내가 가진 몇 가지 질문에 불과하며 읽기 시작했습니다.
Sandeepan Nath

@SandeepanNath-죄송합니다. Facebook 도구에 익숙하지 않으므로 더 많은 리소스를 알려 드릴 수 없습니다. 나는 그것에 대한 발표를 읽고 몇 년 전에 내 의견을 게시했지만 결코 사용하지 않았습니다.
Nick Chammas

답변:


27

당신은 거의 이미 당신의 대답을 가지고 있습니다 :

  1. 새로운 구조를 병렬로 생성
  2. 두 구조 모두에 쓰기 시작
  3. 오래된 데이터를 새로운 구조로 마이그레이션
  4. 새로운 구조를 쓰고 읽음
  5. 이전 열 삭제

에 관해서는 3 단계 , (하나의 트랜잭션에서)이 같은 것을 사용 :

아직없는 것을 삽입하십시오.

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

그 동안 변경된 내용을 업데이트하십시오.

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

새 데이터는 두 곳에서 동일하므로 수정되지 않습니다.


이 답변을 제안한 시나리오를 이해하는 동안 몇 가지 질문이 있습니다-1. DB 변경 시작과 함께 코드 변경 사항이 배포됩니까? 2. 두 구조 모두에 글을 써야하는 이유는 무엇입니까? 3. 왜 새 구조를 먼저 가져 와서 기존 데이터를 마이그레이션 한 다음 코드 변경 사항을 배포하여 새 구조를 채울 수 없습니까? 4.없는 것이 무엇인지 찾아야하는 이유는 무엇입니까 (첫 번째 쿼리)? 여러 번의 삽입 시도를 제안하고 있습니까?
Sandeepan Nath

2
그런 다음, (a)는 그것 (b)에 마이그레이션 데이터를 새로운 구조를 가지고있는 경우 때문에, (C)를 대신 이전의 새로운 구조로 쓰기 데이터에 코드를 변경 : @SandeepanNath은, 당신의 의견에 질문 3 답변을 모든 단계 b와 단계 c 사이의 데이터 변경은 기존 구조 에서만 존재합니다 . 문제는 다운 타임없이 스키마를 변경하는 방법이었습니다 . 이 답변을주의 깊게 다시 읽으십시오.
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.