PostgreSQL डेटाबेस को पुनर्स्थापित करते समय विशेषाधिकारों के मुद्दों को कैसे हल करें


104

मैंने कमांड के साथ पोस्टग्रेज डेटाबेस के लिए एक स्वच्छ, कोई मालिक बैकअप नहीं लिया है

pg_dump sample_database -O -c -U

बाद में, जब मैं डेटाबेस को पुनर्स्थापित करता हूं

psql -d sample_database -U app_name

हालाँकि, मुझे कई त्रुटियों का सामना करना पड़ा जो मुझे डेटा को पुनर्स्थापित करने से रोकता है:

ERROR:  must be owner of extension plpgsql
ERROR:  must be owner of schema public
ERROR:  schema "public" already exists
ERROR:  must be owner of schema public
CREATE EXTENSION
ERROR:  must be owner of extension plpgsql

मैंने प्लेन-टेक्स्ट एसक्यूएल जेनेरेट में खुदाई की pg_dumpऔर मैंने पाया कि इसमें एसक्यूएल है

CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

मुझे लगता है कि कारण हैं कि उपयोगकर्ता के app_nameपास publicस्कीमा को बदलने के लिए विशेषाधिकार नहीं हैं और plpgsql

मैं इस मुद्दे को कैसे हल कर सकता हूं?


