Я сбросил чистую резервную копию базы данных 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
Я покопался в простом тексте, который pg_dump
генерирует SQL, и обнаружил, что он содержит 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
.
Как я мог решить эту проблему?
postgresql
database-backups
rails-postgresql
Steveyang
источник
источник
plpgsql
, тоDROP EXTENSION plpgsql
перед вамиpg_dump
. Это безопаснее, чем превращение вашего приложения в суперпользователя, и удобнее, чем игнорирование ошибок (которые становятся бомбой, если вы используете--single-transaction
или-v ON_ERROR_STOP=1
). Это известная проблема [подробно обсуждается разработчиками Postgres | postgresql.org/message-id/…, но не исправлено в версии 9.3.Ответы:
Чтобы решить эту проблему, вы должны назначить соответствующие права собственности. Попробуйте следующее, которое должно решить все проблемы, связанные с разрешениями для конкретных пользователей, но, как указано в комментариях, это не должно использоваться в производстве:
Итак, подключитесь к базе данных под учетной записью суперпользователя
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 .
источник
app_user
вы не суперпользователь.superuser
Пользователи AWS RDS, если вы получаете это, потому что вы не являетесь суперпользователем и, согласно документации AWS, вы не можете им быть. Я обнаружил, что должен игнорировать эти ошибки.
источник
COMMENT ON EXTENSION
не в RDSCREATE EXTENSION
. Удалите комментарии, и все будет в порядке.Для людей, использующих 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.
Возникает, когда вы пытаетесь выгрузить свою БД в формате, отличном от обычного текста. Т.е. когда в команде отсутствует параметр -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
источник
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
В этом случае, вероятно, можно спокойно игнорировать сообщения об ошибках. Отсутствие комментария к общедоступной схеме и установка plpgsql (который уже должен быть установлен) не вызовут реальных проблем.
Однако, если вы хотите выполнить полную переустановку, вам понадобится пользователь с соответствующими разрешениями. Конечно, это не должен быть пользователь, которым ваше приложение обычно запускается.
источник
Короче ответ: игнорируйте это.
Этот модуль является частью Postgres, обрабатывающей язык SQL. Ошибка часто возникает при копировании удаленной базы данных, например, с помощью «heroku pg: pull». Он не перезаписывает ваш SQL-процессор и предупреждает вас об этом.
источник
Попробуйте использовать
-L
флаг с pg_restore, указав файл, взятый изpg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Здесь вы можете увидеть обратное верно, если вывести только комментарий:
источник
Для людей, использующих AWS ,
COMMENT ON EXTENSION
это возможно только в качестве суперпользователя , и, как мы знаем из документации, инстансы RDS управляются Amazon. Таким образом, чтобы вы не нарушали такие вещи, как репликация, ваши пользователи - даже пользователь root, который вы настроили при создании экземпляра, - не будут иметь полных привилегий суперпользователя:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Чтобы исправить эту ошибку, просто
--
закомментируйте строки SQL, содержащиеCOMMENT ON EXTENSION
источник
pg_dump --no-comments
.Используйте пользователя postgres (admin), чтобы выгрузить схему, воссоздать ее и предоставить привилегии для использования, прежде чем выполнять восстановление. В одной команде:
источник
Для меня я настраивал базу данных с помощью pgAdmin, и мне показалось, что установки владельца во время создания базы данных было недостаточно. Мне пришлось перейти к «общедоступной» схеме и установить там владельца (изначально «postgres»).
источник
Для людей, которые сузили проблему до
COMMENT ON
утверждений (согласно различным ответам ниже) и имеют доступ суперпользователя к исходной базе данных, из которой создается файл дампа, самым простым решением может быть предотвращение включения комментариев в дамп файл в первую очередь, удалив их из сбрасываемой исходной базы данных ...Будущие дампы не будут включать эти
COMMENT ON
утверждения.источник
rails db:reset
с экземпляром AWS RDS postgresql без необходимости удалять строки COMMENT ON из файла дампа каждый раз, когда я запускаю схему. миграция.