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


मैंने एक मशीन पर 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

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


62
2018-06-14 16:15


मूल


उसी मशीन पर डंप आयात करने का प्रयास करें जो इसे उत्पन्न करता है। साथ ही, पोस्टग्रेज़ संस्करणों की जांच करें। - Hank Gay
मैं इसे उसी मशीन पर आयात करने की कोशिश नहीं कर सकता, क्योंकि यह एक उत्पादन मशीन है। कोई विचार, मैं और क्या कर सकता हूं? - gruszczy
यह समाधान कुछ लोगों के लिए भी प्रासंगिक हो सकता है: stackoverflow.com/questions/42433414/... - Muhammad Hannan


जवाब:


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

cat db.txt | psql dbname

चाल करना चाहिए


88
2018-06-14 16:26



या psql dbname < db.txt ;) - Aleksey Deryagin


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

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

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


24
2018-06-14 16:22



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


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


12
2018-06-14 16:23



क्या कोई भी इसे समझाने के लिए संशोधित करेगा क्यों? स्वीकृत उत्तर बताता है कि यह काम करेगा :-)
@skrafi: आपका मुद्दा क्या है? - psmears
क्षमा करें, प्रतिलिपि गलत आउटपुट, सही है pg_restore: [archiver] did not find magic string in file header इसलिए यह सरल एसक्यूएल डंप के लिए काम नहीं करता है - skrafi
@skrafi: मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि तुम प्रयोग करते हो pg_dump --format=c ...> archivefile, और फिर उपयोग करें pg_restore पर archivefile, फिर (कम से कम जब मैंने अभी इसका परीक्षण किया) यह ठीक काम करता है। शायद आपकी फाइल किसी भी तरह भ्रष्ट है? या आपने एक विशेष बग मारा है? - psmears


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

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

pg_dump --format=c olddb_name > db_dump_file.dump

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

pg_restore -v -d newdb_name db_dump_file.dump

और पढ़ें pg_dump तथा pg_restore


4
2018-02-27 09:03





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

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

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


3
2018-04-15 17:59





आप MySQL के लिए कुछ कर सकते हैं SOURCE आदेश:

psql dbname

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

\i filename

1
2018-01-03 10:49





बिल्ली डंपफाइलनाम | psql -h ip -d dbName -U userName -W


0
2018-04-11 07:06



यह आमतौर पर सहायक होता है यदि आप समझते हैं कि यह क्या करता है और यह क्यों मदद कर सकता है। - Falcon Momot