У меня есть база данных на 20 ТБ в PostgreSQL 9.2, и я понятия не имею, как эффективно создавать резервные копии. Это база данных, которая немного увеличивается каждый день и 1 числа каждого месяца увеличивается примерно на 200 Гб.
Я думал сделать pg_dump, но это занимает слишком много времени, чтобы делать это каждый месяц, затем я думаю о том, чтобы сделать это один раз, а затем сделать резервную копию только новых или измененных таблиц с копией, но я не могу перестать использовать базу данных в чтобы создать первый дамп, поэтому я не буду точно знать, какие данные содержит резервная копия.
Как сделать инкрементное резервное копирование, не прекращая использовать базу данных?
Резервное копирование подробно рассматривается в Руководство по PostgreSQL.
Чтобы обеспечить непрерывное резервное копирование, заархивируйте журнал упреждающей записи. Предлагаемые настройки:
archive_mode = on
wal_level = hot_standby
archive_command = '/usr/bin/rsync --archive --ignore-existing "%p" "/backup-dest/%p"'
# Ensures that a log file is written at least once every 30 minutes even if little
# activity has occurred
archive_timeout = 30min
Вместо того, чтобы делать pg_dump
для вашего базового уровня вы можете сделать pg_basebackup
, который не требует замораживания базы данных. Однако, если у вас еще нет archive_mode
включен, вам необходимо перезапустить базу данных, чтобы изменить этот параметр.
Лично я не знаю решения для инкрементного резервного копирования, но могу придумать два способа добиться того, о чем вы просите.
Вы можете взглянуть на бармен который запускает pg_basebackup (если я не ошибаюсь), а затем передает записи WAL на сервер бармена. Это имеет тот недостаток, что вам нужен сервер, на котором бармен работает постоянно, а не только первого числа каждого месяца. Однако у него есть преимущество в том, что он может создавать базу данных на основе определенной даты и времени.
Другое решение, которое я могу придумать, - это попробовать использовать файловую систему моментальных снимков. У меня только опыт работы с ZFS, но BTRFS тоже должен работать. Затем первого числа каждого месяца вы можете просто создавать инкрементный снимок файловой системы, в которой размещена база данных, и восстанавливать ее, если что-то пойдет не так. Однако, учитывая, что у вас уже есть работающая база данных, это будет проблемой, если вы не используете ее на реплике только для чтения, которую вы запускаете по этой причине.
Если вы используете AWS для размещения своей базы данных Postgres, вы можете попробовать использовать созданный Heroku инструмент для резервного копирования с EC2 на S3, который называется Wal-E