понедельник, 20 мая 2019 г.

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

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

$ 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
$ ls
# список файлов:
#libpq5_10.5-24.1C_amd64.deb  postgresql-10_10.5-24.1C_amd64.deb  postgresql-client-10_10.5-24.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 помечен как зафиксированный.


$ 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


$ sudo pg_ctlcluster 10 main start

$ 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 -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

-------------------------------------------------------------------------------------------------------

Настройка postgresql.conf для 1С Total Memory (RAM): 16 GB

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
 -------------------------------------------------------------------------------------------------------

Установим диск для backup


$ sudo cp /etc/fstab /etc/fstab.bak
$  ls -l /dev/disk/by-uuid
итого 0
lrwxrwxrwx 1 root root 10 май 17 17:51 cf0301e7-62cb-4f3c-b6f1-3e126a8a675a -> ../../sdb1
lrwxrwxrwx 1 root root 10 май 17 17:51 d2fb6453-a5ba-4113-bb85-81e1d1870268 -> ../../sda1

$ sudo nano /etc/fstab


Добавить/исправить для sdb1
UUID=cf0301e7-62cb-4f3c-b6f1-3e126a8a675a /backup         ext4    errors=remount-ro 0       1

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=d2fb6453-a5ba-4113-bb85-81e1d1870268 /               ext4    errors=remount-ro 0       1
UUID=cf0301e7-62cb-4f3c-b6f1-3e126a8a675a /backup         ext4    errors=remount-ro 0       1
/swapfile none swap sw 0 0

Сохранить.

$ sudo reboot

После создания пользователя postgres
$ sudo chown -R postgres:postgres /backup
$ sudo chmod -R 777 /backup


-------------------------------------------------------------------------------------------------------

Установка pg_probackup 

pg_probackup описание

$ 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
$ dpkg -l | grep pg-probackup-10 | awk -F' ' '{print $2}' | sudo xargs apt-mark hold

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


Каталог резервных копий /backup/backup1 расположено на hdd диске, в нем будем ежедневно сохранять backup за 30 дней без непрерывного архивирования.
Если нет дополнительного диска, выполняем закомментированые команды
#$ sudo mkdir /backup
#$ sudo chown -R postgres:postgres /backup 
$ sudo -u postgres pg_probackup-10 init -B /backup/backup1 
Определение копируемого экземпляра 
$ sudo -u postgres pg_probackup-10 add-instance -B /backup/backup1 -D /var/lib/postgresql/10/main --instance main

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

Добавить:

max_wal_senders = 10
wal_level = replica
unix_socket_directories='/var/run/postgresql'
# Для настройки архивного резервного копирования разкомментировать:
#archive_mode = on
#archive_command ='test ! -f /wal/%f && cp %p /wal/%f' 
#archive_command = '/usr/bin/pg_probackup-10 archive-push -B /backupwal --compress --instance main --wal-file-path %p --wal-file-name %f'

Сохранить.

$ sudo systemctl restart postgresql.service

Настройка политики сохранения 30 резервных копий

$ sudo -u postgres nano /backup/backup1/backups/main/pg_probackup.conf

Добавить:

retention-redundancy=30

Сохранить

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

$ sudo -u postgres pg_probackup-10 backup -B /backup/backup1 --instance main -b FULL --stream --compress --expired


Просмотр:

$ sudo -u postgres pg_probackup-10 show -B /backup/backup1


Проверка backup:
$ sudo -u postgres pg_probackup-10 validate -B /backup/backup1


Можно сделать еще один экземпляр для непрерывного архивирования.
Идея в одном экземпляре с retention-redundancy=30 организуем собрание автономных копий за месяц,  в другом экземпляре с retention-redundancy=5  организуем непрерывное wal архивирование, хранилища на разных дисках.

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

$ sudo mkdir /backupwal
$ sudo chown -R postgres:postgres /backupwal
$ sudo -u postgres pg_probackup-10 init -B /backupwal

Определение копируемого экземпляра 
$ sudo -u postgres pg_probackup-10 add-instance -B /backupwal -D /var/lib/postgresql/10/main --instance main

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

