PostgreSQL veri tabanımın bir dökümü ile:
pg_dump -U user-name -d db-name -f dumpfile
hangi ben daha sonra başka bir veritabanında geri yüklemek için devam:
psql X -U postgres -d db-name-b -f dumpfile
Benim sorunum veritabanı referans kısıtlamaları, denetimleri ve tetikleyicileri içerir ve bu denetimlerin onurlandırılmasına neden olacak sırayla bilgi yüklenmediği için bu bazı (özellikle görünüyor kontroller) geri yükleme sırasında başarısız olmasıdır. Örneğin, bir tabloya satır eklemek, bir koşulun başka bir ilişkisiz tabloda tutup tutulmadığını kontrol CHECK
eden bir plpgsql
işlevi çağıran bir işlevle ilişkilendirilebilir . Bu ikinci tablo öncekinden psql
önce yüklenmezse , bir hata oluşur.
Aşağıda, bir kez boşaltılamaz pg_dump
geri yüklenemez böyle bir veritabanı üreten bir SSCCE :
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
Döküm geri yüklemesi sırasında tüm bu kısıtlamaları devre dışı bırakmanın (komut satırından) ve daha sonra tekrar etkinleştirmenin bir yolu var mı? PostgreSQL 9.1 kullanıyorum.
CHECK
kısıtlamadaki diğer tablolara başvuran bir işlev kullanırsanız , tüm garantiler geçersiz olur, çünkü bu resmi olarak desteklenmez, sadece tolere edilir. Ancak CHECK
kısıtlamayı ilan etmek NOT VALID
her açıdan benim için işe yaradı. Hiç dokunmadığım köşe vakaları olabilir ...
-X
ve-d
seçenekleri yokpg_dump
.pg_dump
Bir dökümü üretir olan boş bir DB restorable.