Как восстановить / перемотать мою базу данных PostgreSQL

Мы делаем каждую ночь полные резервные копии нашей базы данных, а затем я использую этот дамп для создания своей собственной dev-db. Создание dev-db занимает примерно 10 минут, поэтому cron планирует его каждое утро, прежде чем я приступлю к работе. Так что теперь я могу работать с почти живым БД.

Но когда я что-то тестирую, иногда бывает удобно откатить полную базу данных или только некоторые конкретные таблицы к исходной резервной копии. Конечно, я мог бы полностью воссоздать dev-db, но это заставило бы меня подождать еще 10 минут, прежде чем я смогу снова запустить тесты.

Есть ли простой способ восстановить / перемотать базу данных / таблицу на определенный момент времени или из дампа?

Я пробовал использовать pg_restore вот так, чтобы восстановить определенные таблицы:

pg_restore -d my-dev-db -n stuff -t tableA -t tableB latest-live-db.dump

Я также пробовал использовать такие параметры, как -c и --data-only. Но, похоже, здесь есть несколько проблем, которые я не предвидел:

  • Старые данные не удаляются автоматически, когда восстановленные данные копируются обратно.
  • Есть несколько ограничений внешнего ключа, которые делают это невозможным (поправьте меня, если я ошибаюсь) без явного удаления FK перед восстановлением и последующего их повторного добавления.
  • PK-последовательности, которые выходят из строя, меня совсем не беспокоят, но это тоже может быть проблемой.

Изменить: другие вещи, которые я тестировал / изучал:

  • pg_basebackup
  • Более грубая альтернатива pg_basebackup - остановить db-server, скопировать db-файлы, а затем запустить db-server.

Обе приведенные выше альтернативы не работают, потому что у меня есть несколько локальных баз данных, работающих в одном кластере, и это приводит к большому количеству данных на диске. Таким образом невозможно разделить базы данных! Таким образом, действие копирования файла здесь не даст мне никакого прироста скорости.


person UlfR    schedule 04.09.2014    source источник
comment
Это может вам помочь? stackoverflow.com/ questions / 876522 / Он спрашивает о pgAdmin, но, поскольку команда является обычным SQL, этого должно быть достаточно. Используйте свою dev-базу данных в качестве шаблона и создавайте из нее новую каждый раз, когда она вам понадобится.   -  person DrColossos    schedule 04.09.2014
comment
Архивирование PITR и WAL?   -  person Craig Ringer    schedule 04.09.2014


Ответы (1)


Я предполагаю, что вы спрашиваете о базе данных, а не о кластере. Первое, что приходит мне в голову, - это восстановить резервную копию в 2 разных БД, одну с именем dev_db, а другую с другим именем, например dev_db_back. Затем, когда вам понадобится свежая база данных, сбросьте dev_db и переименуйте dev_db_backup в dev_db с помощью

drop database if exists dev_db;
alter database dev_db_backup rename to dev_db;

После этого, чтобы иметь другой источник для переименования, снова восстановите резервную копию на dev_db_backup. Это можно сделать с помощью сценария, поэтому удаление, переименование и восстановление будут автоматизированы. Поскольку удаление и переименование происходят мгновенно, просто запустите сценарий, и переименование будет выполнено без необходимости ждать нового восстановления.

Если часто требуется повторное восстановление с интервалом менее 10 минут, я думаю, вы можете попробовать сделать то, что вы делаете, внутри транзакции:

begin;
-- alter the db
-- test the alterations
commit; -- or ...
-- rollback;
person Clodoaldo Neto    schedule 04.09.2014
comment
Это хорошее предложение, которое приближает меня к тому, чего я хочу. По-прежнему существует ограничение, что у меня есть только одна горячая резервная копия, а затем снова 10 минут ожидания, чтобы получить новую резервную копию. Я, вероятно, воспользуюсь чем-то вроде этого! - person UlfR; 04.09.2014
comment
@UlfR Похоже, вам нужны транзакции. Обновлено - person Clodoaldo Neto; 04.09.2014