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

воскресенье, 24 февраля 2019 г.

pg_dump каталоговый архиватор в несколько потоков

$ sudo /bin/su postgres -c "pg_dump  demo -j 2 -Fd  -f /var/lib/postgresql/backup"
$ sudo /bin/su postgres -c "pg_dump  demo -j 2 -Fd  -f /var/lib/postgresql/backup >> /var/lib/postgresql/backup.txt"

Решение для ошибки «insserv: warning: script ‘script’ missing LSB tags and overrides»

$ sudo dpkg -i 1c-enterprise83-common_8.3.13-1690_amd64.deb
Выбор ранее не выбранного пакета 1c-enterprise83-common.
(Чтение базы данных … на данный момент установлено 116637 файлов и каталогов.)
Подготовка к распаковке 1c-enterprise83-common_8.3.13-1690_amd64.deb …
Распаковывается 1c-enterprise83-common (8.3.13-1690) …
Настраивается пакет 1c-enterprise83-common (8.3.13-1690) …

$ sudo dpkg -i 1c-enterprise83-server_8.3.13-1690_amd64.deb
Выбор ранее не выбранного пакета 1c-enterprise83-server.
(Чтение базы данных … на данный момент установлено 116733 файла и каталога.)
Подготовка к распаковке 1c-enterprise83-server_8.3.13-1690_amd64.deb …
Stopping 1C:Enterprise 8.3 server: Warning: server not running!
OK
Распаковывается 1c-enterprise83-server (8.3.13-1690) …
Настраивается пакет 1c-enterprise83-server (8.3.13-1690) …
insserv: warning: script 'haspd.outformat' missing LSB tags and overrides
Обрабатываются триггеры для systemd (229-4ubuntu21.16) …
Обрабатываются триггеры для ureadahead (0.100.0-19) …
 
user@u1604:~/test$ sudo nano /etc/init.d/haspd.outformat 
### BEGIN INIT INFO
# Provides:          MyScript
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      1 0 6
# Short-Description: ...
# Description: ...
### END INIT INFO

$ sudo dpkg -i 1c-enterprise83-common_8.3.13-1690_amd64.deb
Выбор ранее не выбранного пакета 1c-enterprise83-common.
(Чтение базы данных … на данный момент установлено 116637 файлов и каталогов.)
Подготовка к распаковке 1c-enterprise83-common_8.3.13-1690_amd64.deb …
Распаковывается 1c-enterprise83-common (8.3.13-1690) …
Настраивается пакет 1c-enterprise83-common (8.3.13-1690) …



$ sudo dpkg -i 1c-enterprise83-server_8.3.13-1690_amd64.deb
Выбор ранее не выбранного пакета 1c-enterprise83-server.
(Чтение базы данных … на данный момент установлено 116733 файла и каталога.)
Подготовка к распаковке 1c-enterprise83-server_8.3.13-1690_amd64.deb …
Stopping 1C:Enterprise 8.3 server: Warning: server not running!
OK
Распаковывается 1c-enterprise83-server (8.3.13-1690) …
Настраивается пакет 1c-enterprise83-server (8.3.13-1690) …
Обрабатываются триггеры для systemd (229-4ubuntu21.16) …
Обрабатываются триггеры для ureadahead (0.100.0-19) …

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

Создание кластера --data-checksums

Только pg_dump + включенные контрольные суммы данных могут сделать вас «уверенным» в отсутствии коррупция в резервном копировании.
Page Checksum Protection in PostgreSQL
pg_healer: repairing Postgres problems automatically
Виртуальная машина ubuntu 16.04.5 PostgreSQL версия 10.5-24.1C 1С 8.3.13.1690
Давайте обсудим проверку контрольных сум для файлов.
Пример восстановления таблиц PostgreSQL с помощью новой мега фичи pg_filedump
Postgres checksum performance impact

Публикую свои скрипты архивации PostgreSQL баз 1С
Еще один шаг к более легким резервным копиям
Настройка бекапа PostgreSQL в Ubuntu Server при помощи pgBackRest с копированием на Windows Share

$ 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 systemctl restart postgresql

postgres=# show data_checksums;
 data_checksums
----------------
 on
(1 строка)

