2011-01-05 21 views
9

के एक नए संस्करण से पुनर्स्थापित करने के लिए pg_restore का उपयोग करें मेरे पास एक (उत्पादन) डीबी सर्वर PostgreSQL v9.0 चल रहा है और एक विकास मशीन PostgreSQL v8.4 चल रही है। मैं उत्पादन डीबी का डंप लेना चाहता हूं और इसे विकास मशीन पर इस्तेमाल करना चाहता हूं। मैं देव मशीन पर पोस्टग्रेज़ को अपग्रेड नहीं कर सकता।PostgreSQL

उत्पादन मशीन पर, मैं चलाएँ:

pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats 

विकास मशीन पर, मैं चलाएँ:

pg_restore -d nvdlstats -U nvdladmin nvdls.db 

और मैं यह त्रुटि आई:

pg_restore: [archiver] unsupported version (1.12) in file header 

यह तब होता है, भले ही डंपिंग करते समय मैं कस्टम, टैर, या plain_text प्रारूप का चयन करता हूं या नहीं।

मुझे one discussion online मिला जो बताता है कि मुझे देव मशीन पर pg_restore का एक नया संस्करण उपयोग करना चाहिए। मैंने 9.0 बाइनरी को देव मशीन पर कॉपी करके इसे आजमाया, लेकिन यह लिंकिंग समस्याओं के कारण विफल रहता है (अप्रत्याशित रूप से नहीं)।

मैंने सोचा कि सादा_टेक्स्ट डंप का उपयोग करने का बिंदु यह था कि यह कच्चा, पोर्टेबल एसक्यूएल होगा। जाहिरा तौर पर नहीं।

मैं अपने 8.4 इंस्टॉल में 9.0 डीबी कैसे प्राप्त कर सकता हूं?

+0

आप दोनों 8.4 और 9.0 साथ में चल रहे (है कि मैं क्या कर रहा है, यह ठीक काम करता है), इस तरह आप स्थानीय परियोजनाओं है कि यह इस पर निर्भर के लिए 8.4 रख सकते हो सकता था, फिर भी है कि एक appplication 9 का उपयोग करता है के लिए 9.0 है : लंबे समय पर, यह बेहतर की तुलना में एक अलग संस्करण से एक डंप बहाल करने की कोशिश बंद का भुगतान करेगा। – wildpeaks

+0

