Установка СУБД 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 !!!
$ 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 восстановление отдельной базы
Комментариев нет:
Отправить комментарий