пятница, 22 февраля 2019 г.

pg_probackup настройка автономного резервного копирования

Новая статья:

Установка pg_probackup СУБД PostgreSQL версия 10.5-24.1C 

Backup and recovery manager for PostgreSQL
Описание
ProBackup: как правильно делать бэкап PostgreSQL - Иван Картышов | DevFest Siberia 2017
ProBackup: быстро, надежно, инкрементально
Скрипт демонстрации:
Резервное копирование PostgreSQL с помощью pg_probackup | Григорий Смолкин


Виртуальная машина ubuntu 16.04.5 PostgreSQL версия 10.5-24.1C 1С 8.3.13.1690

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory               Log file
10 main    5432 online postgres /var/lib/postgresql/10/main pg_log/postgresql-%a.log
Первым делом пересоздать кластер (все данные убьются!!!)

$ sudo pg_dropcluster --stop 10 main
$ sudo pg_createcluster --locale ru_RU.UTF-8 10 main --  --data-checksums
Creating new PostgreSQL cluster 10/main ...
/usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5 --locale ru_RU.UTF-8 --data-checksums
Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
От его имени также будет запускаться процесс сервера.

Кластер баз данных будет инициализирован с локалью "ru_RU.UTF-8".
Кодировка БД по умолчанию, выбранная в соответствии с настройками: "UTF8".
Выбрана конфигурация текстового поиска по умолчанию "russian".

Контроль целостности страниц данных включён.

исправление прав для существующего каталога /var/lib/postgresql/10/main... ок
создание подкаталогов... ок
выбирается значение max_connections... 100
выбирается значение shared_buffers... 128MB
выбор реализации динамической разделяемой памяти... posix
создание конфигурационных файлов... ок
выполняется подготовительный скрипт... ок
выполняется заключительная инициализация... ок
сохранение данных на диске... ок

Готово. Теперь вы можете запустить сервер баз данных:

    /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l файл_журнала start

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main pg_log/postgresql-%a.log

$ sudo pg_createcluster --locale ru_RU.UTF-8 10 beta --  --data-checksums


$ sudo systemctl restart postgresql

$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*
$ ss -tunpl | grep 5433
tcp    LISTEN     0      128       *:5433                  *:*
tcp    LISTEN     0      128      :::5433                 :::*


$ sudo -u postgres psql -U postgres -c "show data_checksums;"
 data_checksums
----------------
 on
(1 строка)


$ sudo -u postgres psql -U postgres -c "alter user postgres with password 'pass';"

 
##apt-get update apt-get install pg-probackup-{11,10,9.6,9.5} 
$ sudo -i
# echo "deb [arch=amd64] http://repo.postgrespro.ru/pg_probackup/deb/ $(lsb_release -cs) main-$(lsb_release -cs)" > /etc/apt/sources.list.d/pg_probackup.list
# wget -O - http://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG_PROBACKUP | apt-key add -
# apt-get update
# apt-get install pg-probackup-10

Вариант для скрипта:

$ sudo su -c "echo 'deb [arch=amd64] http://repo.postgrespro.ru/pg_probackup/deb/ $(lsb_release -cs) main-$(lsb_release -cs)' > /etc/apt/sources.list.d/pg_probackup.list"
$ sudo su -c "wget -O - http://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG_PROBACKUP | apt-key add -"
$ sudo apt-get update
$ sudo apt-get install pg-probackup-10


Инициализация каталога резервных копий

$ sudo mkdir /backup
$ sudo chown -R postgres:postgres /backup
$ dpkg -L pg-probackup-10
...
/usr/bin/pg_probackup-10
...

#$ pg_probackup-10 init -B /backup
$ sudo /bin/su postgres -c "pg_probackup-10 init -B /backup"
INFO: Backup catalog '/backup' successfully inited


Определение копируемого экземпляра
#$ sudo /usr/bin/pg_probackup-10 add-instance -B каталог_копий -D каталог_данных --instance имя_экземпляра

$ sudo /bin/su postgres -c "pg_probackup-10 add-instance -B /backup -D /var/lib/postgresql/10/main --instance main"
INFO: Instance 'main' successfully inited

Настройка кластера баз данных:

Если не от postgres :

$ sudo su - postgres
$ psql
postgres=#

CREATE ROLE backup WITH LOGIN;
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup;
GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION txid_current() TO backup;
GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;
ALTER ROLE backup WITH REPLICATION;

pg < 10

sudo nano /etc/postgresql/9.6/main/pg_hba.conf

Раскомментировать:
local   replication     backup                                peer
host    replication     backup        127.0.0.1/32            md5

Сохранить.


$ sudo cp /etc/postgresql/10/main/postgresql.conf /etc/postgresql/10/main/postgresql.conf.bak
$ sudo nano /etc/postgresql/10/main/postgresql.conf

