Описание
pg_probackup настройка автономного резервного копирования
$ sudo pg_dropcluster --stop 9.6 main$ sudo pg_createcluster --locale ru_RU.UTF-8 9.6 main -- --data-checksums
$ sudo systemctl restart postgresql
$ ss -tunpl | grep 5432
$ sudo -u postgres psql -U postgres -c "show data_checksums;"
$ sudo -u postgres psql -U postgres -c "alter user postgres with password 'pass';"
$ 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-9.6
#Инициализация каталога резервных копий /backup - папка в корне
$ sudo mkdir /backup
$ sudo chown -R postgres:postgres /backup
#$ sudo chmod -R 777 /backup
#$ sudo /bin/su postgres -c "pg_probackup-9.6 init -B /backup"
$ sudo /bin/su postgres -c "mkdir -p /backup/backups"
$ sudo /bin/su postgres -c "mkdir -p /backup/wal"
Папка для копий /backup/copy примонтированный диск sdb1
$ sudo cp /etc/fstab /etc/fstab.bak
$ ls -l /dev/disk/by-uuid
итого 0
lrwxrwxrwx 1 root root 10 янв 26 16:26 249a8fb4-196c-497b-962d-36a4fa994afd -> ../../sda1
lrwxrwxrwx 1 root root 10 янв 26 16:26 cf0301e7-62cb-4f3c-b6f1-3e126a8a675a -> ../../sdb1
$ sudo nano /etc/fstab
Добавить/исправить
UUID=cf0301e7-62cb-4f3c-b6f1-3e126a8a675a /backup/copy ext4 defaults 0 2
Сохранить.
$ sudo reboot
$ sudo chown -R postgres:postgres /backup
$ sudo /bin/su postgres -c "pg_probackup-9.6 add-instance -B /backup -D /var/lib/postgresql/9.6/main --instance main"
INFO: Instance 'main' successfully inited
Настройка кластера баз данных:
sudo nano /etc/postgresql/9.6/main/pg_hba.conf
Раскомментировать:
local replication backup peer
host replication backup 127.0.0.1/32 md5
Сохранить.
Для 32 Gb RAM иначе не запустится!!!
Из 32 Gb выделяем 16 PostgreSQL
sudo cp /etc/postgresql/9.6/main/postgresql.conf /etc/postgresql/9.6/main/postgresql.conf.bak
sudo nano /etc/postgresql/9.6/main/postgresql.conf
Добавить в конец:
#
# Для настройки pg_probackup-9.6
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'
# Ниже настройки для 1с
# Total Memory (RAM): 16 GB
# Data Storage: ssd
max_connections = 1000
shared_buffers = 4GB
temp_buffers = 256MB
work_mem = 64MB
effective_cache_size = 12GB
maintenance_work_mem = 1GB
wal_buffers = 16MB
min_wal_size = 2GB
max_wal_size = 4GB
default_statistics_target = 100
effective_io_concurrency = 2
random_page_cost = 1.1
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 20s
bgwriter_delay = 20ms
bgwriter_lru_multiplier = 4.0
bgwriter_lru_maxpages = 400
synchronous_commit = off
checkpoint_completion_target = 0.9
ssl = offfsync = on
commit_delay = 1000
commit_siblings = 5
row_security = off
max_files_per_process = 1000
standard_conforming_strings = off
escape_string_warning = off
max_locks_per_transaction = 256
#log_min_duration_statement = 0
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
#log_autovacuum_min_duration = 0
lc_messages='C'
#log_duration = on
#log_statement = all
log_destination = stderr
plantuner.fix_empty_table = 'on'
online_analyze.table_type = 'temporary'
online_analyze.verbose = 'off'
Сохранить.
$ sudo systemctl restart postgresql.service
Создание полной автономной резервной копии:
$ sudo /bin/su postgres -c "pg_probackup-9.6 backup -B /backup --instance main -b FULL --stream --compress"
Просмотр:
$ sudo /bin/su postgres -c "pg_probackup-9.6 show -B /backup"
BACKUP INSTANCE 'main'
==========================================================================================
Instance Version ID Recovery Time Mode WAL Current/Parent TLI Time Data Start LSN Stop LSN Status
==========================================================================================
main 9.6 PNJKHE 2019-02-26 19:30:15+03 FULL STREAM 1 / 0 41s 40MB 0/2000060 0/20001D0 OK
Удаление:
$ sudo /bin/su postgres -c "pg_probackup-10 delete -B /backup --instance main -i PNJKHE"
Проверка:
$ sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup"
$ sudo nano /backup/backups/main/pg_probackup.conf
Добавить:
retention-redundancy=7
#retention-window=7
Сохранить.
$ nano pg_probackup.sh
#!/bin/sh
#set -e
#sudo su - postgres
BACKUP_DIR='/backup'
COPY_DIR='/backup/copy'
LOG_DIR='/backup'
LOG_ERR_FILE='err.txt'
INSTANCE='main'
COPY_ID=''
FLAG_BACKUP=false
FLAG_VALIDATE=false
sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_ERR_FILE"
sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_ERR_FILE.rotation"
sudo /bin/su - postgres -c "rm -f $LOG_DIR/pg_probackup.log"
sudo /bin/su - postgres -c "rm -f $LOG_DIR/pg_probackup.log.rotation"
#if false ; then
if true ; then
sudo systemctl stop srv1cv83.service
# Создание полной автономной резервной копии:
echo "INFO: Начинаем создание полной автономной резервной копии!"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Начинаем создание полной автономной резервной копии!"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
sudo /bin/su postgres -c "pg_probackup-9.6 backup -B $BACKUP_DIR \
--instance $INSTANCE -b FULL --stream --compress \
--log-directory=$LOG_DIR \
--log-level-file='info' \
--error-log-filename=$LOG_ERR_FILE"
if [ ! -f $LOG_DIR/$LOG_ERR_FILE ]; then
FLAG_BACKUP=true
# нет файла
echo "INFO: Создание полной автономной резервной копии $COPY_ID успешно завершено!"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Создание полной автономной \
резервной копии $COPY_ID успешно завершено!"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
else
FLAG_BACKUP=false
# проверку не проводил
# не знаю как смоделировать
# ошибку
#echo "Файл существует!"
echo "закончилось неудачей!"
cat $LOG_DIR/$LOG_ERR_FILE
fi
sudo systemctl start srv1cv83.service
fi
if $FLAG_BAKUP ; then
# Поскольку мы не знаем идентификатор резервной копии
# возьмем последнюю копию, но ее нужно проверить
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='PNMWOY'
# короткий
#COPY_ID='PNJKHE'
#sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_ERR_FILE"
#sudo /bin/su - postgres -c "rm -f $LOG_DIR/$LOG_ERR_FILE.rotation"
sudo /bin/su - postgres -c "pg_probackup-9.6 validate -B $BACKUP_DIR \
--instance $INSTANCE \
-i $COPY_ID \
--log-level-file='info' \
--log-directory=$LOG_DIR \
--error-log-filename=$LOG_ERR_FILE"
if [ ! -f $LOG_DIR/$LOG_ERR_FILE ]; then
#echo "Файл не существует!"
FLAG_VALIDATE=true
echo "INFO: Резервная копия $COPY_ID прошла валидацию!"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Резервная копия $COPY_ID прошла валидацию!"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
#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 \
# -C $BACKUP_DIR/backups/$INSTANCE"
else
#echo "Файл существует!"
cat $LOG_DIR/$LOG_ERR_FILE
echo "INFO: Резервная копия $COPY_ID не прошла валидацию удаляем!"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Резервная копия $COPY_ID не прошла валидацию удаляем!"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
sudo /bin/su postgres -c "pg_probackup-9.6 delete -B $BACKUP_DIR \
--instance $INSTANCE \
-i $COPY_ID \
--log-directory=$LOG_DIR \
--log-level-file='info' \
--error-log-filename=$LOG_ERR_FILE"
FLAG_VALIDATE=false
fi
fi
#с полными путями
#if $FLAG_VALIDATE ; then
# DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# sudo /bin/su postgres -c "cd $BACKUP_DIR/backups/$INSTANCE; \
# tar -cvzf $COPY_DIR/pg_pro-$DATA.tar.gz \
# $BACKUP_DIR/backups/$INSTANCE/$COPY_ID"
#fi
if $FLAG_VALIDATE ; then
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
sudo /bin/su postgres -c "cd $BACKUP_DIR/backups/$INSTANCE; \
tar -cvzf $COPY_DIR/pg_pro-$DATA.tar.gz $COPY_ID > /dev/null"
echo "INFO: Создан файл $COPY_DIR/pg_pro-$DATA.tar.gz"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Создан файл $COPY_DIR/pg_pro-$DATA.tar.gz"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
fi
echo "Очистить каталог резервных копий в соответствии с политикой их сохранения"
sudo /bin/su postgres -c "pg_probackup-9.6 delete -B $BACKUP_DIR \
--instance $INSTANCE --expired \
--log-directory=$LOG_DIR \
--log-level-file='info' \
--error-log-filename=$LOG_ERR_FILE"
# full vacuum
#if false ; then
if true ; then
echo "INFO: Начинаем full vacuum"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Начинаем full vacuum"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
sudo /bin/su postgres -c "/usr/bin/vacuumdb -zfa >> $LOG_DIR/pg_probackup.log"
fi
DAY=4 #(или ваше число дней)
sudo su -c "find /backup/copy -type f -mtime +$DAY -exec rm -f {} \;"
LOGINFO=`date +"%Y-%m-%d %H:%M:%S MSK: INFO: Завершение работы"`
sudo /bin/su postgres -c "echo $LOGINFO >> $LOG_DIR/pg_probackup.log"
sudo /bin/su postgres -c "echo 'backup-pgpro' | mutt -s 'backup-pgpro' f1@vt.com -a $LOG_DIR/pg_probackup.log"
Сохранить.
Однократный запуск
$ time sudo sh pg_probackup.sh
Запуск по расписанию:
$ sudo -i
# crontab -e
Добавить в конец (сработает в 23:00):
# каждые день в 23.00
0 23 * * * sh /home/user/pg_probackup.sh Сохранить.
Смотреть задания:
# crontab -l
Лог от PostgreSQL administrator <postgres@test.localdomain> на email
2019-02-28 17:57:45 MSK: INFO: Начинаем создание полной автономной резервной копии!
2019-02-28 17:57:45 MSK: INFO: command: pg_probackup-9.6 backup -B /backup --instance main -b FULL --stream --compress --log-directory=/backup --log-level-file=info --error-log-filename=err.txt
2019-02-28 17:57:45 MSK: INFO: Backup start, pg_probackup version: 2.0.26, backup ID: PNN5K9, backup mode: full, instance: main, stream: true, remote: false
2019-02-28 17:57:46 MSK: INFO: Start transfering data files
2019-02-28 18:01:05 MSK: INFO: Data files are transfered
2019-02-28 18:01:06 MSK: INFO: wait for pg_stop_backup()
2019-02-28 18:01:06 MSK: INFO: pg_stop backup() successfully executed
2019-02-28 18:01:07 MSK: INFO: Validating backup PNN5K9
2019-02-28 18:01:12 MSK: INFO: Backup PNN5K9 data files are valid
2019-02-28 18:01:12 MSK: INFO: Backup PNN5K9 completed
2019-02-28 18:01:12 MSK: INFO: Создание полной автономной резервной копии успешно завершено!
2019-02-28 18:01:17 MSK: INFO: command: pg_probackup-9.6 validate -B /backup --instance main -i PNN5K9 --log-level-file=info --log-directory=/backup --error-log-filename=err.txt
2019-02-28 18:01:17 MSK: INFO: Validating backup PNN5K9
2019-02-28 18:01:22 MSK: INFO: Backup PNN5K9 data files are valid
2019-02-28 18:01:22 MSK: INFO: Backup PNN5K9 WAL segments are valid
2019-02-28 18:01:22 MSK: INFO: Backup PNN5K9 is valid.
2019-02-28 18:01:22 MSK: INFO: Validate of backup PNN5K9 completed.
2019-02-28 18:01:22 MSK: INFO: Резервная копия PNN5K9 прошла валидацию!
2019-02-28 18:01:33 MSK: INFO: Создан файл /backup/copy/pg_pro-2019-02-28_18-01-22.tar.gz
2019-02-28 18:01:33 MSK: INFO: command: pg_probackup-9.6 delete -B /backup --instance main --expired --log-directory=/backup --log-level-file=info --error-log-filename=err.txt
2019-02-28 18:01:33 MSK: INFO: Delete: PNMWRQ 2019-02-28 14:51:07+03
2019-02-28 18:01:33 MSK: INFO: Purging finished
2019-02-28 18:01:33 MSK: INFO: Начинаем full vacuum
vacuumdb: очистка базы данных "demo"
vacuumdb: очистка базы данных "postgres"
vacuumdb: очистка базы данных "template1"
2019-02-28 18:05:42 MSK: INFO: Завершение работы
Предполагаем, что sda1 мертв,
папка /backup/copy это sdb1
Восстанавливаем архив вида pg_pro-2019-02-28_18-01-22.tar.gz
на вновь установленном и настроенном сервере
$ pwd
/backup/backups/main
$ ls
pg_probackup.conf
Распаковываем pg_pro-2019-02-28_18-01-22.tar.gz хоть mc в /backup/backups/main
$ ls
pg_probackup.conf PNN6Q6
Просмотр:
$ sudo /bin/su postgres -c "pg_probackup-9.6 show -B /backup"
[sudo] пароль для user:
BACKUP INSTANCE 'main'
==============================================================================================
Instance Version ID Recovery Time Mode WAL Current/Parent TLI Time Data Start LSN Stop LSN Status
==============================================================================================
main 9.6 PNN6Q6 2019-02-28 18:26:13+03 FULL STREAM 1 / 0 201s 417MB 6/2D000108 6/2D000278 OK
Проверка:
$ sudo /bin/su postgres -c "pg_probackup-9.6 validate -B /backup"
INFO: Validate backups of the instance 'main'
INFO: Validating backup PNN6Q6
INFO: Backup PNN6Q6 data files are valid
INFO: Backup PNN6Q6 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 "rm -rf /var/lib/postgresql/9.6/main/*"
#$ sudo /bin/su postgres -c "pg_probackup-10 restore -B /backup --instance main -i PNN6Q6"
$ sudo /bin/su postgres -c "pg_probackup-9.6 restore -B /backup --instance main -i PNN6Q6"
INFO: Validating backup PNN6Q6
INFO: Backup PNN6Q6 data files are valid
INFO: Backup PNN6Q6 WAL segments are valid
INFO: Backup PNN6Q6 is valid.
INFO: Restore of backup PNN6Q6 completed.
$ sudo systemctl restart postgresql
$ ss -tunpl | grep 5432
tcp LISTEN 0 128 *:5432 *:*
tcp LISTEN 0 128 :::5432 :::*
Подключаем 1С (нужно создать кластер, подключить базу как обычно)