У меня есть сценарий 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 для восстановления данных.