Добавить:
....
Настройки для 1с здесь не приведены
....

max_wal_senders = 10
wal_level = replica
# Для настройки архивного резервного копирования разкомментировать:

# archive_mode = on
# archive_command = 'pg_probackup-10 archive-push -B /backup --instance main --wal-file-path %p --wal-file-name %f'


$ sudo systemctl restart postgresql

- Автономные копии могут быть восстановлены на сервере, не имеющем файлового доступа к архиву WAL
- Автономное резервное копирование позволяет восстановить состояние кластера на тот момент времени, для которого уже нет файлов WAL.

Создание полной автономной резервной копии:

$ sudo /bin/su postgres -c "pg_probackup-10 backup -B /backup --instance main -b FULL --stream"
INFO: Backup start, pg_probackup version: 2.0.26, backup ID: PNG44Z, backup mode: full, instance: main, stream: true, remote: false
INFO: Start transfering data files
INFO: Data files are transfered
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Validating backup PNG44Z
INFO: Backup PNG44Z data files are valid
INFO: Backup PNG44Z completed

Просмотр:
$ sudo /bin/su postgres -c "pg_probackup-10 show -B /backup"
BACKUP INSTANCE 'main'
===============================================================================================

 Instance  Version  ID      Recovery Time           Mode  WAL      Current/Parent TLI  Time    Data   Start LSN    Stop LSN  Status
===============================================================================================

 main      10       PNG44Z  2019-02-24 22:47:09+03  FULL  STREAM   2 / 0               211s  2558MB  0/D1000060  0/D10001D0  OK

Проверка backup:
$ sudo /bin/su postgres -c "pg_probackup-10 validate -B /backup"

INFO: Validate backups of the instance 'main'
INFO: Validating backup PNFW41
INFO: Backup PNFW41 data files are valid
INFO: Backup PNFW41 WAL segments are valid
INFO: All backups are valid

С опцией  --compress сжимает примерно в 4 раза.

$ sudo /bin/su postgres -c "pg_probackup-10 backup -B /backup --instance main -b FULL --stream --compress"
[sudo] пароль для user:
INFO: Backup start, pg_probackup version: 2.0.26, backup ID: PNH03N, backup mode: full, instance: main, stream: true, remote: false
INFO: Start transfering data files
INFO: Data files are transfered
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Validating backup PNH03N
INFO: Backup PNH03N data files are valid
INFO: Backup PNH03N completed

$ sudo /bin/su postgres -c "pg_probackup-10 show -B /backup"

BACKUP INSTANCE 'main'
===============================================================================================

 Instance  Version  ID      Recovery Time           Mode  WAL     Current/Parent TLI  Time    Data   Start LSN    Stop LSN  Status
===============================================================================================

 main      10       PNH03N  2019-02-25 10:17:56+03  FULL  STREAM  2 / 0               233s   446MB  0/EA000028  0/EA0001D0  OK
 main      10       PNG6FL  2019-02-24 23:36:27+03  FULL  STREAM  2 / 0               193s  2558MB  0/D7000028  0/D70EF108  OK
 


================================================================


Удаление:

$ sudo /bin/su postgres -c "pg_probackup-10 delete -B /backup --instance main -i PNG44Z"


Удалим и восстановим кластер main