$ sudo -u postgres psql -U postgres -c "alter user postgres with password 'pass';"
$ sudo cp /etc/postgresql/10/main/postgresql.conf /etc/postgresql/10/main/postgresql.conf.bak
 

Из 32 Gb выделяем 16 PostgreSQL

sudo nano /etc/postgresql/10/main/postgresql.conf
Добавить в конец:


# DB Version: 10
# OS Type: linux
# DB Type: oltp
# 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
#min_wal_size = 2GB
#max_wal_size = 4GB
ssl = off
fsync = 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
$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*

$ sudo systemctl restart srv1cv83.service
$ ss -tlnp | grep :15
LISTEN     0      128          *:1560                     *:*
LISTEN     0      128          *:1540                     *:*
LISTEN     0      128          *:1541                     *:*
LISTEN     0      128         :::1560                    :::*
LISTEN     0      128         :::1540                    :::*
LISTEN     0      128         :::1541                    :::*


Загрузить базу 1С.

$ sudo mkdir /backup
$ sudo chown -R postgres:postgres /backup

$ mkdir -p /home/user/backup/yandex


$ sudo nano backup_ftp.sh

#!/bin/sh
set -e
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DATA_FTP=`date +"%Y-%m-%d_%H-%M-%S"` # без роатации
# Если на ftp мало места включить ротацию:
#DATA_FTP=`date +"%d"` # для ротации по номеру дня месяца
#DATA_FTP=`date +"%u"` # для ротации по номеру дня недели
DIR_TMP='/backup'
DIR_BACKUP='/home/user/backup'
DIR_YANDEX='/home/user/backup/yandex'
echo "--------------------------------------------------------------------" > /home/user/backup/backup.log
# Записываем информацию в лог с секундами
echo "$DATA Начало backup"
echo "$DATA Начало backup" >> /home/user/backup/backup.log

sudo /bin/su postgres -c "rm -rf $DIR_TMP/*" \
     && sudo /bin/su postgres -c "/usr/bin/pg_basebackup -D $DIR_TMP -Ft -z -Xf -P" \
     && sudo mv $DIR_TMP/base.tar.gz $DIR_BACKUP/base-$DATA.tar.gz
$?
# $DIR_BACKUP/base-$DATA.tar.gzecho $?

if [ $? -ne 0 ]
then
     DATA=`date +"%Y-%m-%d_%H-%M-%S"`
     echo "$DATA Ошибка завершения для backup"
     echo "$DATA Ошибка завершения для backup" >> /home/user/backup/backup.log
     exit
else
     DATA=`date +"%Y-%m-%d_%H-%M-%S"`
     echo "$DATA Успешное завершение backup"
     echo "$DATA Успешное завершение backup" >> /home/user/backup/backup.log
fi
echo "--------------------------------------------------------------------" >> /home/user/backup/backup.log

#делаем vacuumdb
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# Записываем информацию в лог с секундами
echo "$DATA Начало vacuum full"
echo "$DATA Начало vacuum full" >> /home/user/backup/backup.log
#sudo /bin/su postgres -c "/usr/bin/vacuumdb -zfa" >> /home/user/backup/backup.log

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$DATA Ошибка завершения для vacuum full"
     echo "$DATA Ошибка завершения для vacuum full" >> /home/user/backup/backup.log
     exit
else
     echo "$DATA Успешное завершение vacuum full"
     echo "$DATA Успешное завершение vacuum full" >> /home/user/backup/backup.log
fi
echo "--------------------------------------------------------------------" >> /home/user/backup/backup.log


# посылаем сообщение
sleep 2
#echo "backup" | mutt -s "backup"  f2@vt.com -a $BACKUP_DIR/backup.log

Сохранить. 
 

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



четверг, 21 февраля 2019 г.

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

В данной статье опишем установку сервера СУБД PostgreSQL версия 10.5-24.1C на ubuntu 16.04.5 на виртуальную машину.
Нам потребуется (все 64 бит):
1. ubuntu 16.04.5
2. 1С берем на сайте 8.3.13.1690 при наличии договора ИТС
3. PostgreSQL версия 10.5-24.1C дистрибутивдополнительные модули при наличии договора ИТС 
4. Драйверы hasp берем etersoft

