Vì # 1 yêu cầu sao chép dữ liệu từ chủ sang con trong khi nó ở trong môi trường sản xuất đang hoạt động, cá nhân tôi đã đi với số 2 (tạo chủ mới). Điều này ngăn chặn sự gián đoạn đối với bảng gốc trong khi nó đang được sử dụng tích cực và nếu có bất kỳ vấn đề nào, tôi có thể dễ dàng xóa chủ mới mà không gặp sự cố và tiếp tục sử dụng bảng gốc. Dưới đây là các bước để làm điều đó:
Tạo bảng tổng thể mới.
CREATE TABLE new_master (
id serial,
counter integer,
dt_created DATE DEFAULT CURRENT_DATE NOT NULL
);
Tạo con kế thừa từ chủ.
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);
...
Sao chép tất cả dữ liệu lịch sử vào bảng chính mới
INSERT INTO child_2014 (id,counter,dt_created)
SELECT id,counter,dt_created
from old_master
where dt_created < '01/01/2015'::date;
Tạm thời tạm dừng chèn / cập nhật mới vào cơ sở dữ liệu sản xuất
Sao chép dữ liệu gần đây nhất vào bảng chính mới
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;
Đổi tên bảng để new_master trở thành cơ sở dữ liệu sản xuất.
ALTER TABLE old_master RENAME TO old_master_backup;
ALTER TABLE new_master RENAME TO old_master;
Thêm chức năng cho các câu lệnh INSERT vào old_master để dữ liệu được chuyển đến phân vùng chính xác.
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;
Thêm kích hoạt để chức năng đó được gọi trên INSERTS
CREATE TRIGGER tr_insert BEFORE INSERT ON old_master
FOR EACH ROW EXECUTE PROCEDURE fn_insert();
Đặt loại trừ ràng buộc thành BẬT
SET constraint_exclusion = on;
Kích hoạt lại CẬP NHẬT và BẢO HIỂM trên cơ sở dữ liệu sản xuất
Thiết lập kích hoạt hoặc cron để các phân vùng mới được tạo và chức năng được cập nhật để gán dữ liệu mới cho phân vùng chính xác. Tham khảo bài viết này cho các ví dụ mã
Xóa old_master_backup