मैंने अपने PostgreSQL डेटाबेस का एक डंप प्राप्त किया है:
pg_dump -U user-name -d db-name -f dumpfile
जिसके बाद मैं दूसरे डेटाबेस में पुनर्स्थापित करने के लिए आगे बढ़ा:
psql X -U postgres -d db-name-b -f dumpfile
मेरी समस्या यह है कि डेटाबेस में संदर्भ संबंधी बाधाएं, चेक और ट्रिगर शामिल हैं और इनमें से कुछ (यह विशेष रूप से प्रतीत होता है) पुनर्स्थापना के दौरान विफल हो जाते हैं क्योंकि जानकारी उस आदेश में लोड नहीं होती है जिससे उन चेक को सम्मानित किया जाएगा। उदाहरण के लिए, किसी तालिका में एक पंक्ति सम्मिलित करना उस फ़ंक्शन से जुड़ा हो सकता है CHECK
जो plpgsql
यह जांचता है कि क्या स्थिति किसी अन्य असंबंधित तालिका में है। यदि वह बाद वाली तालिका psql
पूर्व के द्वारा लोड नहीं की गई है , तो एक त्रुटि होती है।
निम्नलिखित एक एसएससीसीई है जो ऐसे डेटाबेस का निर्माण करता है जिसे एक बार डंप करने के बाद pg_dump
बहाल नहीं किया जा सकता है:
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());
क्या डंप बहाली के दौरान ऐसी सभी बाधाओं को (कमांड लाइन से) निष्क्रिय करने का एक तरीका है और उन्हें फिर से बाद में सक्षम करना है? मैं PostgreSQL 9.1 चला रहा हूं।
CHECK
बाधा में अन्य तालिकाओं का संदर्भ देता है , तो सभी गारंटी शून्य हैं, क्योंकि यह आधिकारिक रूप से समर्थित नहीं है, बस सहन किया गया है। लेकिन CHECK
अड़चन घोषित करना NOT VALID
मेरे लिए हर लिहाज से काम का रहा। ऐसे कोने के मामले हो सकते हैं, जिन्हें मैंने कभी नहीं छुआ ...
-X
और-d
विकल्प नहीं हैंpg_dump
।pg_dump
एक डंप है कि पैदा करता है एक खाली डीबी में restorable।