5
अगर आपको जरूरत नहीं है plpgsql, तो DROP EXTENSION plpgsqlआप से पहले pg_dump। यह आपके ऐप को एक सुपर उपयोगकर्ता बनाने की तुलना में अधिक सुरक्षित है, और यह त्रुटियों को अनदेखा करने से अधिक सुविधाजनक है (जो आप उपयोग --single-transactionया करते हैं -v ON_ERROR_STOP=1) बम । यह एक ज्ञात समस्या है, [पोस्टग्रेज डेवलपर्स द्वारा लंबाई पर चर्चा की गई है postgresql.org/message-id/… लेकिन 9.3 के रूप में तय नहीं।
मार्क ई। हसे

जवाबों:


63

समस्या को हल करने के लिए आपको उचित स्वामित्व अनुमतियाँ निर्दिष्ट करनी चाहिए। नीचे की कोशिश करें जो विशिष्ट उपयोगकर्ताओं के लिए सभी अनुमति से संबंधित मुद्दों को हल करना चाहिए लेकिन जैसा कि टिप्पणियों में कहा गया है कि इसका उत्पादन में उपयोग नहीं किया जाना चाहिए:

root@server:/var/log/postgresql# sudo -u postgres psql
psql (8.4.4)
Type "help" for help.

postgres=# \du
               List of roles
    Role name    | Attributes  | Member of
-----------------+-------------+-----------
 <user-name>    | Superuser   | {}
                 : Create DB
 postgres       | Superuser   | {}
                 : Create role
                 : Create DB

postgres=# alter role <user-name> superuser;
ALTER ROLE
postgres=#

तो एक सुपरयूजर खाते के तहत डेटाबेस से कनेक्ट करें sudo -u postgres psqlऔर एक ALTER ROLE <user-name> Superuser;स्टेटमेंट निष्पादित करें ।

ध्यान रखें कि मल्टी-साइट होस्टिंग सर्वर पर यह सबसे अच्छा समाधान नहीं है, इसलिए इसके बजाय व्यक्तिगत भूमिकाएँ असाइन करने पर एक नज़र डालें: https://www.postgresql.org/docs/current/static/sql-set-role.html और https : //www.postgresql.org/docs/current/static/sql-alterrole.html


28
वहाँ एक तरीका है एक सुपरयूजर के बिना ऐसा करने के लिए है?
ट्रैविस वेब

17
"उचित स्वामित्व अनुमतियाँ निर्दिष्ट करनी चाहिए" और "परिवर्तन भूमिका <उपयोगकर्ता-नाम> सुपरयुसर" बधाई नहीं है। उचित स्वामित्व मतलब यह होगा कि app_userहै नहीं एक सुपर उपयोगकर्ता।
मार्क ई। हसे

@mehaase वोटिंग के विरोध के रूप में उत्तर के शब्दों को अद्यतन करें।
डैनियल सोकोलोव्स्की

5
IMHO यह समाधान नहीं है, लेकिन उत्पादन में बचा जाना चाहिए कि समाधान है।
दिमित्री वोलोशिन

6
एक सामान्य उपयोगकर्ता बनाने के लिए एक बुरा सुझाव हैsuperuser
एवरेन यर्टसेन

55

अगर आपको यह मिल रहा है तो AWS RDS उपयोगकर्ता क्योंकि आप एक सुपरयुसर नहीं हैं और aws प्रलेखन के अनुसार आप एक नहीं हो सकते। मैंने पाया है कि मुझे इन त्रुटियों को नजरअंदाज करना होगा।


5
यह त्रुटि मुझे (AWS RDS pg_restore) को पूरा करने से रोक रही है। इन त्रुटियों को अनदेखा करने के लिए कोई सुझाव?
११:४१ बजे

PS मैंने pe_restore के लिए -e या --exit-on-error का उपयोग नहीं किया
avjaarsveld

6
मैंने पाया है कि, आरडीएस पर, समस्या है COMMENT ON EXTENSION, नहीं CREATE EXTENSION। टिप्पणियों को हटा दें और आपको ठीक होना चाहिए।
पच १ch

@ Google क्लाउड स्टोरेज के साथ एक ही। टिप्पणी पर टिप्पणी मुद्दा था और जरूरत नहीं
Jaybeecave

25

Google क्लाउड प्लेटफ़ॉर्म का उपयोग करने वाले लोगों के लिए, कोई भी त्रुटि आयात प्रक्रिया को रोक देगी। व्यक्तिगत रूप से मुझे मेरे द्वारा जारी pg_dump कमांड के आधार पर दो अलग-अलग त्रुटियों का सामना करना पड़ा:

1- The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

तब होता है जब आपने अपने डीबी को एक गैर सादे पाठ प्रारूप में डंप करने की कोशिश की है। यानी जब कमांड में कमी होती है -Fp या --format = सादा पैरामीटर। हालाँकि, यदि आप इसे अपनी कमांड में जोड़ते हैं, तो आप निम्न त्रुटि का सामना कर सकते हैं:

2- SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql

यह एक अनुमति मुद्दा है जिसे मैं GCP डॉक्स में दिए गए आदेश का उपयोग करने में असमर्थ हूं , इस वर्तमान थ्रेड से युक्तियां, या यहां Google Postgres टीम से सलाह के बाद । जो निम्नलिखित आदेश जारी करने की सिफारिश की:

pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql

केवल एक चीज जो मेरे मामले में छल करती थी, वह मैन्युअल रूप से डंप फ़ाइल को संपादित करना और plpgsql से संबंधित सभी आदेशों पर टिप्पणी करना था।

मुझे उम्मीद है कि इससे जीसीपी-भरोसेमंद आत्माओं को मदद मिलेगी।

अपडेट करें :

एक्सटेंशन को कम करने वाली फ़ाइल को डंप करना आसान है, खासकर जब से कुछ डंप विशाल हो सकते हैं: pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

जिसे plpgsql तक सीमित किया जा सकता है: pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql


1
GCP के पास अब pg_dumpअपने डॉक्स में उपयोग करने के लिए सटीक कमांड है :pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \ | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql
Rush

14

आप शायद इस मामले में त्रुटि संदेशों को सुरक्षित रूप से अनदेखा कर सकते हैं। सार्वजनिक स्कीमा में एक टिप्पणी जोड़ने और plpgsql (जो पहले से ही स्थापित होना चाहिए) को स्थापित करने में असफल होने से कोई वास्तविक समस्या नहीं होगी।

हालाँकि, यदि आप एक पूर्ण री-इंस्टॉल करना चाहते हैं, तो आपको उपयुक्त अनुमति वाले उपयोगकर्ता की आवश्यकता होगी। वह उपयोगकर्ता नहीं होना चाहिए जो आपके आवेदन को नियमित रूप से चलाता है।


12

कम जवाब: इसे अनदेखा करें।

यह मॉड्यूल Postgres का हिस्सा है जो SQL भाषा को प्रोसेस करता है। त्रुटि अक्सर दूरस्थ डेटाबेस की प्रतिलिपि बनाने के भाग के रूप में पॉप अप करेगी, जैसे कि 'heroku pg: pull'। यह आपके SQL प्रोसेसर को अधिलेखित नहीं करता है और आपको इसके बारे में चेतावनी देता है।


9

-Lफ़ाइल से निर्दिष्ट करके pg_restore के साथ ध्वज का उपयोग करने का प्रयास करेंpg_dump -Fc

-L सूची-फ़ाइल --use-list = सूची-फ़ाइल

केवल उन संग्रह तत्वों को पुनर्स्थापित करें जिन्हें सूची-फ़ाइल में सूचीबद्ध किया गया है, और उन्हें फ़ाइल में दिखाई देने वाले क्रम में पुनर्स्थापित करें। ध्यान दें कि यदि -n या -t जैसे फ़िल्टरिंग स्विच का उपयोग -L के साथ किया जाता है, तो वे पुन: स्थापित की गई वस्तुओं को प्रतिबंधित कर देंगे।

सूची-फ़ाइल आम तौर पर पिछले -l ऑपरेशन के आउटपुट को संपादित करके बनाई जाती है। लाइनों को स्थानांतरित या हटाया जा सकता है, और लाइन की शुरुआत में अर्धविराम (;) रखकर भी टिप्पणी की जा सकती है। उदाहरण के लिए नीचे देखें।

https://www.postgresql.org/docs/9.5/app-pgrestore.html

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
pg_restore -L pg_restore.list pg.dump

यहाँ आप देख सकते हैं उलटा केवल टिप्पणी का उत्पादन करके सच है:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
pg_restore -L pg_restore_inverse.list pg.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.15
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- PostgreSQL database dump complete
--

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

3

AWS का उपयोग करने वाले लोगों के लिए , COMMENT ON EXTENSIONकेवल सुपरयुसर के रूप में संभव है , और जैसा कि हम डॉक्स द्वारा जानते हैं, आरडीएस उदाहरणों को अमेज़ॅन द्वारा प्रबंधित किया जाता है। जैसे, आपको प्रतिकृति जैसी चीजों को तोड़ने से रोकने के लिए, आपके उपयोगकर्ता - यहां तक ​​कि रूट उपयोगकर्ता जिसे आप सेट करते समय बनाते हैं - आपके पास पूर्ण सुपरयुसर विशेषाधिकार नहीं होंगे:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

जब आप DB उदाहरण बनाते हैं, तो आपके द्वारा बनाए गए मास्टर उपयोगकर्ता सिस्टम को rds_superuser भूमिका में असाइन किया जाता है। Rds_superuser भूमिका एक पूर्व-परिभाषित अमेज़ॅन आरडीएस भूमिका है जो पोस्टग्रेक्यूएल सुपरसुसर भूमिका (स्थानीय रूप से पोस्टग्रेज में नामित पोस्टग्रेज) के समान है, लेकिन कुछ प्रतिबंधों के साथ। जैसा कि PostgreSQL सुपरसुअर भूमिका के साथ, rds_superuser भूमिका में आपके DB उदाहरण पर सबसे अधिक विशेषाधिकार हैं और आपको यह भूमिका उपयोगकर्ताओं को तब तक असाइन नहीं करनी चाहिए, जब तक कि उन्हें DB उदाहरण के लिए सबसे अधिक पहुँच की आवश्यकता न हो।

इस त्रुटि को ठीक करने के लिए, बस --SQL की पंक्तियों को शामिल करने के लिए टिप्पणी का उपयोग करेंCOMMENT ON EXTENSION


2
या डंप करते समय टिप्पणियों को छोड़ दें pg_dump --no-comments:।
दिमित्री आई।

2

स्कीमा को डंप करने के लिए पोस्टग्रेज (व्यवस्थापक) उपयोगकर्ता का उपयोग करें, इसे पुनर्स्थापित करें और उपयोग करने के लिए निजीकृत को अनुदान दें इससे पहले कि आप अपना पुनर्स्थापित करें। एक आदेश में:

sudo -u postgres psql -c "DROP SCHEMA public CASCADE;
create SCHEMA public;
grant usage on schema public to public;
grant create on schema public to public;" myDBName

1

मेरे लिए, मैं pgAdmin के साथ एक डेटाबेस सेट कर रहा था और ऐसा लगता है कि डेटाबेस निर्माण के दौरान मालिक को सेट करना पर्याप्त नहीं था। मुझे 'जनता' स्कीमा पर नीचे जाना था और मालिक को वहाँ भी स्थापित करना था (मूल रूप से 'पोस्टग्रेज़')।


0

उन लोगों के लिए, जिन्होंने इस मुद्दे को COMMENT ONबयानों के नीचे सीमित कर दिया है (नीचे दिए गए विभिन्न उत्तरों के अनुसार) और जिनके पास स्रोत डेटाबेस तक सुपरसुसर पहुंच है, जहां से डंप फ़ाइल बनाई गई है, सरलतम उपाय हो सकता है कि टिप्पणियों को डंप में शामिल होने से रोका जा सके। फ़ाइल को पहली बार स्रोत डेटाबेस से हटाकर उन्हें डंप किया जा रहा है ...

COMMENT ON EXTENSION postgis IS NULL;
COMMENT ON EXTENSION plpgsql IS NULL;
COMMENT ON SCHEMA public IS NULL;

भविष्य के डंप तो COMMENT ONबयानों को शामिल नहीं करेंगे ।


1
रेल में स्थानीय रूप से विकसित करना (जो एक स्कीमा माइग्रेशन चलने पर स्वचालित रूप से एक नई डंप फ़ाइल बनाता है), यह समाधान मुझे rails db:resetहर बार एक स्कीमा चलाने के दौरान डंप फ़ाइल से लाइनें चालू करने के लिए बिना AWS RDS पोस्टग्रेजेक उदाहरण के खिलाफ चलने में सक्षम बनाता है। पलायन।
मार्क श्नाइडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.