ALTER TABLE
PostgreSQL에서을 발행 하면를 포함하여 모든 것을 차단 하는 ACCESS EXCLUSIVE
잠금 이 걸립니다SELECT
. 테이블이 재 작성, 새로운 요구하지 않는 경우,이 잠금은 매우 브리핑을 할 수있다 UNIQUE
, CHECK
또는 FOREIGN KEY
제약 등 고가의 풀 테이블 스캔 검증 할 필요가 없습니다를
의심스러운 경우 일반적으로 시도해보십시오! PostgreSQL의 모든 DDL은 트랜잭션 방식이므로 ALTER TABLE
너무 오래 걸리고 다른 쿼리를 보류하기 시작하면 취소하는 것이 좋습니다. 다양한 명령에 필요한 잠금 수준 은 잠금 페이지에 설명되어 있습니다.
일반적으로 느리게 작동하는 일부 작업은 가동 중단없이 안전하게 수행 할 수 있도록 속도를 높일 수 있습니다. 당신은 테이블이있는 경우 예를 들어, t
당신이 열을 변경할 customercode integer NOT NULL
에 text
고객이 코드는 이제 시작해야하는 모든 고객을 결정했기 때문에 X
, 당신은 쓸 수 있습니다 :
ALTER TABLE t ALTER COLUMN customercode TYPE text USING ( 'X'||customercode::text );
...하지만 다시 작성하기 위해 전체 테이블을 잠급니다. 으로 열을 추가하는 것도 마찬가지 DEFAULT
입니다. 긴 잠금을 피하기 위해 몇 가지 단계를 수행 할 수 있지만 애플리케이션은 임시 복제에 대처할 수 있어야합니다.
ALTER TABLE t ADD COLUMN customercode_new text;
BEGIN;
LOCK TABLE t IN EXCLUSIVE MODE;
UPDATE t SET customercode_new = 'X'||customercode::text;
ALTER TABLE t DROP COLUMN customercode;
ALTER TABLE t RENAME COLUMN customercode_new TO customercode;
COMMIT;
이것은 단지 방지 할 쓰기 에 t
과정에서를; 잠금 이름 EXCLUSIVE
은 제외하고 모든 것을SELECT
배제한다는 점에서 다소 기만적입니다 . ACCESS EXCLUSIVE
모드는 제외 절대적으로 everyting있는 유일한 하나입니다. 잠금 모드를 참조하십시오 . 이 작업에 필요한 잠금 업그레이드로 인해이 작업이 교착 상태 롤백 될 수있는 위험이 ALTER TABLE
있지만 최악의 경우 다시 수행해야합니다.
당신은 그 잠금을 피하고에서 트리거 기능을 작성하여 라이브 모든 일을 할 수있는 t
그 때마다 INSERT
또는 UPDATE
자동으로 채 웁니다 온다 customercode_new
에서 customercode
.
또한 기본 제공 도구가 CREATE INDEX CONCURRENTLY
있으며 ALTER TABLE ... ADD table_constraint_using_index
DBA가 동시성 친화적 인 방식으로 작업을 더 느리게 수행하여 독점 잠금 시간을 줄일 수 있도록 설계되었습니다.
이 pg_reorg
도구 또는 후속 도구 pg_repack
는 일부 테이블 재구성 작업에도 사용될 수 있습니다.
pg_reorg
하면보다 어려운 시나리오에 도움 이 될 수 있습니다.