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

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

    α=> 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)

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