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


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

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

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

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

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

5 51

5 ответов:

похоже, что pg_restore пытается восстановить некоторые дополнительные данные, которые вам не принадлежат. Попробуйте добавить в командной строке 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