Ошибка восстановления PostgreSQL 9.1 pg относительно PLPGSQL

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

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

pg_restore: [архиватор (db)] ошибка из записи TOC 3206; 0 0 комментарий Расширение plpgsql pg_restore: [архиватор (db)] не удалось выполнить запрос: Ошибка: должен быть владельцем команды расширения plpgsql: COMMENT ON Расширение plpgsql - это "процедурный язык PL / pgSQL";

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

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

5 ответов


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

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

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

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

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

например:

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

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

можно сделать так:

COMMENT ON EXTENSION plpgsql IS null;

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

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


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


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

Deepak@deepak:~$ sudo -i -u postgres
postgres@deepak:~$ psql 
psql (9.3.5)
Type "help" for help.

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