1. Устанавливаем ubuntu 16.04.5 без swap файла, т.е. размечаем вручную весь диск ext4 root.
RAM (32GB)

Настройки ubuntu пользователь (привязка в скриптах) user пароль 12345, имя компьютера test, позже мы его сменим скриптом, как и ip адрес.

После установки, Ctrl +Alt + T (окно терминала)
$ sudo apt update -y
$ sudo apt upgrade -y
$ sudo apt autoremove -y
$ sudo apt install mc ssh samba -y
Прверить синхранизацию NTP synchronized: yes, если нет настроить.
$ timedatectl

Возможно sudo apt upgrade -y не пройдет из за блокировки, тогда sudo reboot и повторите с начала.

$ lsusb
Bus 001 Device 004: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle
Bus 001 Device 003: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

2. Настройка сети скриптом.
Узнаем ip и имя адаптера
 $ ip a
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP     inet 192.168.0.43/24 brd 192.168.0.255 scope global enp1s0

$ nano network.sh

Скопируем из буфера следующий скрипт, в котором Вам нужно исправить ip, адрес шлюза и имя адаптера в соответствии со своей сетью:

#!/bin/bash
# настройка ip и hostname
#----------------------------------------------------------------------
_hostname="u1604"
# virtualbox
_iface="enp0s3"
_address="192.168.0.239"
_gateway="192.168.0.1"
_netmask="255.255.255.0"
_nameserver="8.8.8.8"
#----------------------------------------------------------------------
# отключим сетевой менеджер для ubuntu desktop#sudo systemctl stop NetworkManager.service
#sudo systemctl disable NetworkManager.service
# настроим статический ip
sudo cat > /tmp/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#auto $_iface
#iface $_iface inet dhcp
iface $_iface inet static
address $_address
netmask $_netmask
gateway $_gateway
dns-nameservers $_nameserver
auto $_iface
EOF
sudo cp /tmp/interfaces /etc/network
#sudo rm /etc/resolv.conf
#sudo /bin/su -c "echo 'nameserver $_nameserver' > /etc/resolv.conf"
# изменим hostname и ip
sudo cat > /tmp/hosts <<EOF
127.0.0.1       localhost
$_address       $_hostname
EOF
sudo cp /tmp/hosts /etc
# изменим hostname
sudo hostname $_hostname
sudo /bin/su -c "echo $_hostname > /etc/hostname"
# отключим ipv6
sudo /bin/su -c "echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'net.ipv6.conf.lo.disable_ipv6 = 1' >> /etc/sysctl.conf"
#sudo /bin/su -c "echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf"
#тюнинг postgresql
#add a swap file to an Ubuntu 16.04
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo cp /etc/fstab /etc/fstab.bak
sudo echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo /bin/su -c "echo 'vm.swappiness=1' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'kernel.sched_migration_cost_ns = 5000000' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'kernel.sched_autogroup_enabled = 0' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'vm.dirty_background_bytes = 67108864' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'vm.dirty_bytes = 536870912' >> /etc/sysctl.conf"
sudo /bin/su -c "echo 'vm.zone_reclaim_mode = 0' >> /etc/sysctl.conf"
sudo sysctl -p
# перезагрузим сеть
sudo systemctl restart networking.service
#sudo systemctl start networking.service
#sudo systemctl enable networking.service
# Настройка sudo journalctl -b sudo journalctl -b -1 sudo journalctl --list-boots
sudo sed -i 's/#Storage=auto/Storage=persistent/' /etc/systemd/journald.conf
# Отключение уведомлений службы Apport (/var/crash)
sudo sed -i 's/enabled=1/enabled=0/' /etc/default/apport
# Отключим службу ondemand# (для разгона cpu)
# cat /proc/cpuinfo | grep MHz
# systemctl status ondemand
sudo systemctl stop ondemand
sudo systemctl disable ondemand
# shutdown -r now

Сохраним файл network.sh

------------------------------------------
Сделаем исполняем
$ chmod +x network.sh
$  sudo ./network.sh

или
$  sudo sh network.sh
------------------------------------------

Перезагрузимся

$ sudo reboot


Настройка Ubuntu для работы с ИБП от APC



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

