# 1은 활성화 된 프로덕션 환경에있는 동안 마스터에서 자식으로 데이터를 복사해야하므로 개인적으로 # 2를 사용했습니다 (새 마스터 생성). 이렇게하면 원래 테이블이 활발하게 사용되는 동안 원본 테이블이 중단되는 것을 방지하고 문제가있는 경우 문제없이 새 마스터를 쉽게 삭제하고 원본 테이블을 계속 사용할 수 있습니다. 이를 수행하는 단계는 다음과 같습니다.
새 마스터 테이블을 작성하십시오.
CREATE TABLE new_master (
id serial,
counter integer,
dt_created DATE DEFAULT CURRENT_DATE NOT NULL
);
마스터로부터 상속받은 자식을 만듭니다.
CREATE TABLE child_2014 (
CONSTRAINT pk_2014 PRIMARY KEY (id),
CONSTRAINT ck_2014 CHECK ( dt_created < DATE '2015-01-01' )
) INHERITS (new_master);
CREATE INDEX idx_2014 ON child_2014 (dt_created);
CREATE TABLE child_2015 (
CONSTRAINT pk_2015 PRIMARY KEY (id),
CONSTRAINT ck_2015 CHECK ( dt_created >= DATE '2015-01-01' AND dt_created < DATE '2016-01-01' )
) INHERITS (new_master);
CREATE INDEX idx_2015 ON child_2015 (dt_created);
...
모든 히스토리 데이터를 새 마스터 테이블로 복사
INSERT INTO child_2014 (id,counter,dt_created)
SELECT id,counter,dt_created
from old_master
where dt_created < '01/01/2015'::date;
프로덕션 데이터베이스에 대한 새로운 삽입 / 업데이트를 일시적으로 일시 중지
최신 데이터를 새 마스터 테이블로 복사
INSERT INTO child_2015 (id,counter,dt_created)
SELECT id,counter,dt_created
from old_master
where dt_created >= '01/01/2015'::date AND dt_created < '01/01/2016'::date;
new_master가 프로덕션 데이터베이스가되도록 테이블 이름을 바꾸십시오.
ALTER TABLE old_master RENAME TO old_master_backup;
ALTER TABLE new_master RENAME TO old_master;
데이터가 올바른 파티션으로 전달되도록 INSERT 문에 대한 함수를 old_master에 추가하십시오.
CREATE OR REPLACE FUNCTION fn_insert() RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.dt_created >= DATE '2015-01-01' AND
NEW.dt_created < DATE '2016-01-01' ) THEN
INSERT INTO child_2015 VALUES (NEW.*);
ELSIF ( NEW.dt_created < DATE '2015-01-01' ) THEN
INSERT INTO child_2014 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
INSERTS에서 함수가 호출되도록 트리거 추가
CREATE TRIGGER tr_insert BEFORE INSERT ON old_master
FOR EACH ROW EXECUTE PROCEDURE fn_insert();
구속 조건 제외를 ON으로 설정
SET constraint_exclusion = on;
프로덕션 데이터베이스에서 UPDATES 및 INSERTS를 다시 활성화하십시오.
새 파티션을 작성하고 기능을 업데이트하여 올바른 파티션에 새 데이터를 지정하도록 트리거 또는 cron을 설정하십시오. 코드 예제는이 기사를 참조하십시오.
old_master_backup 삭제