PostgreSQL «Восстановление на момент времени» (PITR) также называется инкрементным резервным копированием базы данных, оперативным резервным копированием или может быть архивным резервным копированием. Сервер PostgreSQL записывает все транзакции модификации данных пользователей, такие как вставка, обновление или удаление, и записывает их в файл журнала записи вызовов (WAL). Этот механизм использует записи истории, сохраненные в файле WAL, для выполнения изменений с повтором транзакций, сделанных с момента последнего резервного копирования базы данных.
Преимущества
, Ноль времени простоя - инкрементное резервное копирование базы данных важно для
критическая система, которая не может позволить себе ни минуты простоя. Благодаря функции восстановления на момент времени время простоя резервного копирования базы данных может быть полностью устранено, поскольку этот механизм позволяет одновременно выполнять резервное копирование базы данных и доступ к системе.
, Сохраните размер хранилища - с помощью инкрементного резервного копирования базы данных мы сохраняем
последний архив журнала с момента последнего резервного копирования вместо ежедневного полного резервного копирования базы данных.
Если вышеперечисленные преимущества вас беспокоят, вам следует всегда применять инкрементное резервное копирование базы данных. Здесь я продемонстрирую, как выполнить восстановление на момент времени (инкрементное резервное копирование) на сервере PostgreSQL.
, Измените postgresql.conf для поддержки архива журнала
, Сделайте базовое резервное копирование (полное резервное копирование базы данных)
, Резервное копирование базы данных на удаленное хранилище.
, Резервное копирование WAL (архивные файлы журнала) в удаленное хранилище (непрерывный процесс)
-
Краткое описание шагов восстановления PostgreSQL на определенный момент времени **
, Извлечь файлы из базовой резервной копии
, Скопируйте файлы из папки pg__xlog
, Создать файл recovery.conf
, Начать восстановление
Учебники начали ~ долгий путь, терпеливый …
Инициализация базы данных
-
1) Создайте тестовую базу данных, все файлы базы данных в/usr/local/pgsql/pgDataPITR/**
Инициализировать базу данных
….[mkyong]$ initdb -D/usr/local/pgsql/pgDataPITR/….
Запустить базу данных
….[mkyong]$ pg__ctl start -D/usr/local/pgsql/pgDataPITR/….
-
2) Внесите изменения в файл конфигурации Postgresql (postgresql.conf) ** , нам нужно внести некоторые изменения в файл postgresql.conf, чтобы сообщить PostgreSQL, как копировать или архивировать файлы WAL, созданные на сервере PostgreSQL.
Изменить postgresql.conf
….[mkyong]$ vi postgresql.conf
Внесите следующие изменения в postgresql.conf
archive command = on archive command = 'cp %p/usr/local/pgsql/pgDataPITR/wals/%f'
Создать папку wals ....[mkyong]$ mkdir/usr/local/pgsql/pgDataPITR/wals
Перезагрузите базу данных
….[mkyong]$ pg ctl stop -D/usr/local/pgsql/pgDataPITR/[mkyong]$ pg ctl start -D/usr/local/pgsql/pgDataPITR/….
-
Внимание!!! Узнайте, как PostgreSQL обрабатывает файлы журналов, pg xlog и архив журналов ** pg xlog - это папка файлов журналов PostgreSQL, которая используется для хранения всех записей истории данных. Он расположен в/usr/local/pgsql/pgDataPITR/pg xlog. Например, когда пользователь вставил, обновил или удалил запись, все транзакции автоматически будут созданы или добавлены в файл журнала в папке pg xlog. Формат файла журнала выглядит следующим образом: 000000010000000000000001 → 000000010000000000000006
Например,
….[postgres@localhost pg__xlog]$ ls -lsh total 113M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006
Каждый файл журнала может обрабатывать около 16 миллионов данных, когда он превысит этот предел, он автоматически создаст новый файл журнала, имя файла будет 0-9 и A-Z
000000010000000000000001 ..
.. 000000010000000000000009 ..
.. 00000001000000000000000A ..
.. 00000001000000000000000Z
Это файлы журнала, которые мы собираемся использовать в качестве восстановления PostgreSQL на определенный момент времени :) ** Внимание!!! Помните ли вы, что мы настраиваем путь к файлу WAL в файле postgresql.conf? **
archive command = on archive command = 'cp %p/usr/local/pgsql/pgDataPITR/wals/%f'
Это означает, что когда папка pg__xlog увеличивается до определенного ограничения, например, 6 файлов журнала каждый содержит 16M, когда PostgreSQL пытается вставить новую запись истории и обнаруживает, что pg__xlog заполнен, он автоматически архивирует самый старый файл журнала истории и перемещает его в ** /usr Папка/local/pgsql/pgDataPITR/wals ** . ** Внимание !!! ** Мы должны постоянно делать резервные копии этих архивных файлов (вот почему это называется добавочным резервным копированием :)). Нам больше не нужно делать полное резервное копирование базы данных, но мы постоянно делаем резервные копии этих архивных файлов журнала. Папка важных журналов ..../usr/local/pgsql/pgDataPITR/pg__xlog/usr/local/pgsql/pgDataPITR/wals
Моделирование данных
Создание фиктивных таблиц и записей - мы динамически создадим 455 252 записей в новой таблице, 400 000 записей заставят PostgreSQL создать достаточно файлов журналов в папке pg xlog и запустят процесс архивирования для архивирования файлов журналов из /usr/local/pgsql/pgDataPITR/pg xlog to /usr/local/pgsql/pgDataPITR/wals , каждый файл журнала содержит файл размером около 16M.
-
1) Таблица testPITR1 создана в 2008-11-25 17: 17 **
# psql # select (** ) from pg__class; –- contain 229 records # select (** ) from pg__description; –- contains 1988 records # create table testPITR1 as select ** from pg__class, pg__description; #--totally 229 x 1988 = 455,252 records # select ** from current__timestamp; –-2008-11-25 17:17
Лог-файлы выглядят следующим образом
….[postgres@localhost pgDataPITR]$ cd pg xlog/[postgres@localhost pg xlog]$ ls -lsh total 113M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:16 000000010000000000000007 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000008 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000009 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000A 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000B 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000C [postgres@localhost pgDataPITR]$ cd wals[postgres@localhost wals]$ ls -lsh total 97M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000000 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000001 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000002 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000003 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000004 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000005
** 2) Создание полной резервной копии базы данных - базовая резервная копия **