После перезагрузки по сети можно подключиться MobaXterm
к нашей виртуальной машине (по ip или или имени )  загрузить файлы установки:
$ mkdir /home/user/test
В папку /test положить файлы:

postgresql_10.5_24.1C_amd64_deb.tar.bz2
postgresql_10.5_24.1C_amd64_addon_deb.tar.bz2

$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" >> /etc/apt/sources.list.d/postgresql.list'
$ sudo apt update -y
$ sudo apt-get install postgresql-common libtcl8.6 -y
$ dpkg -l | grep postgres | awk -F' ' '{print $2}' | sudo xargs apt-mark hold
#pgdg-keyring помечен как зафиксированный.
#postgresql-client-common помечен как зафиксированный.
#postgresql-common помечен как зафиксированный.
$ mkdir -p /tmp/post
$ cp /home/user/test/postgresql_10.5_24.1C_amd64_deb.tar.bz2 /tmp/post/
$ cp /home/user/test/postgresql_10.5_24.1C_amd64_addon_deb.tar.bz2 /tmp/post/
$ cd /tmp/post
$ tar -xvf postgresql_10.5_24.1C_amd64_deb.tar.bz2
$ cd  postgresql-10.5-24.1C_amd64_deb
#(libpq5_10.5-11.1C_amd64.deb  postgresql-10_10.5-11.1C_amd64.deb  postgresql-client-10_10.5-11.1C_amd64.deb)
$ sudo dpkg -i *.deb
$ cd /tmp/post/
$ tar -xvf postgresql_10.5_24.1C_amd64_addon_deb.tar.bz2
$ cd postgresql-10.5-24.1C_amd64_addon_deb
$ sudo dpkg -i *.deb
$ dpkg -l | grep 10.5-24.1C | awk -F' ' '{print $2}' | sudo xargs apt-mark hold
#libecpg-compat3 помечен как зафиксированный.
#libecpg-dev помечен как зафиксированный.
#libecpg6 помечен как зафиксированный.
#libpgtypes3 помечен как зафиксированный.
#libpq-dev помечен как зафиксированный.
#libpq5 помечен как зафиксированный.
#postgresql-10 помечен как зафиксированный.
#postgresql-10-dbg помечен как зафиксированный.
#postgresql-client-10 помечен как зафиксированный.
#postgresql-doc-10 помечен как зафиксированный.
#postgresql-plperl-10 помечен как зафиксированный.
#postgresql-plpython-10 помечен как зафиксированный.
#postgresql-plpython3-10 помечен как зафиксированный.
#postgresql-pltcl-10 помечен как зафиксированный.
#postgresql-server-dev-10 помечен как зафиксированный.

$ sudo -u postgres psql -U postgres -c "alter user postgres with password 'pass';"
$ sudo cp /etc/postgresql/10/main/postgresql.conf /etc/postgresql/10/main/postgresql.conf.bak

#Делаем проверки
$ sudo systemctl status postgresql.service
$ ss -tunpl | grep 5432
tcp    LISTEN     0      128       *:5432                  *:*
tcp    LISTEN     0      128      :::5432                 :::*
$ ps aux | grep postgres | grep -- -D
postgres  4914  0.0  0.1 320972 28864 ?        S    08:37   0:00 /usr/lib/postgresql/10/bin/postgres -D /var/lib/postgresql/10/main -c config_file=/etc/postgresql/10/main/postgresql.conf
-------------------------------------------------------------------------------------------------------

Установка 1с

В папку /test положить файлы:
deb64_8_3_13_1690.tar.gz

# установка 1с
$ mkdir -p /tmp/1ctmp
$ cd /tmp/1ctmp
$ sudo apt install imagemagick -y
#$sudo apt install -y unixodbc libgsf-1-114 libglib2.0
$ sudo apt install libfreetype6 libgsf-1-common unixodbc glib2.0
#ubuntu
$ sudo  apt install -y xfonts-utils cabextract
$ sudo apt install ttf-mscorefonts-installer -y
$  ls /home/user/test/
$ cp /home/user/test/deb64_8_3_13_1690.tar.gz /tmp/1ctmp
$ tar xvzf deb64_8_3_13_1690.tar.gz
$ sudo dpkg -i 1c-enterprise83-common_8.3.13-1690_amd64.deb
$ sudo dpkg -i 1c-enterprise83-server_8.3.13-1690_amd64.deb
#$ sudo apt -f -y install
$ sudo chown -R usr1cv8:grp1cv8 /opt/1C
$ sudo echo -e "pass\npass\n" | sudo passwd usr1cv8
$ sudo service srv1cv83 start
$ sudo service srv1cv83 status
$ sudo usermod -aG sudo usr1cv8

