Базовая резервная копия

Создадим базу данных и таблицу.

α=> CREATE DATABASE backup_base;
CREATE DATABASE
α=> \c backup_base
You are now connected to database "backup_base" as user "student".
α=> CREATE TABLE t(s text);
CREATE TABLE
α=> INSERT INTO t VALUES ('Привет, мир!');
INSERT 0 1

В PostgreSQL 10 значения параметров по умолчанию позволяют сразу использовать протокол репликации:

α=> SELECT name, setting
FROM pg_settings
WHERE name IN ('wal_level','max_wal_senders','max_replication_slots');
         name          | setting 
-----------------------+---------
 max_replication_slots | 10
 max_wal_senders       | 10
 wal_level             | replica
(3 rows)

В более ранних версиях аналогичные значения пришлось бы установить самостоятельно.


Разрешение на локальное подключение по протоколу репликации в pg_hba.conf также прописано по умолчанию, начиная с версии 10 (хотя это и зависит от конкретной пакетной сборки):

postgres$ egrep '^[^#].*replication' /etc/postgresql/10/alpha/pg_hba.conf
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

Чтобы утилита pg_basebackup могла подключиться к серверу под ролью student, эта роль должна иметь атрибут REPLICATION:

α=> \du student
                        List of roles
 Role name |             Attributes              | Member of 
-----------+-------------------------------------+-----------
 student   | Create role, Create DB, Replication | {}


Выполним команду pg_basebackup от имени postgres под ролью student.

В нашем случае и сервер-источник, и резервная копия будут располагаться на одном сервере. Поскольку мы собираемся тут же развернуть новый сервер, выбираем формат plain, а в качестве каталога для сохранения используем PGDATA целевого сервера.

Если бы мы использовали табличные пространства, дополнительно пришлось бы указать для них другие пути в ключе --tablespace-map, но в данном случае этого не трубуется.

postgres$ rm -rf /var/lib/postgresql/10/beta/*
postgres$ pg_basebackup -U student --pgdata=/var/lib/postgresql/10/beta

По умолчанию в начале копирования выполняется "протяженная" контрольная точка в соответствии с обычной настройкой:

α=> SHOW checkpoint_completion_target;
 checkpoint_completion_target 
------------------------------
 0.5
(1 row)

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

α=> SHOW checkpoint_timeout;
 checkpoint_timeout 
--------------------
 5min
(1 row)

Если требуется выполнить контрольную точку как можно быстрее, надо указать ключ --checkpoint=fast.


Сам резервный сервер уже предварительно собран и установлен.

Проверим содержимое каталога с данными, которое было записано pg_basebackup:

postgres$ ls -l /var/lib/postgresql/10/beta
total 80
-rw------- 1 postgres postgres  206 июн 13 19:58 backup_label
drwx------ 7 postgres postgres 4096 июн 13 19:58 base
drwx------ 2 postgres postgres 4096 июн 13 19:58 global
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_commit_ts
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_dynshmem
drwx------ 4 postgres postgres 4096 июн 13 19:58 pg_logical
drwx------ 4 postgres postgres 4096 июн 13 19:58 pg_multixact
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_notify
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_replslot
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_serial
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_snapshots
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_stat
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_stat_tmp
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_subtrans
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_tblspc
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_twophase
-rw------- 1 postgres postgres    3 июн 13 19:58 PG_VERSION
drwx------ 3 postgres postgres 4096 июн 13 19:58 pg_wal
drwx------ 2 postgres postgres 4096 июн 13 19:58 pg_xact
-rw------- 1 postgres postgres   88 июн 13 19:58 postgresql.auto.conf

Все необходимые файлы журнала находятся в каталоге pg_wal:

postgres$ ls -l /var/lib/postgresql/10/beta/pg_wal/
total 16388
-rw------- 1 postgres postgres 16777216 июн 13 19:58 000000010000000000000002
drwx------ 2 postgres postgres     4096 июн 13 19:58 archive_status

Восстановление из базовой резервной копии

Мы собираемся запустить сервер вместе с основным, поэтому в настройках необходимо поменять порт. Сделаем это в файле postgresql.auto.conf:

postgres$ echo 'port = 5433' >> /var/lib/postgresql/10/beta/postgresql.auto.conf

И можно запускать сервер.

student$ sudo pg_ctlcluster 10 beta start

Теперь оба сервера работают одновременно и независимо. Проверим:

student$ psql -p 5433 -d backup_base
β=> SELECT * FROM t;
      s       
--------------
 Привет, мир!
(1 row)


Конец демонстрации.