Вопрос по postgresql, plpgsql – PostgreSQL 9.1 ошибка pg_restore относительно PLPGSQL

57

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

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

pg_restore: [archiver (db)] Error from TOC entry 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

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

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

Если вы подключаетесь с помощью psql и набираете\lчто вы видите в разделе "Владелец" колонка для этой базы данных? Поскольку plpgsql является ненадежным языком, он может быть изменен (и я думаю, это применимо даже к комментарию к нему) владельцем базы данных или суперпользователем базы данных. kgrittn
Я могу подтвердить, что владелец базы данных является правильным и соответствует пользователю, указанному в опции -U команды pg_restor (и pg_dump тоже) fury-s12
К сожалению, не все так просто. У меня есть вывод pg_dump, который предполагает создание языков и функций с использованием этих языков. Если я вручную создаю язык как суперпользователь БД, создание функции завершается неудачно из-за ошибок разрешения. Если я этого не сделаю, установка процедурного языка завершится неудачно из-за ошибок разрешения. В любом случае триггеры далее, которые полагаются на те существующие функции, также не могут быть созданы, потому что функции не существуют. Quixadhal

Ваш Ответ

5   ответов
4

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

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

COMMENT ON EXTENSION plpgsql IS null;

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

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

100

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

pg_restore -U username -c -n public -d database_name
Влечет ли эта опция потерю информации после восстановления? То есть потеряет ли он какие-либо важные данные?
Вы также должны быть осторожны, если используете большие объекты, они не восстановлены
@ C2H5OH это зависит. Если резервная копия вашей базы данных содержит более одной схемы, указанная выше команда импортирует схему & quot; public & quot; только (= потеря информации). Если в дампе содержится схема & quot; общедоступная & quot; только, тогда у вас нет проблемы (обратитесь к: pg_dump --exclude-schema). Чтобы проверить, какие схемы находятся в вашем файле дампа, запустите: pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F & quot; & Quot; «{print $ (NF-1)}» -
Это исправило мою проблему сpg_restore пытаясь загрузить дополнительные расширения, что в нашем сценарии было запрещено.
2

[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
2

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

не все вызывается с & quot; -U username & quot; отметить того же пользователя, чтобы быть уверенным fury-s12
14

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

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

Например:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
Есть ли способ сделать это всего за одну команду? У меня автоматизированный процесс, и это не сработает.
Это сработало для меня. Предупреждение, однако, вторая команда напечатает все, чтобыSTDOUT так что вы, вероятно, захотите перенаправить его в файл.

Похожие вопросы