2012-04-16 7 views
42

के बारे में PostgreSQL 9.1 pg_restore त्रुटि मैं django प्रोजेक्ट के लिए पोस्टग्रेस का उपयोग कर रहा हूं और मैं वर्तमान में डेटाबेस बैकअप/पुनर्स्थापना प्रणाली को कार्यान्वित कर रहा हूं, जितना संभव हो सके उपयोगकर्ता पीजी_डम्प करता है जब उपयोगकर्ता बैकअप पर क्लिक करता है और फिर बैकअप पुनर्स्थापित करने पर pg_restore करता है।PLGGSQL

pg_restore: [archiver (db)] Error from TOC entry 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

मैं क्या plpgsql है आदि देखा है और मुझे लगता है कि समझते हैं, और त्रुटि के संबंध में:

सभी ठीक है और dandy जब तक यह वास्तव में pg_restore जिस समय पर यह इस त्रुटि देता है प्रदर्शन करने की कोशिश करता है लगता है मैंने उपयोगकर्ता को स्क्रिप्ट निष्पादित करने वाले उपयोगकर्ता को मैन्युअल रूप से "एक्सटेंशन का मालिक" सेट करने का प्रयास किया और डेटाबेस का स्वामित्व किया, लेकिन यह कुछ भी नहीं बदला, यह वास्तव में परेशान है क्योंकि सभी चीजों की टिप्पणी सेट करने के प्रयास में इसकी गलती

यह है सभी pg_dump द्वारा स्वचालित रूप से बनाए गए हैं इसलिए टिप्पणी पंक्ति को हटाया नहीं जा सकता है और टिप्पणियों को अक्षम करने के लिए कोई झंडे नहीं हैं (जो मुझे पता है), इसलिए मैं वास्तव में इस मुद्दे को हल करने के तरीके के रूप में अटक गया हूं।

+0

यदि आप psql का उपयोग करके कनेक्ट करते हैं और '\ l' टाइप करते हैं, तो आप उस डेटाबेस के लिए "स्वामी" कॉलम में क्या देखते हैं? चूंकि plpgsql एक अविश्वसनीय भाषा है, इसलिए इसे डेटाबेस स्वामी या डेटाबेस सुपरसुर द्वारा केवल संशोधित किया जा सकता है (और मुझे लगता है कि उस पर भी टिप्पणी पर लागू होता है)। – kgrittn

+0

मैं पुष्टि कर सकता हूं कि मालिक डेटाबेस का है और सही है और pg_restor कमांड के यूयू विकल्प द्वारा निर्दिष्ट उपयोगकर्ता से मेल खाता है (और pg_dump भी) –

+0

दुर्भाग्य से यह इतना आसान नहीं है। मेरे पास pg_dump आउटपुट है जो उन भाषाओं का उपयोग करके भाषाएं और फ़ंक्शंस बनाने में सक्षम होने की अपेक्षा करता है।यदि मैं डीबी सुपरसुर के रूप में भाषा को हाथ-निर्माण करता हूं, तो फ़ंक्शन निर्माण अनुमति त्रुटियों के कारण विफल रहता है। यदि मैं नहीं करता, प्रक्रिया त्रुटियों के कारण प्रक्रियात्मक भाषा स्थापना विफल हो जाती है। किसी भी मामले में, आगे बढ़ने वाले ट्रिगर्स जो मौजूदा कार्यों पर भरोसा करते हैं, भी नहीं बनाया जा सकता है, क्योंकि कार्य मौजूद नहीं हैं। – Quixadhal

उत्तर

75

ऐसा लगता है कि pg_restore कुछ अतिरिक्त डेटा को पुनर्स्थापित करने का प्रयास करता है, जिनके पास आपके स्वामित्व नहीं हैं। अपने pg_restore कमांड लाइन में -n public विकल्प जोड़ने का प्रयास करें। यह pg_restore केवल सार्वजनिक स्कीमा की सामग्री को पुनर्स्थापित करेगा बताएगा। आपका आदेश पंक्ति चाहिए लग रहा है

तरह
pg_restore -U username -c -n public -d database_name 
+6

क्या इस विकल्प को पुनर्स्थापित करने के बाद सूचना हानि शामिल है? यही है, क्या यह कोई महत्वपूर्ण डेटा खो देगा? – C2H5OH

+7

@ सी 2 एच 5 ओएच यह निर्भर करता है। जब आपके डेटाबेस बैकअप में एक से अधिक स्कीमा होते हैं तो उपरोक्त आदेश केवल स्कीमा "सार्वजनिक" आयात करेगा (= सूचना हानि)। यदि आप डंप में केवल "सार्वजनिक" स्कीमा है, तो आपके पास कोई समस्या नहीं है (देखें: pg_dump --exclude-schema)। यह जांचने के लिए कि आपकी डंप फ़ाइल में कौन से स्कीमा हैं इसे चलाएं: pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F "" '{प्रिंट $ (एनएफ -1)}' - – DanielaWaranie

+1

यह मेरे मुद्दे को 'pg_restore' के साथ अतिरिक्त एक्सटेंशन में लोड करने का प्रयास कर रहा है, जो हमारे परिदृश्य में इसकी अनुमति नहीं थी। – nibbex

1

क्या आप एक अलग उपयोगकर्ता द्वारा बनाई गई डीबी में लोड हो रहे हैं? यदि संभव हो तो उसी उपयोगकर्ता का उपयोग करके पुनर्स्थापित करने का प्रयास करें जिसने डीबी और इसकी मौजूदा वस्तुओं को बनाया है।

+0

किसी भी उपयोगकर्ता को "-U उपयोगकर्ता नाम" ध्वज के साथ ही कुछ भी कहा जाता है, यह सुनिश्चित करने के लिए कि –

12

मैं इस पृष्ठ पर निम्न वैकल्पिक हल मिल गया:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

विचार pg_restore -l, उपयोग करने के लिए संग्रह की सामग्री को सूचीबद्ध करने के लिए बाहर grep है एक्सटेंशन को पुनर्स्थापित करते समय इस elided सूची का उपयोग करने के लिए उपयोगकर्ता को पुनर्स्थापित करने की अनुमति नहीं है, और pg_restore -L का उपयोग करें।

उदाहरण के लिए:

मेरे लिए
pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements 
pg_restore -L ~/restore_elements ~/database.dump 
+1

को पुनर्स्थापित नहीं किया गया है यह मेरे लिए काम करता है। एक चेतावनी हालांकि, दूसरा आदेश सबकुछ 'STDOUT' पर प्रिंट करेगा ताकि आप शायद इसे इसके बजाय फ़ाइल में रीडायरेक्ट करना चाहें। – shrx

1

वर्क्स इस आदेश के बाद -

[email protected]:~$ sudo -i -u postgres 
[email protected]:~$ psql 
psql (9.3.5) 
Type "help" for help. 

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; 
postgres=# GRANT 
2

संभव हो तो, मैं सुझाव है कि आप टिप्पणी जो किसी भी डंप बनाने से पहले बहाल करने के लिए विफल रहता है हटा दें।

आप ऐसा कर सकते हैं:

COMMENT ON EXTENSION plpgsql IS null; 

आप हर हाल में बनाई गई डेटाबेस के लिए यह करने के लिए नहीं करना चाहते हैं, डीबी से टिप्पणी Template1 कहा जाता है को दूर (CREATE DATABASE… प्रतियां इस डेटाबेस।)

उसके बाद बनाए गए डंप को कोई त्रुटि नहीं बहाल करनी चाहिए।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^