PostgreSQL 데이터베이스 복원시 권한 문제를 해결하는 방법


104

명령을 사용하여 Postgres 데이터베이스에 대한 깨끗한 소유자 백업을 덤프했습니다.

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

일반 텍스트 SQL pg_dump생성을 파헤 치고 SQL 이 포함되어 있음을 발견했습니다.

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_namepublic스키마 및 plpgsql.

이 문제를 어떻게 해결할 수 있습니까?


5
당신이 필요하지 않다면 plpgsql, DROP EXTENSION plpgsql당신 전에 pg_dump. 이 앱 슈퍼 사용자를 만들기보다 안전이며, (당신이 사용하는 경우 폭탄 오류를 무시하고보다 편리 --single-transaction또는 -v ON_ERROR_STOP=1). 이것은 알려진 문제입니다. [Postgres 개발자가 자세히 설명] postgresql.org/message-id/… 그러나 9.3부터 수정되지 않았습니다.
Mark E. Haase

답변:


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.htmlHTTPS는 : //www.postgresql.org/docs/current/static/sql-alterrole.html .


28
수퍼 유저가되지 않고이 작업을 수행 할 수있는 방법이 있습니까?
Travis Webb 2014 년

17
"적절한 소유권 권한을 할당해야 함"및 "<사용자 이름> 수퍼 유저 역할 변경"이 일치하지 않습니다. 적절한 소유권은 수퍼 유저 app_user아님을 의미합니다 .
Mark E. Haase

@mehaase 다운 투표가 아닌 답변의 문구를 업데이트하십시오.
Daniel Sokolowski 2015-06-05

5
IMHO 이것은 해결책이 아니지만 프로덕션에서 피해야하는 해결 방법입니다.
Dmytriy Voloshyn

6
일반 사용자 만들 수있는 나쁜 제안이다superuser
EVREN Yurtesen

55

AWS RDS 사용자는 슈퍼 유저가 아니기 때문이며 AWS 설명서에 따르면 슈퍼 유저가 될 수 없기 때문입니다. 이 오류를 무시해야한다는 것을 알게되었습니다.


5
이 오류로 인해 복원이 완료되지 않습니다 (AWS RDS pg_restore). 이러한 오류를 무시하기위한 팁이 있습니까?
avjaarsveld

PS 나는 -e 또는 --exit - 온 - 오류를 사용하지 않은 pg_restore에
avjaarsveld

6
나는 RDS에 문제가 있음을 발견했습니다 COMMENT ON EXTENSION하지 CREATE EXTENSION. 주석을 제거하면 괜찮을 것입니다.
pkoch

@pkoch는 Google Cloud Storage와 동일합니다. 확장에 대한 의견이 문제 였고 필요하지 않았습니다
Jaybeecave

25

Google Cloud Platform을 사용하는 사용자의 경우 오류가 발생하면 가져 오기 프로세스가 중지됩니다. 개인적으로 발행 한 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.

일반 텍스트가 아닌 형식으로 DB를 덤프하려고 할 때 발생합니다. 즉, 명령에 -Fp 또는 --format = plain 매개 변수가없는 경우. 그러나 명령에 추가하면 다음 오류가 발생할 수 있습니다.

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과 관련된 모든 명령을 주석 처리하는 것입니다.

이것이 GCP 의존 영혼에게 도움이되기를 바랍니다.

업데이트 :

특히 일부 덤프는 크기가 클 수 있으므로 확장자를 주석 처리하여 파일을 덤프하는 것이 더 쉽습니다. 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

짧은 대답 : 무시하십시오.

이 모듈은 SQL 언어를 처리하는 Postgres의 일부입니다. 이 오류는 'heroku pg : pull'과 같은 원격 데이터베이스 복사의 일부로 종종 표시됩니다. SQL 프로세서를 덮어 쓰지 않고 이에 대해 경고합니다.


9

-L가져온 파일을 지정하여 pg_restore와 함께 플래그를 사용해보십시오.pg_dump -Fc

-L 목록 파일 --use-list = 목록 파일

목록 파일에 나열된 아카이브 요소 만 복원하고 파일에 나타나는 순서대로 복원합니다. -n 또는 -t와 같은 필터링 스위치가 -L과 함께 사용되는 경우 복원 된 항목을 추가로 제한합니다.

list-file은 일반적으로 이전 -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
--

위의 내용이 정확하다고 생각합니다. 플러그인에 대한 주석을 제외해도 앱의 기능에는 영향을 미치지 않습니다
Andreas

3

사람들이 사용하기 위해 AWS를 의는 COMMENT ON EXTENSION전용으로 가능하다 수퍼 유저 , 우리는 문서가 아는 한, RDS 인스턴스는 아마존에 의해 관리됩니다. 따라서 복제와 같은 작업이 중단되는 것을 방지하기 위해 사용자 (인스턴스 생성시 설정 한 루트 사용자 포함)는 완전한 수퍼 유저 권한을 갖지 않습니다.

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

DB 인스턴스를 생성 할 때 생성 한 마스터 사용자 시스템 계정이 rds_superuser 역할에 할당됩니다. rds_superuser 역할은 PostgreSQL 수퍼 유저 역할 (일반적으로 로컬 인스턴스에서 postgres로 명명 됨)과 유사한 사전 정의 된 Amazon RDS 역할이지만 몇 가지 제한 사항이 있습니다. PostgreSQL 수퍼 유저 역할과 마찬가지로 rds_superuser 역할은 DB 인스턴스에 대한 권한이 가장 많으므로 사용자가 DB 인스턴스에 가장 많이 액세스해야하는 경우가 아니면이 역할을 사용자에게 할당하면 안됩니다.

이 오류를 수정하려면 다음을 --포함하는 SQL 행을 주석 처리하십시오.COMMENT ON EXTENSION


2
또는 덤프 할 때 주석을 생략하십시오 pg_dump --no-comments..
Dmitrii I.

2

postgres (admin) 사용자를 사용하여 스키마를 덤프하고 다시 생성하고 복원을 수행하기 전에 사용할 권한을 부여합니다. 하나의 명령으로 :

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 으로 데이터베이스를 설정하고 있었고 데이터베이스 생성 중에 소유자를 설정하는 것만으로는 충분하지 않은 것 같습니다. 나는 '공개'스키마 로 이동하고 거기 에 소유자 도 설정해야했습니다 (원래 'postgres'였습니다).


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에서 로컬로 개발 (스키마 마이그레이션이 실행될 때마다 자동으로 새 덤프 파일 생성),이 솔루션을 사용 rails db:reset하면 스키마를 실행할 때마다 덤프 파일에서 COMMENT ON 줄을 제거하지 않고도 AWS RDS postgresql 인스턴스에 대해 간단히 실행할 수 있습니다. 이주.
Mark Schneider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.