เนื่องจาก # 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;
เปิดใช้งานการปรับปรุงและการแทรกบนฐานข้อมูลการผลิตอีกครั้ง
ตั้งค่าทริกเกอร์หรือ cron เพื่อให้พาร์ติชันใหม่ถูกสร้างขึ้นและฟังก์ชั่นได้รับการอัพเดตเพื่อกำหนดข้อมูลใหม่ให้กับพาร์ติชันที่ถูกต้อง อ้างอิงบทความนี้เพื่อดูตัวอย่างโค้ด
ลบ old_master_backup