среда, 27 февраля 2019 г.

Скрипт backup postgres 9.6 pg_probackup

Описание 

 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С (нужно создать кластер, подключить базу как обычно)

Комментариев нет:

Отправить комментарий