क्यों pg_restore की उपेक्षा - गंभीर? त्रुटि: विफल: FATAL: डेटाबेस "new_db" मौजूद नहीं है


17

मैं निम्नलिखित कमांड चलाने की कोशिश कर रहा हूं:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

मुझे मिला:

failed: FATAL:  database "new_db" does not exist

जवाबों:


19

ऐसा इसलिए है क्योंकि यह जिस तरह से pg_restore काम करता है।

pg_restore मैनुअल निम्नानुसार पढ़ता है:

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

जब इस विकल्प का उपयोग किया जाता है, तो -d नाम के डेटाबेस का उपयोग केवल प्रारंभिक DROP DATABASE और CREATE DATABASE आदेश जारी करने के लिए किया जाता हैसभी डेटा को डेटाबेस नाम में संग्रहीत किया जाता है जो संग्रह में दिखाई देता है

-D दिए गए डेटाबेस में पुनर्स्थापित करेगा यदि और केवल अगर -सी का उपयोग नहीं किया जाता है। यदि -सी का उपयोग किया जाता है, तो डेटाबेस का उपयोग "लॉन्चपैड" के रूप में किया जाता है, गंतव्य के रूप में नहीं।


6
स्पष्ट करने के लिए: एक मनमाना डेटाबेस नाम बनाने और इसके साथ इसे पुनर्स्थापित करने का कोई तरीका नहीं है pg_restore। -सी विकल्प केवल एक डेटाबेस बना सकता है जिसका नाम डंप फ़ाइल में डेटाबेस के नाम से मेल खाता है। एक मनमाना डेटाबेस को पुनर्स्थापित करने के लिए, आपको चलाने CREATE DATABASE new_db;से पहले psql में चलना होगा pg_restore --dbname=new_db
ल्यूक

मेरी आज्ञाdocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma

5
जब वे आसान हो सकते हैं तो उपकरणों को भ्रमित क्यों होना पड़ता है?
ऑगस्टिन रीडिंगर

8

संक्षेप में, आप या तो (स्वच्छ मौजूदा) चाहते हैं: (डेटाबेस का नाम नोट करें postgres)

pg_restore -c -d postgres db.dump

या (नया बनाएँ)

pg_restore -C -d postgres db.dump

या (स्पष्ट रूप से नया बनाएं)

createdatabase the_database
pg_restore -d the_database db.dump

अधिक विवरण के लिए देखें कि SCO ने क्या कहा।


आपका पहला सुझाव 9.1 पर काम नहीं किया:pg_restore: [archiver] -C and -c are incompatible options
peetasan

मैं पुष्टि कर सकता हूं कि यह काम करता है (संपादन के बाद, और "पोस्टग्रेज" की गलत वर्तनी को ठीक करने के बाद)। pg_restore -C -d postgres db.dumpडरावना लग सकता है, लेकिन यह डेटाबेस को स्थगित करने के लिए कुछ भी नहीं करता है, यह केवल प्रारंभिक कनेक्शन के लिए इसका उपयोग करता है।
जिल्क

0

थोड़ा और स्पष्ट होने के लिए, यह वही है जो मैंने किया था जो मेरे लिए समस्या का समाधान करता है:

  1. इच्छित नाम के साथ एक खाली डेटाबेस बनाएं: (मेरे मामले में उपयोगकर्ता नाम 'पोस्टग्रेज' था)

    psql -U [username]

यह तब आपको अपने पासवर्ड के लिए संकेत देगा। इस बिंदु पर आपको [उपयोगकर्ता नाम] के रूप में लॉग इन किया जाएगा। निम्नलिखित टाइप करें:

    CREATE DATABASE [dbname];

अब सत्र से बाहर निकलें और अपने नियमित टर्मिनल सत्र पर वापस जाएं।

  1. आपके द्वारा बनाए गए लक्ष्य डेटाबेस नाम को उस डेटाबेस के नाम के रूप में डेटाबेस से पुनर्स्थापित करें, जिसे आपने अभी बनाया था।

    cat [your_file_path/filename] | psql -U [username] [dbname]

जहां [your_file_path / फ़ाइल नाम] db फ़ाइल या पाठ फ़ाइल का स्थान है जिसे आप पुनर्स्थापित करना चाहते हैं।


डी -Fविकल्प का उपयोग करके बैकअप बनाते समय आपको बैकअप को पुनर्स्थापित करने के लिए pg_restore का उपयोग करना होगा जब तक कि आप उपयोग न करें -F pजो वर्ग वाक्य के साथ एक सादे पाठ फ़ाइल का उत्पादन करता है।
ईएमेज़ सिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.