Новая статья:
Установка 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
Подскажите если я хочу работать с двумя базами как мне перечислить их в archive_command = '... --instance main --instance main2 или через запятую --instance main,main2
ОтветитьУдалить