Подтвердить что ты не робот

PostgreSQL 9.1 ошибка pg_restore относительно PLPGSQL

Я использую Postgres для проекта django, и в настоящее время я внедряю систему резервного копирования/восстановления базы данных, которая как можно проще выполняет pg_dump, когда пользователь щелкает резервную копию, а затем pg_restore, когда они нажимают восстановление резервной копии.

Все кажется прекрасным и денди, пока он на самом деле не попытается выполнить pg_restore, когда он дает эту ошибку:

pg_restore: [архиватор (db)] Ошибка записи TOC 3206; 0 0 КОММЕНТАРИЙ EXTENSION plpgsql pg_restore: [archiver (db)] не удалось выполнить запрос: ОШИБКА: должен быть владельцем расширения. Plpgsql Команда: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL процедурный язык';

Я изучил, что такое plpgsql и т.д., и я это понимаю, и в отношении ошибки я попытался вручную установить "владельца расширения" для пользователя, который выполняет script и владеет самой базой данных, но ничего не изменил, его действительно раздражает, так как его ошибка при попытке установить комментарий ко всем вещам

Все это создается автоматически pg_dump, поэтому строка комментария не может быть удалена, и нет флажков для отключения комментариев (что я знаю), поэтому я действительно зациклен на том, как решить эту проблему.

4b9b3361

Ответ 1

Похоже, pg_restore пытается восстановить некоторые дополнительные данные, которые у вас нет. Попытайтесь добавить параметр -n public в свою командную строку pg_restore. Он скажет pg_restore восстановить только содержимое общедоступной схемы. Ваша командная строка должна выглядеть как

pg_restore -U username -c -n public -d database_name

Ответ 2

Я нашел следующее обходное решение на этой странице:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

Идея состоит в том, чтобы использовать pg_restore -l для перечисления содержимого архива, grep из расширения, которое у пользователя не имеет разрешения для восстановления, и используйте pg_restore -L, чтобы использовать этот список при восстановлении.

Например:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump

Ответ 3

Если возможно, я рекомендую удалить комментарий, который не удается восстановить, прежде чем создавать какие-либо дампы.

Вы можете сделать это:

COMMENT ON EXTENSION plpgsql IS null;

Если вы не хотите делать это для каждой вновь созданной базы данных, удалите комментарий из БД под названием template1 (CREATE DATABASE… копирует эту базу данных.)

Дампы, созданные после этого, должны восстанавливаться без ошибок.

Ответ 4

Загружаете ли вы в базу данных, созданную другим пользователем? Если возможно, попробуйте восстановить с помощью того же пользователя, который создал БД и его существующие объекты.

Ответ 5

Работает для меня после этой команды -

[email protected]:~$ sudo -i -u postgres
[email protected]:~$ psql 
psql (9.3.5)
Type "help" for help.

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user;
postgres=# GRANT