चूंकि # 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;
तालिकाओं का नाम बदलें ताकि नया_मास्टर उत्पादन डेटाबेस बन जाए।
ALTER TABLE old_master RENAME TO old_master_backup;
ALTER TABLE new_master RENAME TO old_master;
INSERT कथनों के लिए फ़ंक्शन को पुराने_मास्टर में जोड़ें ताकि विभाजन को सही करने के लिए डेटा पास हो जाए।
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();
पर बाधा को निर्धारित करें
SET constraint_exclusion = on;
उत्पादन डेटाबेस पर अद्यतन और जानकारी को फिर से सक्षम करें
ट्रिगर या क्रोन सेट करें ताकि नए विभाजन बन जाएं और विभाजन को सही करने के लिए नए डेटा को असाइन करने के लिए फ़ंक्शन अपडेट हो जाए। कोड उदाहरणों के लिए इस लेख को देखें
पुराने_मास्टर_बैकअप हटाएं