pg_restore: [archiver (db)] क्वेरी निष्पादित नहीं कर सका: त्रुटि: स्कीमा "सार्वजनिक" पहले से मौजूद है


19

मैं बैकअप के लिए pg_dump / pg_restore का उपयोग कर रहा हूं और PostgreSQL डेटाबेस को पुनर्स्थापित करता हूं, लेकिन pg_restore से कुछ त्रुटि संदेश (और एक गैर-शून्य निकास स्थिति) प्राप्त कर रहा हूं। मैंने एक सुपर सरल आधार मामले की कोशिश की (नीचे उल्लिखित) लेकिन फिर भी ये त्रुटियां मिलीं:

pg_restore: [संग्रहकर्ता (db)] TOC को संसाधित करते समय त्रुटि:
pg_restore: [archiver (db)] TOC प्रविष्टि 5 से त्रुटि; 2615 2200 SCHEMA जनता ने पोस्ट किया
pg_restore: [archiver (db)] क्वेरी निष्पादित नहीं कर सका: ERROR: स्कीमा "सार्वजनिक" पहले से मौजूद है
    कमान थी: सृजन स्कीमा जनता;

प्रजनन करने कि प्रक्रिया:

  1. एक नया, वैनिला उबंटू 14.04 डिस्ट्रो स्थापित करें (मैं इस वैग्रंट बॉक्स के साथ वैग्रैंट का उपयोग कर रहा हूं )।
  2. PostgreSQL 9.3 स्थापित करें, किसी भी लिनक्स उपयोगकर्ता से PostgreSQL उपयोगकर्ता "पोस्टग्रेज" के रूप में स्थानीय कनेक्शन की अनुमति देने के लिए कॉन्फ़िगर करें।
  3. एक परीक्षण डेटाबेस बनाएँ। मैं बस कर रहा हूँ:

    योनि @ योनि-उबंटु-भरोसेमंद -64: ~ $ psql --username = पोस्टग्रेज
    psql (9.3.5)
    मदद के लिए "मदद" टाइप करें।
    
    postgres = # create डेटाबेस mydb;
    DATABASE बनाएं
    postgres = # \ q
    vagant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = mydb पोस्ट करता है
    psql (9.3.5)
    मदद के लिए "मदद" टाइप करें।
    
    mydb = # तालिका डेटा (प्रविष्टि बिगिंट) बनाएं;
    तालिका बनाएं
    mydb = # डेटा मानों में डालें (1);
    INSERT 0 1
    mydb = # डेटा मानों में डालें (2);
    INSERT 0 1
    mydb = # डेटा मानों में डालें (3);
    INSERT 0 1
    mydb = # \ q
    
  4. डेटाबेस का बैकअप बनाएं जैसे:

    PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
  5. Mydb में डेटा टेबल से कुछ पंक्तियों को हटा दें ताकि हम यह बता सकें कि क्या हमने डेटा को सफलतापूर्वक पुनर्स्थापित किया है।

  6. डेटाबेस को इसके साथ पुनर्स्थापित करें:

    PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump

डेटा को पुनर्स्थापित किया जाता है, लेकिन चरण 6 में pg_restore कमांड स्थिति से बाहर निकलता है 1और निम्न आउटपुट दिखाता है:

pg_restore: [संग्रहकर्ता (db)] TOC को संसाधित करते समय त्रुटि:
pg_restore: [archiver (db)] TOC प्रविष्टि 5 से त्रुटि; 2615 2200 SCHEMA जनता ने पोस्ट किया
pg_restore: [archiver (db)] क्वेरी निष्पादित नहीं कर सका: ERROR: स्कीमा "सार्वजनिक" पहले से मौजूद है
    कमान थी: सृजन स्कीमा जनता;



चेतावनी: त्रुटियों को बहाल करने पर ध्यान नहीं दिया: 1

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

क्या मुझसे कुछ ग़लत हो रहा है? मुझे यह त्रुटि क्यों दिखाई दे रही है?

जवाबों:


16

त्रुटि हानिरहित है, लेकिन इससे छुटकारा पाने के लिए, मुझे लगता है कि आपको इस पुनर्स्थापना को दो आदेशों में तोड़ने की आवश्यकता है, जैसे:

dropdb -U postgres mydb && \
 pg_restore --create --dbname=postgres --username=postgres pg_backup.dump

--cleanPg_restore में विकल्प बहुत तरह नहीं दिखता है, लेकिन वास्तव में गैर तुच्छ समस्याओं को जन्म देती है।

9.1 तक के संस्करणों के लिए

