Как решить проблемы с привилегиями при восстановлении базы данных PostgreSQL

Я сбросил чистую резервную копию владельца для базы данных 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_name не имеет привилегий для изменения схемы public и plpgsql.

Как я могу решить эту проблему?

Ответ 1

Чтобы решить проблему, вы должны назначить правильные права собственности. Попробуйте следующее, которое должно разрешить все связанные с разрешением проблемы для определенных пользователей, но, как указано в комментариях, это не должно использоваться в производстве:

[email protected]:/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.

Ответ 2

Пользователи AWS RDS, если вы это понимаете, потому что вы не суперпользователь, и согласно документации aws вы не можете быть одним из них. Я обнаружил, что должен игнорировать эти ошибки.

Ответ 3

В этом случае вы, вероятно, можете безопасно игнорировать сообщения об ошибках. Невозможность добавить комментарий к общедоступной схеме и установке plpgsql (который уже должен быть установлен) не вызовет никаких реальных проблем.

Однако, если вы хотите выполнить полную переустановку, вам понадобится пользователь с соответствующими разрешениями. Это не должно быть вашим приложением, которое обычно запускается, как обычно.

Ответ 4

Более короткий ответ: игнорировать его.

Этот модуль является частью Postgres, который обрабатывает язык SQL. Ошибка часто появляется как часть копирования удаленной базы данных, например, с помощью a 'heroku pg: pull'. Он не перезаписывает ваш процессор SQL и предупреждает вас об этом.

Ответ 5

Для пользователей, использующих Виртуальную платформу 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.

Возникает, когда вы пытались сбрасывать свою БД в текстовом формате. I. когда команда не имеет параметра -Fp или -формат = простой. Однако, если вы добавите его в свою команду, вы можете столкнуться со следующей ошибкой:

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

Это проблема с разрешением, которую я не смог исправить, используя команду, представленную в GCP docs, советы от этого текущего потока, или после консультации с командой 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

Ответ 6

Используйте пользователя 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

Ответ 7

Для меня я создал базу данных с pgAdmin, и кажется, что установка владельца во время создания базы данных была недостаточной. Мне пришлось перейти вниз к "общедоступной" схеме и установить там владелец (изначально был "postgres" ).