Добавить:

max_wal_senders = 10
wal_level = replica
unix_socket_directories='/var/run/postgresql'
# Для настройки архивного резервного копирования разкомментировать:
archive_mode = on
#archive_command ='test ! -f /wal/%f && cp %p /wal/%f'
archive_command = '/usr/bin/pg_probackup-10 archive-push -B /backupwal --compress --instance main --wal-file-path %p --wal-file-name %f'

Сохранить.

$ sudo systemctl restart postgresql.service

Настройка политики сохранения 5 резервных копий

$ sudo -u postgres nano /backupwal/backups/main/pg_probackup.conf

Добавить:

retention-redundancy=5

Сохранить


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


$ sudo -u postgres pg_probackup-10 backup -B /backupwal --instance main -b FULL --stream --compress --delete-wal --expired


Просмотр:

$ sudo -u postgres pg_probackup-10 show -B /backupwal


Проверка backup:
$ sudo -u postgres pg_probackup-10 validate -B /backupwal

-------------------------------------------------------------------------------------------------------  
petergeoghegan/amcheck

$ sudo apt install postgresql-10-amcheck

Для каждой базы:
postgres=# CREATE EXTENSION amcheck;
или
postgres=# CREATE EXTENSION amcheck_next;

Grigory Smolkin: для PG =<10 рекомендую ( Grigory Smolkin) использовать  amcheck_next

Для каждой базы, например demo:

$ sudo -u postgres psql -d postgres -c "CREATE EXTENSION amcheck_next" 
$ sudo -u postgres psql -d demo -c "CREATE EXTENSION amcheck_next"

$ sudo -u postgres pg_probackup-10 checkdb -B /backupwal --instance main --amcheck

INFO: Start checking data files
INFO: Data files are valid
INFO: Start amchecking PostgreSQL instance
INFO: Amchecking database 'postgres' using extension 'amcheck_next' version 2 from schema 'public'
INFO: Amchecking database 'demo' using extension 'amcheck_next' version 2 from schema 'public'
INFO: Checkdb --amcheck executed successfully
INFO: Indexes are valid


опция --heapallindexed, с ней amcheck проверяет, что хип, который должен быть проиндексирован, действительно проиндексирован

$ sudo -u postgres pg_probackup-10 checkdb -B /backupwal --instance main --amcheck --heapallindexed

INFO: Start checking data files
INFO: Data files are valid
INFO: Start amchecking PostgreSQL instance
INFO: Amchecking database 'postgres' using extension 'amcheck_next' version 2 from schema 'public'
INFO: Amchecking database 'demo' using extension 'amcheck_next' version 2 from schema 'public'
INFO: Checkdb --amcheck executed successfully
INFO: Indexes are valid
------------------------------------------------------------------------------------------------------- 

Пример восстановления из полной автономной резервной копии (замена кластера на резервную копию)


Сделали копию:
$ sudo -u postgres pg_probackup-10 backup -B /backup/backup1 --instance main -b FULL --stream --compress --expired

Перед восстановлением

Просмотр:

$ sudo -u postgres pg_probackup-10 show -B /backup/backup1


Проверка backup:
$ sudo -u postgres pg_probackup-10 validate -B /backup/backup1

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

Можно восстанавливать.

Останавливаем 1с
$ sudo systemctl stop srv1cv83.service

Останавливаем postgresql
$ sudo systemctl stop postgresql.service