$ sudo  apt install -y libc6-i386
$ mkdir /tmp/hasp
$ cd /tmp/hasp
$ wget http://download.etersoft.ru/pub/Etersoft/HASP/last/x86_64/Ubuntu/16.04/haspd-modules_7.60-eter1ubuntu_amd64.deb
$ wget http://download.etersoft.ru/pub/Etersoft/HASP/last/x86_64/Ubuntu/16.04/haspd_7.60-eter1ubuntu_amd64.deb
$ sudo dpkg -i *.deb
#$ sudo apt-get install -f -y
$ sudo service haspd start
$ sudo service haspd status
$ sudo reboot

$ sudo service srv1cv83 status
$ ss -tlnp | grep :15
LISTEN     0      128          *:1560                     *:*
LISTEN     0      128          *:1540                     *:*
LISTEN     0      128          *:1541                     *:*
LISTEN     0      128         :::1560                    :::*
LISTEN     0      128         :::1540                    :::*
LISTEN     0      128         :::1541                    :::*


Не встал скриптом imagemagick?
Без строчки ниже будет ругаться при входе в 1с
$ sudo apt-get install imagemagick  -y

$ sudo poweroff

Делаем образ u1604_pg10.5-24_1c.ova
-------------------------------------------------------------------------------------------------------

Зашарить папку по сети

$ sudo mkdir /share/
$ sudo chmod -R 777 /share/
$ sudo chown -R root:sambashare /share/
$ sudo cp -b -f /etc/samba/smb.conf /etc/samba/smb.conf.bak
$ sudo nano /etc/samba/smb.conf

Добавить в конец

[files]
path = /share/
comment = No comment
read only = no
available = yes
browseable = yes
writable = yes
guest ok = yes
public = yes
printable = no
locking = no
strict locking = no

Сохранить
Перезагрузить службу

$ sudo service smbd restart

Настройка технологического журнала

$ sudo mkdir -p /home/usr1cv8/.1cv8/1C/1cv8/conf/

S sudo nano /home/usr1cv8/.1cv8/1C/1cv8/conf/logcfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
        <log location="/home/usr1cv8/log" history="96">
                <event>
                        <eq property="name" value="DBPOSTGRS"/>
                </event>
                <event>
                        <eq property="name" value="SDBL"/>
                </event>
                <event>
                        <eq property="name" value="EXCP"/>
                </event>
                <property name="all"/>
        </log>
</config>
Сохранить.

Другой вариант:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
        <log location="/home/usr1cv8/log" history="96">
                <event>
                        <ne property="name" value="DB2" />
                        <ne property="name" value="DBMSSQL" />
                        <ne property="name" value="DBMSSQLCONN" />
                        <ne property="name" value="DBORACLE" />
                        <ne property="name" value="DBPOSTGRS" />
                        <ne property="name" value="DBV8DBENG" />
                        <ne property="name" value="SDBL" />
                        <ne property="name" value="MEM" />
                        <ne property="name" value="TLOCK" />
                        <ne property="name" value="SRVC" />
                        <ne property="name" value="CALL" />
                        <ne property="name" value="CONN" />
                        <ne property="name" value="SCALL" />
                        <ne property="name" value="SCOM" />
                        <ne property="name" value="VRSREQUEST" />
                        <ne property="name" value="VRSRESPONSE" />
                </event>
                <property name="all" />
        </log>
</config>

Настройка дампов

$ sudo mkdir -p /home/usr1cv8/dumps/
$ sudo mkdir -p /home/usr1cv8/log/
$ sudo chown -R usr1cv8:grp1cv8 /home/usr1cv8/
$ echo 'usr1cv8 soft core unlimited' | sudo tee -a /etc/security/limits.conf
$ echo 'usr1cv8 hard core unlimited' | sudo tee -a /etc/security/limits.conf
$ echo 'kernel.core_pattern=/home/usr1cv8/dumps/core.%e.%p ' | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p


