# 1, aktif bir üretim ortamındayken master'dan çocuğa veri kopyalamayı gerektirdiğinden, kişisel olarak # 2 ile (yeni bir master oluşturarak) gittim. Bu, etkin olarak kullanımdayken orijinal tablonun bozulmasını önler ve herhangi bir sorun varsa, yeni master'ı sorunsuz bir şekilde silebilir ve orijinal tabloyu kullanmaya devam edebilirim. İşte yapmanız gereken adımlar:
Yeni ana tablo oluşturun.
CREATE TABLE new_master (
id serial,
counter integer,
dt_created DATE DEFAULT CURRENT_DATE NOT NULL
);
Ustadan miras alan çocuklar oluşturun.
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);
...
Tüm geçmiş verileri yeni ana tabloya kopyala
INSERT INTO child_2014 (id,counter,dt_created)
SELECT id,counter,dt_created
from old_master
where dt_created < '01/01/2015'::date;
Üretim veritabanındaki yeni eklemeleri / güncellemeleri geçici olarak duraklat
En son verileri yeni ana tabloya kopyala
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'ın üretim veritabanı olması için tabloları yeniden adlandırın.
ALTER TABLE old_master RENAME TO old_master_backup;
ALTER TABLE new_master RENAME TO old_master;
Verilerin doğru bölüme aktarılması için INSERT deyimleri için işlevi old_master öğesine ekleyin.
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 üzerinde işlevin çağrılması için tetikleyici ekle
CREATE TRIGGER tr_insert BEFORE INSERT ON old_master
FOR EACH ROW EXECUTE PROCEDURE fn_insert();
Sınırlama hariç tutma özelliğini AÇIK olarak ayarlayın
SET constraint_exclusion = on;
Üretim veritabanında GÜNCELLEMELERİ ve EKLER'i yeniden etkinleştirin
Tetikleyici veya cron'u, yeni bölümlerin oluşturulması ve işlevin, bölüme doğru yeni veriler atayacak şekilde güncellenmesi için ayarlayın. Kod örnekleri için bu makaleye bakın
Old_master_backup öğesini sil