Удалим кластер main
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/main/*"

Восстановим кластер main
$ sudo -u postgres pg_probackup-10 restore -B /backup/backup1 --instance main -i PRP29I
INFO: Validating backup PRP29I
INFO: Backup PRP29I data files are valid
INFO: Backup PRP29I WAL segments are valid
INFO: Backup PRP29I is valid.
INFO: Restore of backup PRP29I completed.


Запускаем postgresql
$ sudo systemctl start postgresql.service

Запускаем 1с
$ sudo systemctl start srv1cv83.service

------------------------------------------------------------------------------------------------------- 

Пример восстановления из полной автономной резервной копии c непрерывным архивированием (замена кластера на резервную копию)


$ sudo -u postgres pg_probackup-10 backup -B /backupwal --instance main -b FULL --stream --compress --delete-wal --expired


Просмотр:

$ sudo -u postgres pg_probackup-10 show -B /backupwal


Проверка backup:
$ sudo -u postgres pg_probackup-10 validate -B /backupwal

INFO: Validate backups of the instance 'main'
INFO: Validating backup PRP6Q5
INFO: Backup PRP6Q5 data files are valid
INFO: Backup PRP6Q5 WAL segments are valid
 Можно восстанавливать, но проверим непрерывность архивирования:


Войти в 1с создать документ, провести, выйти из 1с.


$ sudo -u postgres pg_probackup-10 validate -B /backupwal   --instance main -i PRP6Q5 --time='2042-04-16 12:26:00'
INFO: Validating backup PRP6Q5
INFO: Backup PRP6Q5 data files are valid
WARNING: Thread [1]: Could not read WAL record at 1/88000000
ERROR: Thread [1]: WAL segment "/backupwal/wal/main/000000010000000100000088" is absent
WARNING: Recovery can be done up to time 2019-05-18 14:36:30+03, xid 0 and LSN 1/2A000198
ERROR: Not enough WAL records to time 2042-04-16 12:26:00+03



Останавливаем 1с
$ sudo systemctl stop srv1cv83.service

Останавливаем postgresql
$ sudo systemctl stop postgresql.service

Удалим кластер main
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/main/*"

Восстановим кластер main
$ sudo -u postgres pg_probackup-10 restore -B /backupwal --instance main -i PRP6Q5 --recovery-target='latest'


INFO: Validating backup PRP6Q5
INFO: Backup PRP6Q5 data files are valid
INFO: Backup PRP6Q5 WAL segments are valid
INFO: Backup PRP6Q5 is valid.
INFO: Restore of backup PRP6Q5 completed.


Запускаем postgresql
$ sudo systemctl start postgresql.service

Запускаем 1с
$ sudo systemctl start srv1cv83.service

-------------------------------------------------------------------------------------------------------
Примечание 1


wal архивация сразу не заработала, проблема в pg_probackup 2.1.1
странное сообщение в логах - could not find a "pg_probackup" to execute #39

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

нужно указать полный путь к pg_probackup-10:

archive_command = '/usr/bin/pg_probackup-10 archive-push -B /backupwal --compress --instance main --wal-file-path %p --wal-file-name %f'

В логе было:

2019-05-18 12:27:24 MSK [20683]: [68-1] user=,db=,client= LOG:  archive command failed with exit code 1
2019-05-18 12:27:24 MSK [20683]: [69-1] user=,db=,client= DETAIL:  The failed archive command was: pg_probackup-10 archive-push -B /backupwal --compress --instance main --wal-file-path pg_wal/0000000100000000000000F1 --wal-file-name 0000000100000000000000F1
2019-05-18 12:27:24 MSK [20683]: [70-1] user=,db=,client= WARNING:  archiving write-ahead log file "0000000100000000000000F1" failed too many times, will try again later
could not find a "pg_probackup-10" to execute
pg_probackup-10: could not find own program executable


Для проверки стандартной wal архивации:

$ sudo mkdir -p /wal
$ sudo chown -R postgres:postgres /wal


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

расскоментировать:
archive_command ='test ! -f /wal/%f && cp %p /wal/%f'

Сохранить.

$ sudo systemctl restart postgresql.service

 
-------------------------------------------------------------------------------------------------------

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

Настройка резервного копирования и технологических операций

Настройка Postfix для отправки почты через yandex
Скрипт завершения работы пользователей
Для Ubuntu 18.04 можно воспользоваться
Как включить /etc/rc.local с помощью Systemd 
 
Можно оценить время выполнения операций.

$ time sudo -u postgres vacuumdb -afqz


$ time sudo -u postgres pg_probackup-10 backup -B /backupwal --instance main -b FULL --stream --compress --delete-wal --expired

$ time sudo -u postgres pg_probackup-10 backup -B /backup/backup1 --instance main -b FULL --stream --compress --expired

Настройка  pg_probackup-10 checkdb --amcheck

$ sudo apt install postgresql-10-amcheck

Создадим расширение для каждой базы:

$ sudo -u postgres psql -d postgres -c "CREATE EXTENSION amcheck_next"
$ sudo -u postgres psql -d demo -c "CREATE EXTENSION amcheck_next" 

sudo -u postgres mkdir /backupwal/copy

Настройка rsync Ubuntu 16.04

$ sudo nano /etc/default/rsync

#RSYNC_ENABLE=false
RSYNC_ENABLE=true

Сохранить.


$ sudo nano /etc/rsyncd.conf
# create new
# any name you like

[backup]
# destination directory to copy

path =
/backupwal/copy
# hosts you allow to access

hosts allow = 192.168.0.0/255.255.255.0
hosts deny = *
list = true
uid = root
gid = root
read only = false


Сохранить.

$ sudo systemctl enable rsync
$ sudo systemctl start rsync

Архивы вида pg_pro-2019-05-28_12-39-21.tar.gz
будут в папке /backupwal/copy

Для скачивания на windows машины
Установка RSync в Windows Cygwin 

На windows машине запускаем синхронизацию в планировщике один раз в день, по времени
позже обычного завершения архивирования на сервере

rsync -avz 192.168.0.239::backup  /cygdrive/D/z  --progress 

В папке D:\z 

будут складываться архивы копии кластера за каждый вида: 
.....
pg_pro-2019-05-28_12-39-21.tar.gz 
.....

Старые архивные копии можно удалять forfiles.exe
Как удалять файлы старше 10 дней на windows



 
Если сервер будет выключаться на ночь:

$ sudo nano /etc/rc.local

Заменить:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sleep 10
email=f1@vt.com
# выгнать пользователей
sudo sh /root/terminate.sh


# vacuumdb
sudo systemctl stop srv1cv83.service
log=/tmp/vacuumdb.txt
DATA=`date +"%Y-%m-%d %H:%M:%S"`
sudo -u postgres echo $DATA > $log
sudo -u postgres vacuumdb -afz >> $log
if [ $? -ne 0 ]
then
    msg="vacuumdb неудачное завершение"
else
    msg="vacuumdb удачное завершение"
fi
DATA=`date +"%Y-%m-%d %H:%M:%S"`
sudo -u postgres echo $DATA >> $log
echo $msg | mutt -s "$msg $DATA" $email -a $log
sudo systemctl start srv1cv83.service

# /backupwal
inst=/backupwal
log=$inst/log/pg_probackup.log
if [ -f $log ]; then sudo -u  postgres rm $log; fi
sudo -u postgres pg_probackup-10 backup -B /backupwal --instance main -b FULL \
    --stream --compress --delete-wal --expired --log-level-file=info
grep completed $log > /dev/null 2>&1
if [ $? -ne 0 ]
then
    msg="$inst неудачное завершение."
else
    msg="$inst удачное завершение."
fi
DATA=`date +"%Y-%m-%d %H:%M:%S"`
msg1="Размер экземпляра pg_probackup: $(du -h -s $inst)"
echo "$msg $msg1" | mutt -s "$msg $DATA" $email -a $log

# Сразу архивируем для rsync
COPY_DIR=$inst/copy
#Берем последнюю копию
COPY_ID=$(sudo -u postgres ls $inst/backups/main -1 | tail -1)
#Она должна быть completed
grep "$COPY_ID completed" $log > /dev/null 2>&1
if [ $? = 0 ]
then
    DATA=`date +"%Y-%m-%d_%H-%M-%S"`
    sudo -u postgres rm  $inst/copy/*
    sudo -u postgres tar -cvzf $COPY_DIR/pg_pro-$DATA.tar.gz  \
           $inst/backups/main/$COPY_ID > /dev/null 2>&1
    if [ $? = 0 ]
    then
        DATA=`date +"%Y-%m-%d_%H-%M-%S"`
        msg="создан $COPY_DIR/pg_pro-$DATA.tar.gz"
    else
        msg="ошибка создания $COPY_DIR/pg_pro-$DATA.tar.gz"
    fi
    echo $msg | mutt -s "$msg" $email -a $log
fi

# /backup/backup1
inst=/backup/backup1
log=$inst/log/pg_probackup.log
if [ -f $log ]; then sudo -u  postgres rm $log; fi
sudo -u postgres pg_probackup-10 backup -B /backup/backup1 --instance main -b FULL \
     --stream --compress --expired --log-level-file=info
grep completed $log > /dev/null 2>&1
if [ $? -ne 0 ]
then
    msg="$inst неудачное завершение."
else
    msg="$inst удачное завершение."
fi
DATA=`date +"%Y-%m-%d %H:%M:%S"`
msg1="Размер экземпляра pg_probackup: $(du -h -s $inst)"
echo "$msg $msg1" | mutt -s "$msg $DATA" $email -a $log

# checkdb --amcheck --heapallindexed
inst=/backupwal
log=$inst/log/pg_probackup.log
if [ -f $log ]; then sudo -u  postgres rm $log; fi
sudo -u postgres pg_probackup-10 checkdb -B /backupwal --instance main --amcheck \
      --heapallindexed --skip-block-validation --log-level-file=log
grep "INFO: Indexes are valid" $log > /dev/null 2>&1
if [ $? -ne 0 ]
then
    msg="ERROR: Checkdb --amcheck failed"
else
    msg="INFO: Indexes are valid"
fi
DATA=`date +"%Y-%m-%d %H:%M:%S"`
echo $msg | mutt -s "$msg $DATA" $email -a $log

exit

Сохранить.

Проверка

$ sudo reboot

или

$ sudo systemctl restart rc-local.service



Если сервер будет работать круглосуточно и хочется сделать один скрипт,
сложность в том что pg_probackup нужно запускать от postgres
от root pg_probackup в crontab не запустится.

проще всего настроить как было указано выше /etc/rc.local

$ sudo nano /etc/rc.local

......

$ sudo systemctl restart rc-local.service


С учетом времени настроить  crontab от root

$ sudo crontab -e

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

# Запуск скрипта в  3 часа 00 минут
00 3 * * * systemctl restart rc-local.service # Резервное копирования в  3 часа 00 минут



Сохранить.

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


Более поздний вариант (научился запускать pg_probackup от root):

$ sudo nano /root/fullbackup.sh


#!/bin/sh -e
#
email=f1@vu.com
sudo sh /root/terminate.sh
# vacuumdb
sudo systemctl stop srv1cv83.service
sudo -u postgres vacuumdb -afz > vacuumdb.txt
sudo systemctl start srv1cv83.service
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "vacuumdb неудачное завершение" | mutt -s 'vacuumdb '$DATA' - неудачное завершение' $email -a vacuumdb.txt
else
     echo "vacuumdb удачное завершение" | mutt -s 'vacuumdb '$DATA' - удачное завершение' $email -a vacuumdb.txt
fi

# /backupwal
inst='/backupwal'
log=$inst'/log/pg_probackup.log'
if [ -f $log ]; then rm $log; fi
cd $inst
PGPASSWORD=password pg_probackup-10  backup -B $inst --instance main -U postgres -d postgres -h 127.0.0.1  -b FULL --stream --compress --expired --log-level-file=info

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$inst неудачное завершение" | mutt -s $inst' '$DATA' - неудачное завершение' $email -a $log
else
     echo "$inst удачное завершение" | mutt -s $inst' '$DATA' - удачное завершение' $email -a $log
fi

# /backup/backup1
inst='/backup/backup1'
log=$inst'/log/pg_probackup.log'
if [ -f $log ]; then rm $log; fi
cd $inst
PGPASSWORD=password pg_probackup-10 backup -B $inst --instance main -U postgres -d postgres -h 127.0.0.1 -b FULL --stream --compress --expired --log-level-file=info

DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
     echo "$inst неудачное завершение" | mutt -s $inst' '$DATA' - неудачное завершение' $email -a $log
else
     echo "$inst удачное завершение" | mutt -s $inst' '$DATA' - удачное завершение' $email -a $log
fi


Сохранить.

$ sudo crontab -e

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

# Запуск скрипта в  3 часа 00 минут
00 3 * * * sh /root/fullbackup.sh # Резервное копирования в  3 часа 00 минут



Сохранить.

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


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

Примеры checkdb --amcheck


$ sudo apt install postgresql-10-amcheck
$ sudo su postgres
$ psql
postgres=# CREATE EXTENSION amcheck;
CREATE EXTENSION


postgres=# CREATE EXTENSION amcheck_next;



$ sudo -u postgres pg_probackup-10 checkdb -B /backupwal --instance main --amcheck
INFO: Start checking data files
INFO: Data files are valid
INFO: Start amchecking PostgreSQL instance
INFO: Amchecking database 'postgres' using extension 'amcheck' version 1.0 from schema 'public'
INFO: Checkdb --amcheck executed successfully
INFO: Indexes are valid





$ sudo -u postgres pg_probackup-10 checkdb -B /backupwal --instance main --amcheck
INFO: Start checking data files
INFO: Data files are valid
INFO: Start amchecking PostgreSQL instance
INFO: Amchecking database 'postgres' using extension 'amcheck_next' version 2 from schema 'public'
INFO: Checkdb --amcheck executed successfully
INFO: Indexes are valid

опция --heapallindexed, с ней amcheck проверяет, что хип, который должен быть проиндексирован, действительно проиндексирован

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

Пример восстановления из полной автономной резервной копии (замена кластера на резервную копию)

из файла pg_pro-2019-05-28_15-02-12.tar.gz

Следует обратить внимание что файлы сжатые, восстановлению подлежит только через 
pg_probackup !!!
Для иллюстрации пересоздадим экземпляр pg_probackup

$ sudo rm -R /backupwal
$ sudo mkdir /backupwal
$ sudo chown -R postgres:postgres /backupwal
$ sudo -u postgres mkdir /backupwal/copy
$ sudo -u postgres pg_probackup-10 init -B /backupwal

Определение копируемого экземпляра 
$ sudo -u postgres pg_probackup-10 add-instance -B /backupwal -D /var/lib/postgresql/10/main --instance main

Если экземпляр есть, и в нем нет PS7QLA, можно восстановить напрямую:

$ sudo -u postgres  tar -xvf pg_pro-2019-05-28_15-02-12.tar.gz -C /



Перед восстановлением
Просмотр:

$ sudo -u postgres pg_probackup-10 show -B /backupwal




Проверка backup:
$ sudo -u postgres pg_probackup-10 validate -B /backupwal

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

Можно восстанавливать.

Останавливаем 1с
$ sudo systemctl stop srv1cv83.service

Останавливаем postgresql
$ sudo systemctl stop postgresql.service

Удалим кластер main
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/10/main/*"

Восстановим кластер main
$ sudo -u postgres pg_probackup-10 restore -B /backupwal --instance main -i PS7QLA
INFO: Validating backup PS7QLA
INFO: Backup PS7QLA data files are valid
INFO: Backup PS7QLA WAL segments are valid
INFO: Backup PS7QLA is valid.
INFO: Restore of backup PS7QLA completed.

Запускаем postgresql
$ sudo systemctl start postgresql.service

Запускаем 1с
$ sudo systemctl start srv1cv83.service

============================================
Примечание
Опция external-dirs
код


# базовый сценарий
$ pg_probackup backup --instance=node -E /tmp/external_dir1
$ pg_probackup restore --instance=node

  * Содержимое /tmp/external_dir1 в процессе restore будет перенесено в /tmp/external_dir1
  * /tmp/external_dir1 в момент restore должна быть пустой

# несколько внешних директорий
pg_probackup backup --instance=node -E /tmp/external_dir1:/tmp/external_dir2

# Ремаппинг при восстановлении
$ pg_probackup backup --instance=node -E /tmp/external_dir1:/tmp/external_dir2
$ pg_probackup restore --instance=node --external-mapping=/tmp/external_dir1=/etc/external_dir1 --external-mapping=/tmp/external_dir2=/etc/external_dir2

  * Содержимое /tmp/external_dir1 будет восстановлено в /etc/external_dir1
  * Содержимое /tmp/external_dir2 будет восстановлено в /etc/external_dir2

# Как не восстанавливать внешние директории
$ pg_probackup restore --instance=node --skip-external-dirs

# Как отключить?
  * Просто перестать указывать опцию '-E' при бэкапе
  * Если задано через конфиг, то:
pg_probackup set-config -E none


# cmdline как и всегда имеет приоритет перед конфигом
$ pg_probackup set-config --instance=node -E /tmp/external_dir1
$ pg_probackup backup --instance=node -E /tmp/external_dir2
$ pg_probackup show --instance=node -i BACKUP_ID
 #Configuration
 ....
 
 #Compatibility
 ....
 
 #Result backup info
 ...
 external-dirs = '/etc/external_dir2'

# Что будет если у бэкапов в инкрементальной цепочке разный набор внешних директорий?
$ pg_probackup backup --instance=node -b FULL -E /tmp/external_dir1
$ pg_probackup backup --instance=node -b DELTA -E /tmp/external_dir2

  * При восстановлении DELTA будет восстановлено только содержимое /tmp/external_dir2

# Дерево директорий во внешней директории рекурсивно обходится, их содержимое копируется
# Теоретически во внешней директории может даже лежать еще одна PGDATA, она будет скопирована целиком
$ pg_probackup backup --instance=node
$ pg_probackup restore --instance=node -D /tmp/external_dir1

$ pg_probackup backup --instance=node -E /tmp/external_dir1
$ ls -la backup_catalog/backups/node/BACKUP_ID/external_directories/externaldir1/
drwx------ 19 gsmol docker 4096 Jun  1 10:57 .
drwx------  3 gsmol docker 4096 Jun  1 10:57 ..
-rw-r--r--  1 gsmol docker  221 Jun  1 10:57 backup_label
drwx------  5 gsmol docker 4096 Jun  1 10:57 base
drwx------  2 gsmol docker 4096 Jun  1 10:57 global
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_clog
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_commit_ts
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_dynshmem
-rw-------  1 gsmol docker  316 Jun  1 10:57 pg_hba.conf
-rw-------  1 gsmol docker 1636 Jun  1 10:57 pg_ident.conf
drwx------  4 gsmol docker 4096 Jun  1 10:57 pg_logical
drwx------  4 gsmol docker 4096 Jun  1 10:57 pg_multixact
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_notify
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_replslot
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_serial
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_snapshots
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_stat
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_stat_tmp
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_subtrans
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_tblspc
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_twophase
-rw-------  1 gsmol docker    4 Jun  1 10:57 PG_VERSION
drwx------  2 gsmol docker 4096 Jun  1 10:57 pg_xlog
-rw-------  1 gsmol docker  355 Jun  1 10:57 postgresql.auto.conf
-rw-------  1 gsmol docker  217 Jun  1 10:57 postgresql.conf

# симлинки фолловятся и хранятся как файлы

# Дедупликация распространяется и на внешние директории: если во время инкрементального бэкапа обнаружено файл во внешней директории не изменился(чексумма сходится), то не будет скопирован.
=============================================================
 
Разобрался как от root запускать в crontab:
10 23 * * * cd /backupwal;PGPASSWORD=pass pg_probackup-10  backup -B /backupwal --instance main -U postgres -d postgres -h 127.0.0.1  -b FULL --stream --compress --expired >> /tmp/cron.log 2>&1
 
Запуск cron от root пользователя при запуске системы 
 
pg_probackup восстановление отдельной базы 
 
 

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

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