$ sudo systemctl stop postgresql
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/main/*"


$ sudo /bin/su postgres -c "pg_probackup-10 show -B /backup"

BACKUP INSTANCE 'main'
===============================================================================================
 Instance  Version  ID      Recovery Time           Mode  WAL      Current/Parent TLI  Time    Data   Start LSN    Stop LSN  Status
===============================================================================================

 main      10       PNG07B  2019-02-24 21:21:55+03  FULL  ARCHIVE  1 / 0               189s  2237MB  0/810000D0  0/81000240  OK
 main      10       PNFWRP  2019-02-24 20:04:43+03  FULL  ARCHIVE  1 / 0                 7s    23MB   0/6000060   0/6000198  OK



Восстановим
$ sudo /bin/su postgres -c "pg_probackup-10 restore -B /backup --instance main -i PNFWRP"

$ sudo systemctl restart postgresql
user@u1604:~$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*

Можно подключаться из 1с

Попробуем восстановить в другой кластер на этом сервере:

$ sudo systemctl stop postgresql
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/beta/*"

Восстановим


$ sudo /bin/su postgres -c "pg_probackup-10 restore -B /backup --instance main -D /var/lib/postgresql/10/beta -i PNG44Z"
INFO: Validating backup PNG44Z
INFO: Backup PNG44Z data files are valid
INFO: Backup PNG44Z WAL segments are valid
INFO: Backup PNG44Z is valid.
INFO: Restore of backup PNG44Z completed.

Настроить:$ sudo nano /etc/postgresql/10/beta/postgresql.conf

max_wal_senders = 10
wal_level = replica

Сохранить.
 
$ sudo systemctl restart postgresql
$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*

$ sudo systemctl restart postgresql
$ ss -tunpl | grep 5433
tcp    LISTEN     0      128       *:5433                  *:*
tcp    LISTEN     0      128      :::5433                 :::*

Можно подключаться из 1с:




Перенос полной автономной резервной копии на другой компьютер:

На сервере с которого копируем:

$ sudo /bin/su postgres -c "tar -cvzf  /var/lib/postgresql/pg_pro-$(date +%Y-%m-%d_%H-%M-%S).tar.gz -C /backup ."


На сервере на который копируем:

$ sudo -i
# echo "deb [arch=amd64] http://repo.postgrespro.ru/pg_probackup/deb/ $(lsb_release -cs) main-$(lsb_release -cs)" > /etc/apt/sources.list.d/pg_probackup.list
# wget -O - http://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG_PROBACKUP | apt-key add -
# apt-get update
# apt-get install pg-probackup-10


$ sudo mkdir /backup
$ sudo chown -R postgres:postgres /backup
$ sudo /bin/su postgres -c "pg_probackup-10 init -B /backup"

любым способом копируем папку с резервной копией
/backup/backups/main/PNG6FL

$ sudo chown -R postgres:postgres /backup

$ sudo /bin/su postgres -c "pg_probackup-10 show -B /backup"


BACKUP INSTANCE 'main'
===============================================================================================
 Instance  Version  ID      Recovery Time           Mode  WAL     Current/Parent TLI  Time    Data   Start LSN    Stop LSN  Status
===============================================================================================

 main      10       PNG6FL  2019-02-24 23:36:27+03  FULL  STREAM  2 / 0               193s  2558MB  0/D7000028  0/D70EF108  OK



$ sudo /bin/su postgres -c "pg_probackup-10 validate -B /backup"
INFO: Validate backups of the instance 'main'
INFO: Validating backup PNG6FL
INFO: Backup PNG6FL data files are valid
INFO: Backup PNG6FL WAL segments are valid
INFO: All backups are valid


Удалим и восстановим кластер main

$ sudo systemctl stop postgresql
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/main/*"
 
$ sudo /bin/su postgres -c "pg_probackup-10 restore -B /backup --instance main -i PNG6FL"
INFO: Validating backup PNG6FL
INFO: Backup PNG6FL data files are valid
INFO: Backup PNG6FL WAL segments are valid
INFO: Backup PNG6FL is valid.
INFO: Restore of backup PNG6FL completed.

$ sudo systemctl restart postgresql
$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*


================================================================
pg_probackup validate -B каталог_копий
[--instance имя_экземпляра
[ -i ид_резервной_копии | [{--time=время | --xid=ид_транзакции | --recovery-target-name=имя_цели_восстановления }
[--inclusive=логическое_значение]]]]
[--timeline=линия_времени]
[-j число_потоков] [--progress] [-q] [-v]

Проверяет наличие и целостность всех файлов, необходимых для восстановления кластера. Если вы зададите имя_экземпляра без дополнительных параметров, pg_probackup проверит самую последнюю копию, которая имеется для этого экземпляра. Если вы зададите имя_экземпляра с параметром точки восстановления или ид_резервной_копии, pg_probackup проверит, возможно ли восстановить кластер с этими параметрами. Если имя_экземпляра не задано, pg_probackup проверяет все резервные копии, имеющиеся в каталоге копий.

================================================================

#pg_probackup add-instance -B %BACKUP_DIR% -D %PGDATA% --instance %INSTANCE%
#pg_probackup backup -B %BACKUP_DIR% --instance %INSTANCE% --backup-mode=FULL --stream --progress -d postgres
#pg_probackup show -B %BACKUP_DIR%



postgres@test:~$ pwd
/var/lib/postgresql
postgres@test:~$ ls
9.6
postgres@test:~$ pg_probackup-9.6 validate -B /backup --instance main -i PNKVZY --log-directory=/var/lib/postgresql --log-level-file='error'
ERROR: Backup PNKVZY has status: ERROR
postgres@test:~$ ls
9.6  pg_probackup.log  pg_probackup.log.rotation
postgres@test:~$ cat pg_probackup.log
2019-02-27 15:51:33 MSK: ERROR: Backup PNKVZY has status: ERROR


$ pg_probackup-9.6 validate -B /backup --instance main -i PNJKHE --log-directory=/var/lib/postgresql --log-level-file='info'
INFO: Validating backup PNJKHE
INFO: Backup PNJKHE data files are valid
INFO: Backup PNJKHE WAL segments are valid
INFO: Backup PNJKHE is valid.
INFO: Validate of backup PNJKHE completed.




$ cat pg_probackup.log
2019-02-27 15:51:33 MSK: ERROR: Backup PNKVZY has status: ERROR
2019-02-27 15:55:32 MSK: INFO: command: pg_probackup-9.6 validate -B /backup --instance main -i PNJKHE --log-directory=/var/lib/postgresql --log-level-file=info
2019-02-27 15:55:32 MSK: INFO: Validating backup PNJKHE
2019-02-27 15:55:32 MSK: INFO: Backup PNJKHE data files are valid
2019-02-27 15:55:32 MSK: INFO: Backup PNJKHE WAL segments are valid
2019-02-27 15:55:32 MSK: INFO: Backup PNJKHE is valid.
2019-02-27 15:55:32 MSK: INFO: Validate of backup PNJKHE completed.



Идея сделать скрипт,

$ nano backup-pgpro.sh

Вставить текст ниже:







#!/bin/sh
set -e
BACKUP_DIR='/backup'
INSTANCE='main'
BACKU_ID=$(ls /backup/backups/main -1 | tail -1)
VALIDATE=$(sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup --instance main -i PNJKHE" | tail -1)




$ sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup"

$ ls /backup/backups/main -1 | tail -1
V
$ sudo /bin/su postgres -c "pg_probackup-9.6 show -B /backup --instance main -i PNJKHE"
n# sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup --instance main -i PNJKHE"
INFO: Validating backup PNJKHE
INFO: Backup PNJKHE data files are valid
INFO: Backup PNJKHE WAL segments are valid
INFO: Backup PNJKHE is valid.
INFO: Validate of backup PNJKHE completed.
root@test:/backup/backups/main# sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup --instance main -i PNKVZY"
ERROR: Backup PNKVZY has status: ERROR



#!/bin/sh
#set -e
#sudo su - postgres
BACKUP_DIR='/backup'
COPY_DIR='/backup/copy'
LOG_DIR='/backup'
LOG_FILE='err.txt'
INSTANCE='main'
COPY_ID=''
sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE"
sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE.rotation"

sudo systemctl stop  srv1cv83.service

# Создание полной автономной резервной копии:
echo "Создание полной автономной резервной копии"
sudo /bin/su postgres -c "pg_probackup-9.6 backup -B $BACKUP_DIR \
     --instance $INSTANCE -b FULL --stream --compress -j 8 \
     --log-directory=$LOG_DIR \
     --log-level-file='error' --error-log-filename=$LOG_FILE"

if [ ! -f $LOG_DIR/$LOG_FILE ]; then
    #echo "Файл не существует!"
    echo "успешно завершено!"
else
    # проверку не проводил
    # не знаю как смоделировать
    # ошибку
    #echo "Файл существует!"
    echo "закончилось неудачей!"
    cat $LOG_DIR/$LOG_FILE
    sudo systemctl start  srv1cv83.service
    exit 1
fi

# Поскольку мы не знаем идентификатор резервной копии
# возьмем последнюю копию, но ее нужно проверить
COPY_ID=$(sudo /bin/su postgres -c "ls /backup/backups/main -1 | tail -1")
echo $COPY_ID

# без ошибки
#COPY_ID='PNJKHE'
# с ошибкой
#COPY_ID='PNKVZY'
# короткий
#COPY_ID='PNJKHE'

sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE"
sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE.rotation"

sudo /bin/su - postgres -c "pg_probackup-9.6 validate -B $BACKUP_DIR \
     --instance $INSTANCE -i $COPY_ID --log-level-file='error' \
     --log-directory=$LOG_DIR \
     --error-log-filename=$LOG_FILE"
if [ ! -f $LOG_DIR/$LOG_FILE ]; then
    echo "Файл не существует!"
    DATA=`date +"%Y-%m-%d_%H-%M-%S"`
    sudo /bin/su postgres -c "tar -cvzf $COPY_DIR/pg_pro-$DATA.tar.gz \
          $BACKUP_DIR/backups/$INSTANCE/$COPY_ID"
else
    echo "Файл существует!"
    cat $LOG_DIR/$LOG_FILE
    echo "Резервная копия не прошла валидацию!"
    sudo systemctl start  srv1cv83.service
    exit 1

fi


#sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE"
#sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_FILE.rotation"
echo "Нормальное завершение программы!"
sudo systemctl start  srv1cv83.service



1 комментарий:

  1. Подскажите если я хочу работать с двумя базами как мне перечислить их в archive_command = '... --instance main --instance main2 или через запятую --instance main,main2

    ОтветитьУдалить