pg_dump और pg_restore: इनपुट फ़ाइल एक मान्य संग्रह नहीं प्रतीत होती है


66

मैंने एक मशीन पर pg_dump का उपयोग किया है और दूसरे के लिए परिणाम फ़ाइल की प्रतिलिपि बनाई है, जहां मैंने इसे पुनर्स्थापित करने का प्रयास किया है। मेरा मानना ​​है कि स्कीमा एक ही है। हालाँकि, मुझे मिलता है:

pg_restore: [archiver] input file does not appear to be a valid archive

मैंने निम्नलिखित ऑपरेशन किए हैं:

pg_dump -a -f db.txt dbname

तथा:

pg_restore -a -d dbname db.txt

क्या गलत हो सकता है?


उसी मशीन पर डंप आयात करने की कोशिश करें जिसने इसे उत्पन्न किया। इसके अलावा, Postgres संस्करणों की जाँच करें।
हांक गे

मैं इसे उसी मशीन पर आयात करने का प्रयास नहीं कर सकता, क्योंकि यह एक उत्पादन मशीन है। कोई विचार, मैं और क्या कर सकता हूं?
gruszczy

यह समाधान कुछ लोगों के लिए भी प्रासंगिक हो सकता है: stackoverflow.com/questions/42433414/…
मुहम्मद हन्नान

जवाबों:


93

आप सादे sql प्रारूप में डंप कर रहे हैं जिसे psql को खिलाने के लिए डिज़ाइन किया गया था। यह pg_restore द्वारा मान्यता प्राप्त नहीं है।

cat db.txt | psql dbname

चाल चलनी चाहिए


5
या psql dbname < db.txt;)
एलेन्से डेरागिन

26

pg_dumpडिफ़ॉल्ट रूप से डेटा को फिर से बनाने के लिए आवश्यक sql commmands बनाता है। इसे पुनर्प्राप्त करने के लिए, आपको इनपुट के रूप में फ़ाइल के साथ इनवॉइस psql(नहीं pg_restore) करना होगा। pg_restoreकेवल बाइनरी के लिए उपयोग किया जाना है (डिफ़ॉल्ट नहीं, और कम सामान्य रूप से अनुशंसित नहीं ) का प्रारूप pg_dumpडॉक्स पढ़ें ।

अद्यतन: pg_dumpद्विआधारी प्रारूप ( -Fc -Ft) जिनका उपयोग किया जाना है, pg_restoreवे ठीक हैं, और कुछ अतिरिक्त लचीलापन प्रदान करते हैं। लेकिन वे कम मानक (गैर SQL), कुछ उपकरणों से आयात करने के लिए कम उपयुक्त हैं (जैसे। php फ्रंटेंड) या एक पाठ संपादक के साथ हेरफेर, और अन्य संस्करणों और यहां तक ​​कि अन्य डेटाबेस के लिए थोड़ा कम पोर्टेबल। बैकअप के लिए, मैं डिफ़ॉल्ट सादे प्रारूप के साथ रहना चाहूंगा। अन्य परिदृश्यों के लिए, बाइनरी + pg_restore विकल्प समान या अधिक उपयुक्त हो सकता है।

ध्यान रखने वाली बात यह है कि Postgresql में, विशिष्ट परिदृश्य में , सामान्य रूप से बैकअप pg_dump (प्लेन) द्वारा किया जाता है और मानक कमांड लाइन क्लाइंट ( psql ) के साथ पुनर्स्थापित होता है ।


2
[OT] मैं कस्टम आउटपुट प्रारूप की "अनुशंसित नहीं" स्थिति के बारे में अलग-अलग मांग करता हूं - वाक्य "यह सबसे लचीला प्रारूप है जिसमें यह लोडिंग डेटा के साथ-साथ ऑब्जेक्ट परिभाषाओं को फिर से व्यवस्थित करने की अनुमति देता है ..." मैनुअल से लगता है मेरे लिए काफी समर्थन के रूप में।
मिलन ए। राधदेव

"अनुशंसित नहीं" एक ओवरस्टेटमेंट था, मैं सहमत हूं। लेकिन "सबसे लचीला" जरूरी "सबसे अनुशंसित" नहीं है। स्पष्ट किया।
leonbloy

13

करने के लिए --format=cविकल्प पारित करने का प्रयास करें pg_dump। यह pg_restoreइसे पुनर्स्थापित करने की अनुमति देगा ।


जो कोई भी इसे नीचे करना चाहेगा उसे यह क्यों समझाना होगा? स्वीकृत उत्तर बताता है कि यह काम करेगा :-)

@ सरफि: आपकी बात क्या है?
psmears

1
क्षमा करें, कॉपी-पेस्ट गलत आउटपुट, सही एक है pg_restore: [archiver] did not find magic string in file headerतो यह सरल sql डंप के लिए काम नहीं करता है
skrafi

@skrafi: मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि आप उपयोग करते हैं pg_dump --format=c ...> archivefile, और फिर उपयोग pg_restoreकरते हैं archivefile, तो (कम से कम जब मैंने इसे अभी परीक्षण किया था) यह ठीक काम करता है। हो सकता है कि आपकी फ़ाइल किसी तरह भ्रष्ट हो? या आप एक विशेष बग मारा है?
psmears

6

यह वही है जो मैं अपने पुराने डेटाबेस का बैकअप लेने और पुनर्स्थापित करने के लिए करूंगा

अपने डेटाबेस का बैकअप लेने के लिए

pg_dump --format=c olddb_name > db_dump_file.dump

उस बैकअप को पुनर्स्थापित करने के लिए

pg_restore -v -d newdb_name db_dump_file.dump

Pg_dump और pg_restore पर और पढ़ें


5

विंडोज़ उपयोगकर्ताओं के लिए प्रयास करें

type db.txt | psql --username="YOURNAME" dbname

एक जादू की तरह काम करता है


इसने मुझे धन्यवाद दिया! कम से कम खिड़कियों के लिए उत्तर स्वीकार किया जाना चाहिए।
डैनियल बटलर

2

आप MySQL के SOURCEकमांड के लिए कुछ कर सकते हैं :

psql dbname

फिर, postgresql टर्मिनल में:

\i filename


1

इस त्रुटि संदेश का अर्थ यह भी हो सकता है कि बैकअप फ़ाइल (या इसके बारे में आपकी धारणाएं) में वास्तव में कुछ गड़बड़ है।

एक मामले में, मैंने डॉकर कंटेनर में एक बैकअप फाइल लगाई थी और उसे पुनर्स्थापित करने का प्रयास किया था, लेकिन यह विफल रहा does not appear to be a valid archive। और वास्तव में, फ़ाइल खाली थी, क्योंकि माउंट सही ढंग से प्रदर्शन नहीं किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.