केवल एक तालिका का बैकअप लेने के लिए, COPY
डेटाबेस के अंदर से:
COPY user_tbl TO '/path/to/file';
या pg_dump
खोल से:
pg_dump -t user_tbl mydb > user_tbl.sql
फिर डेटाबेस को छोड़ दें, अपना नया संस्करण पुनर्स्थापित करें, खाली user_tbl
और इससे कॉपी करें
. का उपयोग करें एक तालिका को पुनर्स्थापित करने के लिए:
COPY user_tbl FROM '/path/to/file';
या के साथ शेल से एक टेबल के साथ बैकअप को पुनर्स्थापित करें psql
:
psql -f user_tbl.sql mydb
तालिकाओं के आधार पर पहचानें
त्वरित और गंदा
"कॉपी ... कैस्केड" जैसी कोई चीज नहीं है। निर्भर तालिकाओं की पहचान करने का सबसे सरल तरीका लेनदेन शुरू करना होगा, TRUNCATE tbl CASCADE
पर कॉल करें। और आपको मिलने वाली सूचनाओं को रिकॉर्ड करें:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
फिर लेन-देन को वापस रोल करें - इसलिए वास्तव में कुछ भी नहीं बदलता है:
ROLLBACK;
इससे सावधान। अगर आप COMMIT
ट्रंकेट गुजरता है।
धीमा और पक्का
खैर, वास्तव में "धीमा" नहीं है, लेकिन कोड बहुत अधिक जटिल है। हालांकि, यह शामिल तालिकाओं पर एक विशेष लॉक नहीं लेता है, इसलिए यह बहुत साफ और सुरक्षित है:
WITH RECURSIVE x AS (
SELECT conrelid::regclass
FROM pg_constraint
WHERE confrelid = 'user_tbl'::regclass
UNION
SELECT p.conrelid::regclass
FROM x
JOIN pg_constraint p ON p.confrelid = x.conrelid
)
SELECT conrelid::text AS tbl
FROM x;
रिटर्न:
tbl
------
tbl1
tbl2
tbl3
मैं एक पुनरावर्ती CTE का उपयोग करता हूं
(पोस्टग्रेएसक्यूएल 8.4 या बाद के संस्करण की आवश्यकता है) कैटलॉग टेबल पर pg_constraint
, क्योंकि प्रत्येक तालिका में बदले में निर्भरताएँ हो सकती हैं।UNION
का उपयोग करें , नहीं सभी यूनियन
तालिकाओं के कई मूल्यांकन से बचने के लिए जो प्रत्यक्ष या अप्रत्यक्ष रूप से कई विदेशी कुंजियों से जुड़ी हो सकती हैं।