Назад | Перейти на главную страницу

Резервное копирование Postgres

У меня есть сценарий Bacula, который выполняет автоматическое резервное копирование базы данных Postgres. Скрипт делает две резервные копии, используя (pg_dump) базы данных:

Только схема и только данные.

/usr/bin/pg_dump --format=c -s $dbname --file=$DUMPDIR/$dbname.schema.dump
/usr/bin/pg_dump --format=c -a $dbname --file=$DUMPDIR/$dbname.data.dump

Проблема в том, что я не могу понять, как его восстановить с помощью pg_restore.

Нужно ли мне создавать базу данных и пользователей, прежде чем восстанавливать схему и, наконец, данные.

Я сделал следующее:

pg_restore  --format=c -s -C -d template1 xxx.schema.dump
pg_restore  --format=c -a -d xxx xxx.data.dump

Это первое восстановление создает базу данных с пустыми таблицами, но второе дает много ошибок, подобных этой:

pg_restore: [archiver (db)] COPY failed: ERROR:  insert or update on table "Table1" violates foreign key constraint "fkf6977a478dd41734"
DETAIL:  Key (contentid)=(1474566) is not present in table "Table23".

Любые идеи?

Тебе нужно --disable-triggers при выполнении восстановления только данных с помощью pg_restore. Обычно схема + восстановление данных создает триггеры ссылочной целостности после добавления данных. Если вы просто восстанавливаете схему, то триггеры создаются без данных в таблице, и база данных ожидает, что любые данные, добавленные после этого, будут соответствовать триггерам.

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