Мы делаем каждую ночь полные резервные копии нашей базы данных, а затем я использую этот дамп для создания своей собственной 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.
Обе приведенные выше альтернативы не работают, потому что у меня есть несколько локальных баз данных, работающих в одном кластере, и это приводит к большому количеству данных на диске. Таким образом невозможно разделить базы данных! Таким образом, действие копирования файла здесь не даст мне никакого прироста скорости.