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 CHECKeden bir plpgsqliş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_dumpgeri 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.
CHECKkı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 CHECKkısıtlamayı ilan etmek NOT VALIDher açıdan benim için işe yaradı. Hiç dokunmadığım köşe vakaları olabilir ...
-Xve-dseçenekleri yokpg_dump.pg_dumpBir dökümü üretir olan boş bir DB restorable.