Как восстановить резервную копию postgres - ОШИБКА: невозможно удалить текущую открытую базу данных - PullRequest
1 голос
/ 21 ноября 2019

Я пытаюсь восстановить резервную копию postgres из системы, которая больше не предоставляется, и я получаю ряд ошибок, в зависимости от того, что я пытаюсь.

  • У меня есть толькорезервные копии, нет исходных серверов, на которые можно сослаться
  • Я успешно восстанавливал из этих производственных резервных копий в прошлом, но со времени последнего успеха я перепутал с моей локальной средой (например, переустановил postgres через Homebrew)
  • Я полагаю, что бывший коллега (более недоступный) успешно восстановил эту конкретную резервную копию
  • Я столкнулся с той же ошибкой, когда:
    • при попытке резервного копирования с использованием postgresql@9.4
    • пробуя предыдущую известную версию базы данных (используя postgres 11)

(я прочитал связанные / предложенные вопросы, но они не кажутся актуальными)

Резервная копия была создана с помощью следующей команды (в сценарии bash):

pg_dump --schema=public -Fc

И команда, использованная для восстановления сценария (которая отображается в виде справки в виде текста назадup script):

dropdb ${PGDATABASE}
createdb ${PGDATABASE}
time pg_restore \
    -j4 \
    -d ${PGDATABASE} \
    --create \
    --no-privileges \
    --no-owner \
    --clean \
    --if-exists \
    --exit-on-error \
    "${dirname}/${filename}"

Когда я запускаю команду восстановления локально, я получаю следующее:

time pg_restore -j4 -d ${PGDATABASE} --create --no-privileges --no-owner --clean --if-exists --exit-on-error ../backups/backup__2019-09-03_16-00-19.pg_dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 4954; 1262 962277 DATABASE mydb mydb
pg_restore: [archiver (db)] could not execute query: ERROR:  cannot drop the currently open database
    Command was: DROP DATABASE IF EXISTS mydb;

real    0m0.049s
user    0m0.019s
sys    0m0.012s

Раньше у меня только когда-либо возникали ошибки из-за дискового пространства'после нескольких минут работы, но, как вы можете видеть из вывода time, эта ошибка возникает практически сразу!

Резервная копия создается со сжатием -Fc, и я могу распаковатьрезервное копирование в открытый текст с использованием pg_restore backup.pg_dump > backup.sql, но я не могу найти там никаких команд, связанных с DROP DATABASE: /

-- Dumped from database version 9.6.11
-- Dumped by pg_dump version 11.3 (Ubuntu 11.3-1.pgdg14.04+1)

Я вижу, что БД изначально была выгружена из 9.6.11, но я 'Я вполне уверен, что ранее я успешно восстановился с PG 10 ...

Я пробовал разные вещи, такие как:

time pg_restore -d ${PGDATABASE} --no-privileges --no-owner --exit-on-error ../backups/backup__2019-09-03_16-00-19.pg_dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 7; 2615 1033373 SCHEMA public mydb
pg_restore: [archiver (db)] could not execute query: ERROR:  schema "public" already exists
    Command was: CREATE SCHEMA public;

ptim:dropdb mydb; createdb mydb
ptim:gizmag ptim$ dropdb mydb

ptim:gizmag ptim$ time pg_restore -d ${PGDATABASE} --create --no-privileges --no-owner --exit-on-error ../backups/backup__2019-09-03_16-00-19.pg_dump
pg_restore: [archiver (db)] connection to database "mydb" failed: FATAL:  database "mydb" does not exist

# guess I misunderstood the create flag!

ptim:gizmag ptim$ dropdb mydb; createdb mydb
dropdb: database removal failed: ERROR:  database "mydb" does not exist

ptim:gizmag ptim$ time pg_restore -d ${PGDATABASE} --create --no-privileges --no-owner --exit-on-error ../backups/backup__2019-09-03_16-00-19.pg_dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 4954; 1262 962277 DATABASE mydb mydb
pg_restore: [archiver (db)] could not execute query: ERROR:  database "mydb" already exists
    Command was: CREATE DATABASE mydb WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';

Я также безуспешно пытался восстановить данные из дампа открытого текста:

psql -U ptim -d mydb -1 -f ../backups/backup__2019-09-03_16-00-19.sql

SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
psql:../backups/backup__2019-09-03_16-00-19.sql:23: ERROR:  schema "public" already exists
psql:../backups/backup__2019-09-03_16-00-19.sql:26: ERROR:  current transaction is aborted, commands ignored until end of transaction block

# snip... repeated, and varied errors follow

Есть предложения?!

1 Ответ

0 голосов
/ 28 ноября 2019

Благодаря подсказке от @a_horse_with_no_name я узнал:

-C, --create Создайте базу данных перед ее восстановлением. Если также указано --clean, удалите и заново создайте целевую базу данных перед подключением к ней.

Когда используется этот параметр, база данных с именем -d используется только для выдачи начальных DROP DATABASE и CREATE DATABASE команд. Все данные восстанавливаются в имя базы данных, которое появляется в архиве.

(подробное объяснение на dba.stackexchange: почему pg_restore игнорирует --create . Обратите внимание, что --create имеетдалее, несвязанные эффекты в более новых версиях pg_restore )

Мое решение состояло в том, чтобы удалить параметр --create:

dropdb ${PGDATABASE}
createdb ${PGDATABASE}
time pg_restore \
    -j4 \
    -d ${PGDATABASE} \
    --no-privileges \
    --no-owner \
    --clean \
    --if-exists \
    --exit-on-error \
    backup.pg_dump
...