НАСТРОЙКА НЕПРЕРЫВНОГО АРХИВИРОВАНИЯ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Внесем необходимые изменения в файл postgresql.conf. В данном случае мы просто скопируем заранее подготовленный файл... cp -n /usr/local/pgsql/data/postgresql.conf /home/postgres/postgresql.conf.old cp dba1_17_postgresql.conf /usr/local/pgsql/data/postgresql.conf ----------------------------------------------------------------------- Вот какие параметры необходимо установить: * wal_level не ниже archive, * archive_mode = on, * archive_command - команда копирования. Проверим: egrep wal_level|archive_mode|archive_command dba1_17_postgresql.conf wal_level = archive archive_mode = on archive_command = 'test ! -f /home/postgres/archivedir/%f && cp %p /home/postgres/archivedir/%f' ----------------------------------------------------------------------- Требуется разрешить подключение к серверу по протоколу репликации. Сделаем это для локальных подключений: sed -i s/#\(local\s\+replication\)/\1/ /usr/local/pgsql/data/pg_hba.conf tail -n 5 /usr/local/pgsql/data/pg_hba.conf # Allow replication connections from localhost, by a user with the # replication privilege. local replication postgres trust #host replication postgres 127.0.0.1/32 trust #host replication postgres ::1/128 trust ----------------------------------------------------------------------- Очистим каталог /home/postgres/archivedir, куда будут сохраняться сегменты WAL. rm -rf /home/postgres/archivedir mkdir /home/postgres/archivedir ls -l /home/postgres/archivedir total 0 ----------------------------------------------------------------------- Перезапустим сервер, чтобы изменения вступили в силу. pg_ctl restart -w -m fast -l /home/postgres/logfile waiting for server to shut down.... done server stopped waiting for server to start.... done server started ----------------------------------------------------------------------- Убедимся, что при переходе на новый сегмент WAL старый будет попадать в архив. Подключимся к серверу и сделаем какие-нибудь изменения, например, создадим таблицу. psql => create table backup_example(t text); CREATE TABLE ----------------------------------------------------------------------- Поскольку для переключения на новый сегмент WAL надо сделать много изменений (либо задать параметр archive_timeout, что мы не сделали), то просто переключимся на новый сегмент вручную. Вот какой сегмент используется сейчас: => select pg_xlogfile_name(pg_current_xlog_location()); pg_xlogfile_name -------------------------- 000000020000000000000015 (1 row) ----------------------------------------------------------------------- А вот какой будет после переключения: => select pg_switch_xlog(); pg_switch_xlog ---------------- 0/15B74228 (1 row) => insert into backup_example values ('После переключения сегмента'); INSERT 0 1 => select pg_xlogfile_name(pg_current_xlog_location()); pg_xlogfile_name -------------------------- 000000020000000000000016 (1 row) ----------------------------------------------------------------------- Проверим содержимое каталога-архива: ls -l /home/postgres/archivedir total 15680 -rw------- 1 postgres postgres 16056320 июня 16 17:23 000000020000000000000015 Все в порядке, архивирование работает. Обратите внимание: первые восемь цифр в номере сегмента - это номер текущей ветви времени. ----------------------------------------------------------------------- СОЗДАНИЕ БАЗОВОЙ РЕЗЕРВНОЙ КОПИИ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Теперь самое время создать базовую резервную копию. Убедимся, что в кластере нет пользовательских табличных пространств, так как их наличие усложнило бы процесс резервирования и восстановления. => \db List of tablespaces Name | Owner | Location ------------+----------+---------- pg_default | postgres | pg_global | postgres | (2 rows) ----------------------------------------------------------------------- Выполним команду pg_basebackup. Используем формат по умолчанию (plain), в качестве каталога для сохранения используем /home/postgres/basebackupdir. rm -rf /home/postgres/basebackupdir mkdir /home/postgres/basebackupdir pg_basebackup --pgdata=/home/postgres/basebackupdir "--label=Base backup test" NOTICE: pg_stop_backup complete, all required WAL segments have been archived ----------------------------------------------------------------------- Проверим содержимое каталога: ls -l /home/postgres/basebackupdir total 120 -rw------- 1 postgres postgres 199 июня 16 17:23 backup_label drwx------ 7 postgres postgres 4096 июня 16 17:23 base drwx------ 2 postgres postgres 4096 июня 16 17:23 global drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_clog drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_dynshmem -rw------- 1 postgres postgres 4467 июня 16 17:23 pg_hba.conf -rw------- 1 postgres postgres 4468 июня 16 17:23 pg_hba.conf.default -rw------- 1 postgres postgres 1636 июня 16 17:23 pg_ident.conf drwx------ 4 postgres postgres 4096 июня 16 17:23 pg_logical drwx------ 4 postgres postgres 4096 июня 16 17:23 pg_multixact drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_notify drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_replslot drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_serial drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_snapshots drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_stat drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_stat_tmp drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_subtrans drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_tblspc drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_twophase -rw------- 1 postgres postgres 4 июня 16 17:23 PG_VERSION drwx------ 3 postgres postgres 4096 июня 16 17:23 pg_xlog -rw------- 1 postgres postgres 84 июня 16 17:23 postgresql.auto.conf -rw------- 1 postgres postgres 21343 июня 16 17:23 postgresql.conf ----------------------------------------------------------------------- Заглянем в файл метки: cat /home/postgres/basebackupdir/backup_label START WAL LOCATION: 0/17000024 (file 000000020000000000000017) CHECKPOINT LOCATION: 0/17000024 BACKUP METHOD: streamed BACKUP FROM: master START TIME: 2016-06-16 17:23:48 MSK LABEL: Base backup test ----------------------------------------------------------------------- Посмотрим в каталог pg_xlog: ls -l /home/postgres/basebackupdir/pg_xlog total 4 drwx------ 2 postgres postgres 4096 июня 16 17:23 archive_status Тут пусто, что и следовало ожидать. ----------------------------------------------------------------------- ВОССТАНОВЛЕНИЕ ~~~~~~~~~~~~~~ Сделаем еще несколько изменений в таблице. => insert into backup_example values ('Еще изменение'); INSERT 0 1 => select pg_switch_xlog(); pg_switch_xlog ---------------- 0/18000158 (1 row) => insert into backup_example values ('Прямо перед катастрофой'); INSERT 0 1 ----------------------------------------------------------------------- Будем считать, что в этот момент сервер сломался. pg_ctl stop -m fast -w waiting for server to shut down.... done server stopped ----------------------------------------------------------------------- Скопируем pg_xlog на случай, если там остались неперенесенные в архив сегменты. rm -rf /home/postgres/backup_xlog mkdir /home/postgres/backup_xlog cp -r $PGDATA/pg_xlog/* /home/postgres/backup_xlog ----------------------------------------------------------------------- После этого все содержимое PGDATA можно удалять. (На продуктивной среде имеет смысл скопировать содержимое каталога до того момента, как восстановление будет успешно завершено и проверено.) rm -rf $PGDATA/* ls -l /usr/local/pgsql/data total 0 ----------------------------------------------------------------------- Восстанавливаемся из базовой резервной копии: cp -r /home/postgres/basebackupdir/* $PGDATA ls -l /usr/local/pgsql/data total 120 -rw------- 1 postgres postgres 199 июня 16 17:23 backup_label drwx------ 7 postgres postgres 4096 июня 16 17:23 base drwx------ 2 postgres postgres 4096 июня 16 17:23 global drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_clog drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_dynshmem -rw------- 1 postgres postgres 4467 июня 16 17:23 pg_hba.conf -rw------- 1 postgres postgres 4468 июня 16 17:23 pg_hba.conf.default -rw------- 1 postgres postgres 1636 июня 16 17:23 pg_ident.conf drwx------ 4 postgres postgres 4096 июня 16 17:23 pg_logical drwx------ 4 postgres postgres 4096 июня 16 17:23 pg_multixact drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_notify drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_replslot drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_serial drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_snapshots drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_stat drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_stat_tmp drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_subtrans drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_tblspc drwx------ 2 postgres postgres 4096 июня 16 17:23 pg_twophase -rw------- 1 postgres postgres 4 июня 16 17:23 PG_VERSION drwx------ 3 postgres postgres 4096 июня 16 17:23 pg_xlog -rw------- 1 postgres postgres 84 июня 16 17:23 postgresql.auto.conf -rw------- 1 postgres postgres 21343 июня 16 17:23 postgresql.conf ----------------------------------------------------------------------- И копируем на место сохраненный pg_xlog: cp -r /home/postgres/backup_xlog/* $PGDATA/pg_xlog ls -l /usr/local/pgsql/data/pg_xlog total 131084 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000017 -rw------- 1 postgres postgres 296 июня 16 17:23 000000020000000000000017.00000024.backup -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000018 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000019 -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001A -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001B -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001C -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001D -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001E -rw------- 1 postgres postgres 36 июня 16 17:23 00000002.history drwx------ 2 postgres postgres 4096 июня 16 17:23 archive_status ----------------------------------------------------------------------- Теперь надо создать файл recovery.conf. Можно было бы воспользоваться шаблоном: ls -l /usr/local/pgsql/share/recovery.conf.sample -rw-r--r-- 1 root root 5587 июня 16 17:22 /usr/local/pgsql/share/recovery.conf.sample ----------------------------------------------------------------------- Но в нашем случае файл будет состоять из одного параметра, Поэтому просто создадим его. cat < $PGDATA/recovery.conf restore_command = 'cp /home/postgres/archivedir/%f %p' EOF cat /usr/local/pgsql/data/recovery.conf restore_command = 'cp /home/postgres/archivedir/%f %p' ----------------------------------------------------------------------- Можно стартовать сервер. pg_ctl start -w -l /home/postgres/logfile waiting for server to start..... done server started Восстановление завершено! ----------------------------------------------------------------------- Проверим это. Подключимся к серверу: => \q psql И проверим содержимое таблицы. => select * from backup_example; t ----------------------------- После переключения сегмента Еще изменение Прямо перед катастрофой (3 rows) Как видим, все последние изменения успешно восстановлены. ----------------------------------------------------------------------- Что стало с ветвью времени после восстановления? => select pg_xlogfile_name(pg_current_xlog_location()); pg_xlogfile_name -------------------------- 00000003000000000000001A (1 row) Как видим, номер увеличился на единицу. ----------------------------------------------------------------------- В каталоге pg_xlog появился файл, соответствующий этой ветви: => select left( pg_xlogfile_name(pg_current_xlog_location()) ,8) as timeline \gset => \setenv TIMELINE :timeline => \! ls -l $PGDATA/pg_xlog/$TIMELINE.history -rw------- 1 postgres postgres 79 июня 16 17:23 /usr/local/pgsql/data/pg_xlog/00000003.history ----------------------------------------------------------------------- Вот какая информация в нем есть: => \! cat $PGDATA/pg_xlog/$TIMELINE.history 1 0/8014F64 at restore point "test" 2 0/1A000084 no recovery target specified ----------------------------------------------------------------------- Этот файл подлежит архивации вместе с сегментами WAL: ls -l /home/postgres/archivedir total 98312 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000015 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000016 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000017 -rw------- 1 postgres postgres 296 июня 16 17:23 000000020000000000000017.00000024.backup -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000018 -rw------- 1 postgres postgres 16777216 июня 16 17:23 000000020000000000000019 -rw------- 1 postgres postgres 16777216 июня 16 17:23 00000002000000000000001A -rw------- 1 postgres postgres 79 июня 16 17:23 00000003.history ----------------------------------------------------------------------- Конец демонстрации. Восстановим настройки. => \q cp /home/postgres/postgresql.conf.old /usr/local/pgsql/data/postgresql.conf pg_ctl restart -m fast -l /home/postgres/logfile waiting for server to shut down.... done server stopped server starting -----------------------------------------------------------------------