Можно подключать базу 1С postgres пароль pass
(вместо test имя своего сервера)



После загрузки базы:
$ sudo /bin/su postgres -c "/usr/bin/vacuumdb --analyze --full --quiet --username postgres --dbname=demo"

Для 32 Gb RAM иначе не запустится!!!
Из 32 Gb выделяем 16 PostgreSQL

sudo nano /etc/postgresql/10/main/postgresql.conf
Добавить в конец:


# DB Version: 10
# OS Type: linux
# DB Type: oltp
# 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
#min_wal_size = 2GB
#max_wal_size = 4GB
ssl = off
fsync = 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 systemctl restart srv1cv83.service 

Тестирование.

Тестовая база.

Документ начисление зарплаты и взносов за август:
Очистить.


1. Без настройки postgresql.conf и без тж
Заполнить: 170 с
Провести: 127 с

2. с настройкой postgresql.conf и без тж
Заполнить: 154 с
Провести: 127 с

Параметры которые были до 10.5-24.1C убрали:

user@u1604:~$ sudo su - postgres
postgres@u1604:~$ psql

postgres=# SHOW debug_enable_cheapest_group_by;
ERROR:  unrecognized configuration parameter "debug_enable_cheapest_group_by"
postgres=# SHOW debug_enable_group_by_match_order_by;
ERROR:  unrecognized configuration parameter "debug_enable_group_by_match_order_by"
postgres=# SHOW debug_group_by_reorder_by_pathkeys;
ERROR:  unrecognized configuration parameter "debug_group_by_reorder_by_pathkeys"
postgres=#

$ free -m
              total        used        free      shared  buff/cache   available
Память:       32168        2943       25704        1071        3520       27710
Подкачка:        1023           0        1023

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

Использование для backup rsync


Настройка и использование Rsync Server

rsync русский man

В случае если в сети несколько линукс компьютеров

$ sudo apt install sshpass

Копирование (синхронизация) на локальный компьютер папки backup c удаленного сервера:

Первый раз для создания сертификатов:

$ rsync --archive --verbose --progress  user@192.168.0.239:/home/user/backup /home/user/
 
Далее:

$ sshpass -p "12345" rsync --archive --verbose --progress  user@192.168.0.239:/home/user/backup /home/user/

В /home/user/ создается папка backup <-> /home/user/backup со всеми подкаталогами

Если на конце "/" user@192.168.0.239:/home/user/backup/, то берутся файлы из backup, сама папка не создается.

тоже 

sshpass -p "12345" rsync --archive --verbose --progress  user@192.168.0.239:/home/user/backup/ /home/user/backup/

или

sshpass -p "12345" rsync --archive --verbose --progress  user@192.168.0.239:/home/user/backup/ /home/user/backup



для скрипта:

sudo /bin/su user -c "sshpass -p "12345" rsync --archive --verbose --progress  user@192.168.0.239:/home/user/backup/ /home/user/backup/"

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

Копирование (синхронизация) на сервере папки backup на удаленный компьютер:

Первый раз для создания сертификатов:

$ rsync --archive --verbose --progress  /home/user/backup/ user@192.168.0.5:/home/user/backup/

Далее:

$ sshpass -p '12345' rsync --archive --verbose --progress  /home/user/backup/ user@192.168.0.5:/home/user/backup/

для скрипта:

$ sudo /bin/su user -c "sshpass -p '12345' rsync --archive --verbose --progress  /home/user/backup/ user@192.168.0.5:/home/user/backup/"


Скрипт backup postgres pg_basebackup


Шифрование файлов backup с использованием gpg и открытого публичного ключа
Вариант с gpg:
Просомтр ключей
$ gpg --list-keys
gpg: создан каталог `/home/user/.gnupg'
gpg: создан новый файл настроек `/home/user/.gnupg/gpg.conf'
gpg: ВНИМАНИЕ: параметры в `/home/user/.gnupg/gpg.conf' при этом запуске еще не действуют
gpg: создана таблица ключей `/home/user/.gnupg/pubring.gpg'
gpg: /home/user/.gnupg/trustdb.gpg: создана таблица доверия

