거대한 postgres 테이블을 복제하는 방법?


29

거대한 postgres 테이블 (10GB의 데이터-160M ​​레코드)이 있습니다. 테이블이 정적이며 수행 된 쓰기 작업이 없습니다. 그것을 복제하고, 쓰기를 수행하고, 색인을 다시 생성 한 다음 단일 빠른 트랜잭션으로 이전 트랜잭션을 삭제하고 새 이름을 원래 이름으로 바꾸고 싶습니다.

그런 거대한 테이블을 복제하는 가장 빠른 방법은 무엇입니까?

답변:


55

일반적으로 테이블을 복제하는 가장 빠른 방법은 다음과 같습니다.

CREATE TABLE table2 AS SELECT * FROM table1;

병렬 INSERT는 더 빠를 수 있지만 데이터가 많은 드라이브에 인터리브 될 때 매우 빠른 디스크 하위 시스템에서만 가능합니다. 그렇지 않으면이 속도가 느려집니다.

수정을 마치면 다음과 table2같이 새 이름을 사용할 수 있습니다.

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

DROP TABLE명령에는 독점 잠금이 필요하며 이는 예상 한 방식으로 동시 판독기에 영향을줍니다.

  • DROP 다른 트랜잭션의 테이블에서 보류중인 읽기가 완료 될 때까지 기다립니다.
  • 그 동안 해당 테이블을 읽으려고 시도하는 모든 새 트랜잭션은 대기 상태가되고 원래 트랜잭션이 table1더 이상 존재하지 않으므로 실패 합니다. 오류의 모습 "수 OID와 열지 관계 OID "

두 번째 문제를 피하기 위해 삭제하지 말고 이름 table1 을 바꾼 old_table1다음 독자들과 함께 할 때 나중에 트랜잭션 외부로 떨어 뜨릴 수 있습니다. 따라서 위의 순서는 다음과 같습니다.

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
고마워요 이것은 내가 찾던 일종의 설명입니다. 다시 감사합니다!
Milovan Zogovic

table2에 인덱스가 정의되어 있어도 테이블 이름을 변경 한 후에도 인덱스가 계속 작동합니까?
BamaPookie

1
인덱스, 제약 조건 및 기본값을 포함하여 전체 스키마이 체크 아웃 @BamaPookie wiki.postgresql.org/wiki/Clone_schema
티모시 보글
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.