के संयोजन --createऔर --cleanpg_restore विकल्पों में एक (ऊपर 9.1 करने के लिए) पुराने पीजी संस्करणों में त्रुटि हुआ करता था। वास्तव में कुछ विरोधाभास है (9.1 मैनपेज को उद्धृत करते हुए):

- उन्हें साफ़ करने से पहले डेटाबेस क्लीन (ड्रॉप) डेटाबेस ऑब्जेक्ट

तथा

--create इसमें पुनर्स्थापित करने से पहले डेटाबेस बनाएँ।

क्योंकि ब्रांड-नए डेटाबेस के अंदर सफाई की क्या बात है?

संस्करण 9.2 से शुरू

संयोजन अब स्वीकार कर लिया गया है और डॉक्टर का कहना है कि (9.3 मेन्यू को उद्धृत करते हुए):

- क्लीन क्लीन (ड्रॉप) डेटाबेस ऑब्जेक्ट्स को रीक्रिएट करने से पहले। (यह कुछ हानिरहित त्रुटि संदेश उत्पन्न कर सकता है, अगर कोई ऑब्जेक्ट गंतव्य डेटाबेस में मौजूद नहीं था।)

--create इसमें पुनर्स्थापित करने से पहले डेटाबेस बनाएँ। यदि --clean भी निर्दिष्ट है, तो इसे जोड़ने से पहले लक्ष्य डेटाबेस को छोड़ें और पुन: बनाएँ।

अब दोनों को एक साथ रखने से आपके पुनर्स्थापना के दौरान इस तरह का क्रम होता है:

DROP DATABASE mydb;
...
CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
...
CREATE SCHEMA public;
...
CREATE TABLE...

DROPप्रत्येक व्यक्ति के लिए कोई वस्तु नहीं है, केवल DROP DATABASEशुरुआत में। यदि इसका उपयोग नहीं --createकिया गया तो इसके विपरीत होगा।

वैसे भी इस क्रम की त्रुटि को जन्म देती है publicपहले से ही विद्यमान है क्योंकि बनाने स्कीमा mydbसे template0(जो सामान्य है, यह एक टेम्पलेट डेटाबेस की बात है) यह पहले से ही आयातित किया गया है।

मुझे यकीन नहीं है कि इस मामले को स्वचालित रूप से नियंत्रित नहीं किया गया है pg_restore। शायद यह तब अवांछनीय दुष्परिणाम होगा, जब कोई व्यवस्थापक अनुकूलित करना template0और / या उसके उद्देश्य को बदलना publicचाहे, भले ही हम ऐसा करने वाले नहीं हैं।


मैं 9.6 का उपयोग कर रहा हूं, और इसके --createबिना निर्दिष्ट cleanकरने से समस्या ठीक नहीं होती है।
सेरिन

7

मेरे मामले में, कारण यह था कि मैं एक पोस्टग्रेक्सेल क्लस्टर 9.6 pg_restoreसे pg_dump9.6 द्वारा बनाए गए डंप को पुनर्स्थापित करने के लिए पोस्टग्रैक्स्ल-कॉर्बिन संस्करण 11.2 से उपयोग कर रहा था ।

जब मैंने अपनी pg_restoreपीठ को 9.6 से नीचे कर दिया, तब यह schema "public" already existsत्रुटि हो गई थी, और पुनर्स्थापना प्रक्रिया पहले की तरह काम कर रही थी।


लेकिन क्या आपने पोस्टग्रेज 11.2 डेटाबेस में pg_restore 9.6 का उपयोग करके डंप को पुनर्स्थापित किया?
मारियानो रुइज़

@MarianoRuiz मुझे लगता है कि मेरा मूल उत्तर स्पष्ट है: "मैं pg_restore को postgresql-contrib संस्करण 11.2 से pg_dump 9.6 द्वारा PostgreSQL क्लस्टर 9.6 में बनाए गए डंप को पुनर्स्थापित करने के लिए उपयोग कर रहा था।" तो आपके प्रश्न के लिए: नहीं, मैंने नहीं किया। मेरा pg_restore 11.2 था जबकि pg क्लस्टर 9.6 था
Lu लियू

0

मैंने इसे हल किया:

में db.sqlफ़ाइल

drop database if exists DB_name;
create database DB_name;
drop schema if exists public;
create schema public;
\q

फिर

PGPASSWOD=DB_pass psql -U DB_user -h 127.0.0.1 < db.sql

और तब

PGPASSWOD=DB_pass pg_restore -h 127.0.0.1 \ 
    -U DB_user -d DB_name --create --no-acl --no-owner DB_dump_FILE

मेरा pg_restore संस्करण 11.6 है

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