Импорт открытого ключа
$ gpg --import pubkey.txt
gpg: создана таблица ключей `/home/user/.gnupg/secring.gpg'
gpg: ключ 9BD0BCD3: импортирован открытый ключ "backup <mail@backup.com>"
gpg: Всего обработано: 1
gpg:               импортировано: 1  (RSA: 1)

Импорт закрытого ключа(нужен на момент восстановления)
user@u1604:~$ gpg --allow-secret-key-import --import privkey.txt
gpg: ключ 9BD0BCD3: импортирован закрытый ключ
gpg: ключ 9BD0BCD3: "backup <mail@backup.com>" не изменен
gpg: Всего обработано: 1
gpg:              неизмененных: 1
gpg:       считано закрытых ключей: 1
gpg:   импортировано закрытых ключей: 1

$ gpg --edit-key mail@backup.com
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Закрытый ключ доступен.

pub  4096R/9BD0BCD3  создан: 2019-02-17  годен до: никогда       применимость: SC
                     доверие: неизвестной действительность: неизвестной
sub  4096R/4452E03E  создан: 2019-02-17  годен до: никогда       применимость: E
[неизвестно] (1). backup <mail@backup.com>

gpg> trust Enter;
pub  4096R/9BD0BCD3  создан: 2019-02-17  годен до: никогда       применимость: SC
                     доверие: неизвестной действительность: неизвестной
sub  4096R/4452E03E  создан: 2019-02-17  годен до: никогда       применимость: E
[неизвестно] (1). backup <mail@backup.com>

Укажите, насколько Вы доверяете данному пользователю в вопросах проверки
достоверности ключей других пользователей (проверяет паспорт,
сверяет отпечатки ключей из разных источников и т.п.)

  1 = Не знаю или не буду отвечать
  2 = НЕ доверяю
  3 = Доверяю ограниченно
  4 = Полностью доверяю
  5 = Абсолютно доверяю
  m = вернуться в главное меню

Ваше решение? 5
Вы действительно хотите сделать этот ключ абсолютно доверенным? (y/N) y

pub  4096R/9BD0BCD3  создан: 2019-02-17  годен до: никогда       применимость: SC
                     доверие: абсолютное действительность: неизвестной
sub  4096R/4452E03E  создан: 2019-02-17  годен до: никогда       применимость: E
[неизвестно] (1). backup <mail@backup.com>
Учтите, что показанная действительность ключа может быть неверной,
пока Вы не перезапустите программу.
gpg> q


$ sudo mkdir /backup
$ sudo chown -R postgres:postgres /backup

sudo nano /etc/postgresql/9.6/main/pg_hba.conf
Раскомментировать:
local   replication     postgres                                peer
host    replication     postgres        127.0.0.1/32            md5

Сохранить

$ sudo nano  /etc/postgresql/9.6/main/postgresql.conf
Добавить:


max_replication_slots = 10
max_wal_senders = 10
wal_level = replica 

Сохранить.

$ sudo systemctl restart postgresql 




$ nano backup_ftp.sh

#!/bin/sh
set -e
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DATA_FTP=`date +"%Y-%m-%d_%H-%M-%S"` # без роатации
# Если на ftp мало места включить ротацию:
#DATA_FTP=`date +"%d"` # для ротации по номеру дня месяца
#DATA_FTP=`date +"%u"` # для ротации по номеру дня недели
DIR_TMP='/backup'
DIR_BACKUP='/home/user/backup'
DIR_YANDEX='/home/user/backup/yandex'
echo "--------------------------------------------------------------------" > /home/user/backup/backup.log
# Записываем информацию в лог с секундами
echo "$DATA Начало backup"
echo "$DATA Начало backup" >> /home/user/backup/backup.log

sudo /bin/su postgres -c "rm -rf $DIR_TMP/*" \
     && sudo /bin/su postgres -c "/usr/bin/pg_basebackup -D $DIR_TMP -Ft -z -Xf -P" \
     && sudo mv $DIR_TMP/base.tar.gz $DIR_BACKUP/base-$DATA.tar.gz \
     && sudo /bin/su user -c \
     "gpg -e -r mail@backup.com --cipher-algo AES256 -o $DIR_YANDEX/base-$DATA_FTP.tar.gz.gpg \
     $DIR_BACKUP/base-$DATA.tar.gz" \
     && curl --upload-file $DIR_YANDEX/base-$DATA_FTP.tar.gz.gpg ftp://test:test@192.168.0.5 \
     && sudo /bin/su user -c "rm $DIR_YANDEX/base-$DATA_FTP.tar.gz.gpg"

#&& sudo /bin/su user -c "yandex-disk start"

#echo $?

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$DATA Ошибка завершения для backup"
     echo "$DATA Ошибка завершения для backup" >> /home/user/backup/backup.log
     exit
else
     echo "$DATA Успешное завершение backup"
     echo "$DATA Успешное завершение backup" >> /home/user/backup/backup.log
fi
echo "--------------------------------------------------------------------" >> /home/user/backup/backup.log

#делаем vacuumdb
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# Записываем информацию в лог с секундами
echo "$DATA Начало vacuum full"
echo "$DATA Начало vacuum full" >> /home/user/backup/backup.log
sudo /bin/su postgres -c "/usr/bin/vacuumdb -zfa" >> /home/user/backup/backup.log

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$DATA Ошибка завершения для vacuum full"
     echo "$DATA Ошибка завершения для vacuum full" >> /home/user/backup/backup.log
     exit
else
     echo "$DATA Успешное завершение vacuum full"
     echo "$DATA Успешное завершение vacuum full" >> /home/user/backup/backup.log
fi
echo "--------------------------------------------------------------------" >> /home/user/backup/backup.log


# посылаем сообщение
sleep 2
#echo "backup" | mutt -s "backup"  f2@vt.com -a $BACKUP_DIR/backup.log

Сохранить.
 
Запуск:
$ sudo sh backup_ftp.sh

Запуск по расписанию:

$ sudo -i
# crontab -e
Добавить в конец (сработает в 18:01):
# каждые день в 18.00



0 18 * * * sh /home/user/backup_ftp.sh
Сохранить.

Смотреть задания:
# crontab -l

Проверка расшифровки:

d:\us01>gpg --allow-secret-key-import --import privkey.txt
gpg: ключ 521D03509BD0BCD3: "backup <mail@backup.com>" не изменен
gpg: ключ 521D03509BD0BCD3: импортирован секретный ключ
gpg: Всего обработано: 1
gpg:                   неизмененных: 1
gpg:     прочитано секретных ключей: 1
gpg: импортировано секретных ключей: 1

d:\gpg>gpg -d -o gpg -d -r mail@backup.com -o base-7.tar.gz base-7.tar.gz.gpg


Короткий вариант:

$ nano pg_basebackup.sh

#!/bin/sh
set -e
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DATA_FTP=`date +"%Y-%m-%d_%H-%M-%S"` # без роатации
# Если на ftp мало места включить ротацию:
#DATA_FTP=`date +"%d"` # для ротации по номеру дня месяца
#DATA_FTP=`date +"%u"` # для ротации по номеру дня недели
DIR_TMP='/backup'
DIR_BACKUP='/home/user/backup'
DIR_YANDEX='/home/user/backup/yandex'
echo "--------------------------------------------------------------------" > /home/user/backup/backup.log
# Записываем информацию в лог с секундами
echo "$DATA Начало backup"
echo "$DATA Начало backup" >> /home/user/backup/backup.log

sudo /bin/su postgres -c "rm -rf $DIR_TMP/*" \
     && sudo /bin/su postgres -c "/usr/bin/pg_basebackup -D $DIR_TMP -Ft -z -Xf -P" \
     && sudo mv $DIR_TMP/base.tar.gz $DIR_BACKUP/base-$DATA.tar.gz

#echo $?

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$DATA Ошибка завершения для backup"
     echo "$DATA Ошибка завершения для backup" >> /home/user/backup/backup.log
     exit
else
     echo "$DATA Успешное завершение backup"
     echo "$DATA Успешное завершение backup" >> /home/user/backup/backup.log
fi
echo "--------------------------------------------------------------------" >> /home/user/backup/backup.log


$ time sudo sh pg_basebackup.sh