Создадим базу данных и таблицу.
α=> 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)
Конец демонстрации.