[निर्यात और pgAdmin III के साथ PostgresSQL का आयात] (http://stackoverflow.com/a/39167526/1045444) –

उत्तर

25

pg_restore केवल "कस्टम" प्रारूप में किए गए डंप को बहाल करने के लिए है। आप एक "सादे पाठ" करते हैं

डंप आप उत्पन्न एसक्यूएल स्क्रिप्ट चलाने के लिए psql उपयोग करने के लिए:

 
psql -f nvdls.db dbname username 
+0

कि यह किया, धन्यवाद! – Phrogz

3

9,0 से 8.4 करने के लिए ले जाने के लिए pg_dump/pg_restore उपयोग समर्थित नहीं है - केवल यह है आगे बढ़ने समर्थित।

हालांकि, आप आमतौर पर डेटा (डेटा-केवल डंप में) प्राप्त कर सकते हैं, और कुछ मामलों में आप स्कीमा प्राप्त कर सकते हैं - लेकिन यह अधिकतर भाग्य है, यह इस बात पर निर्भर करता है कि आप किस विशेषताओं का उपयोग कर रहे हैं।

आपको आमतौर पर pg_dump और pg_restore के लक्ष्य संस्करण का उपयोग करना चाहिए - जिसका अर्थ है कि आपको 8.4 से बाइनरी का उपयोग करना चाहिए। लेकिन आपको pg_dump और pg_restore के समान संस्करण का उपयोग करना चाहिए। दोनों उपकरण नेटवर्क पर ठीक काम करेंगे, इसलिए आसपास के द्विआधारी की प्रतिलिपि बनाने की आवश्यकता नहीं होनी चाहिए।

और a_horse_with_no_name कहता है, आप सादे टेक्स्ट मोड में pg_dump का उपयोग करना बेहतर हो सकते हैं - जो आपको आवश्यक होने पर डंप को हाथ से संपादित करने की अनुमति देगा। विशेष रूप से, आप केवल एक स्कीमा केवल डंप (साथ-साथ) बना सकते हैं और एक डेटा केवल डंप कर सकते हैं - केवल स्कीमा डंप को किसी भी संपादन की आवश्यकता होने की संभावना है।

+0

डेटा से अलग डंपिंग स्कीमा पर अच्छा सुझाव। मैं plain_text, लेकिन अप्राप्य कुछ भी नहीं का उपयोग कर में कुछ त्रुटियां मिलीं। मैं dev मशीन से pg_dump का उपयोग करने का प्रयास नहीं कर सका क्योंकि उत्पादन सर्वर दूरस्थ कनेक्शन को अस्वीकार करने के लिए कॉन्फ़िगर किया गया है, लेकिन यह भी वादा करता है। – Phrogz

+1

आप इसे तब तक दूरस्थ रूप से उपयोग कर सकते हैं जब तक आपके पास एसएसएच पोर्ट अग्रेषण (या समान) का उपयोग करने की क्षमता हो। 9.2.2 bytea_output सेटिंग्स में –

2

यदि 9.0 डेटाबेस में कोई बाइट कॉलम है, तो बड़ी समस्याएं प्रतीक्षा करेंगी।

इन कॉलम में "हेक्स" प्रतिनिधित्व का उपयोग कर pg_dump द्वारा निर्यात किया जाएगा और की तरह अपने डंप फ़ाइल में दिखाई देते हैं:

चयन pg_catalog.lowrite (0, '\ x0a2')

किसी भी postgres के संस्करण 9.0 से नीचे का बैकएंड बाइटिया के हेक्स प्रस्तुति को ग्रोक नहीं कर सकता है, और मुझे इसका उपयोग न करने के लिए 9.0 पक्ष पर pg_dump को बताने का विकल्प नहीं मिल रहा है।डेटाबेस या पूरे सर्वर के लिए डिफ़ॉल्ट "bytea_output" सेटिंग को ESCAPE पर सेट करना pg_dump द्वारा अनदेखा किया जाता है।

मुझे लगता है कि डंप फ़ाइल को पोस्ट-प्रोसेस करना संभव होगा और वास्तव में प्रत्येक हेक्स-एन्कोडेड बाइटा मान को बचने के लिए बदलना संभव होगा, लेकिन सामान्य रूप से बाइटा (छवियों, पीडीएफ) में सामान्य रूप से संग्रहीत चीजों को भ्रष्ट करने का जोखिम आदि) मुझे उत्तेजित नहीं करता है।

+0

कम से कम अब pg_dump के लिए आज्ञा का पालन किया जाता है, इसलिए 'भागने' के लिए यह स्थापित करने bytea क्षेत्रों के लिए कम से कम एक 8.4 संगत डंप कर देगा। आपको अभी भी प्रक्रियाओं के बारे में कुछ चेतावनियां मिलती हैं। – jishi

2

मैंने पोस्टग्रेस्क्ल को 8.X से 9.2.4 तक अपग्रेड करके हल किया। आप मैक ओएस एक्स पर काढ़ा उपयोग कर रहे हैं, का उपयोग करें -

brew upgrade postgresql 

इसके पूर्ण होते ही, बस सुनिश्चित करें कि आपके नए postgres स्थापना अपने पथ के शीर्ष पर है या नहीं। यह कुछ ऐसा दिखाई देगा (संस्करण स्थापना पथ के आधार पर) -

export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH 
0

मुझे एक ही समस्या थी। मैंने निर्यात/आयात डीबी के लिए पीजीडम्प और psql का इस्तेमाल किया।

pg_dump साथ 1.Set PGPASSWORD

export PGPASSWORD='h0ld1tn0w'; 

2.Export डीबी

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/opt/db.out डंप मार्ग है। आप अपना खुद का निर्दिष्ट कर सकते हैं।

3. फिर फिर से एक और होस्ट का PGPASSWORD सेट करें। यदि होस्ट समान है या पासवर्ड समान है तो इसकी आवश्यकता नहीं है।

अपने एक और मेजबान पर

4.Import db

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out 

तो उपयोगकर्ता नाम अलग है तो पाते हैं और db.out फ़ाइल में अपने स्थानीय उपयोगकर्ता नाम के साथ बदलें। और सुनिश्चित करें कि उपयोगकर्ता नाम पर प्रतिस्थापित किया गया है और डेटा नहीं।