Скрипт бэкапа postgres
Шифрование файлов backup с использованием gpg и открытого публичного ключа
Импорт открытого ключа:
$ gpg --import pubkey.txt
Импорт закрытого ключа:
$ gpg --allow-secret-key-import --import privkey.txt
$ 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
$ mkdir -p /home/user/backup/yandex
$ nano backup-sql.sh
Вставить текст ниже:
#!/bin/sh
# crontab -e
# mkdir -p /home/user/backup/yandex
set -e
BACKUP_DIR="/home/user/backup"
DIR_YANDEX="/home/user/backup/yandex"
echo "====================================================================" > $BACKUP_DIR/backup.log
# останавливаем сервер 1С
echo "останавливаем сервер 1С"
sudo systemctl stop srv1cv83.service
echo "состояние сервера 1С" >> $BACKUP_DIR/backup.log
sudo systemctl status srv1cv83.service | grep 'Active:' >> $BACKUP_DIR/backup.log
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DATA_NAME=`date +"%Y-%m-%d_%H-%M-%S"`
echo "$DATA Size database file: " >> $BACKUP_DIR/backup.log
sudo du -h -s /var/lib/postgresql/9.6/main/base >> $BACKUP_DIR/backup.log
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
# делаем backup
DB_BASE=`sudo /bin/su postgres -c "/usr/bin/psql -qAt -c 'SELECT * FROM pg_database;'" | \
cut -d"|" -f1 | /bin/grep -v template | /bin/grep -v postgres`
#DB_BASE="demo test" #конкретные базы
#DB_BASE="" #пропустить
echo $DB_BASE
for DB_NAME in $DB_BASE
do
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# Записываем информацию в лог с секундами
echo "$DATA Начало backup базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
# Бэкапим базу данных demo и сразу сжимаем
echo "$DATA Начало backup базы ${DB_NAME}"
sudo /bin/su postgres -c "pg_dump -Fc ${DB_NAME}" > $BACKUP_DIR/${DB_NAME}_$DATA_NAME.dump
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
echo "$DATA Ошибка завершения backup для базы ${DB_NAME}"
echo "$DATA Ошибка завершения backup для для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
exit
else
echo "$DATA Успешное завершение backup для базы ${DB_NAME}"
echo "$DATA Успешное завершение backup для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
fi
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
done
# шифруем и отправляем на ftp
DB_BASE=`sudo /bin/su postgres -c "/usr/bin/psql -qAt -c 'SELECT * FROM pg_database;'" | \
cut -d"|" -f1 | /bin/grep -v template | /bin/grep -v postgres`
#DB_BASE="demo test" #конкретные базы
#DB_BASE="" #пропустить
echo $DB_BASE
for DB_NAME in $DB_BASE
do
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# Записываем информацию в лог с секундами
echo "$DATA Копируем ftp backup базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
# Бэкапим базу данных demo и сразу сжимаем
echo "$DATA Копируем ftp backup базы ${DB_NAME}"
#echo $?
sudo /bin/su user -c "gpg -e -r mail@backup.com --cipher-algo AES256 \
-o $DIR_YANDEX/${DB_NAME}_$DATA_NAME.dump.gpg $BACKUP_DIR/${DB_NAME}_$DATA_NAME.dump" \
&& curl --upload-file $DIR_YANDEX/${DB_NAME}_$DATA_NAME.dump.gpg ftp://test:test@192.168.0.5 \
&& sudo /bin/su user -c "rm $DIR_YANDEX/${DB_NAME}_$DATA_NAME.dump.gpg"
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
echo "$DATA Ошибка копирования ftp backup для базы ${DB_NAME}"
echo "$DATA Ошибка копирования ftp backup для для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
exit
else
echo "$DATA Успешное завершение копирования ftp backup для базы ${DB_NAME}"
echo "$DATA Успешное завершение копирования ftp backup для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
fi
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
done
# делаем vacuum
DB_BASE=`sudo /bin/su postgres -c "/usr/bin/psql -qAt -c 'SELECT * FROM pg_database;'" | \
cut -d"|" -f1 | /bin/grep -v template | /bin/grep -v postgres`
#DB_BASE="demo test" #конкретные базы
#DB_BASE="" #пропустить
for DB_NAME in $DB_BASE
do
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
# Записываем информацию в лог с секундами
echo "$DATA Начало vacuum базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
# Бэкапим базу данных demo и сразу сжимаем
echo "$DATA Начало vacuum базы ${DB_NAME}"
sudo /bin/su postgres -c "/usr/bin/vacuumdb --analyze --full --quiet \
--username postgres --dbname=${DB_NAME}"
#echo $?
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
if [ $? -ne 0 ]
then
echo "$DATA Ошибка завершения vacuum для базы ${DB_NAME}"
echo "$DATA Ошибка завершения vacuum для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
exit
else
echo "$DATA Успешное завершение vacuum для базы ${DB_NAME}"
echo "$DATA Успешное завершение vacuum для базы ${DB_NAME}" >> $BACKUP_DIR/backup.log
fi
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
done
# запускаем сервер 1С
echo "Запускаем сервер 1С"
sudo systemctl start srv1cv83.service
echo "Состояние сервера 1С" >> $BACKUP_DIR/backup.log
sudo systemctl status srv1cv83.service | grep 'Active:' >> $BACKUP_DIR/backup.log
echo "--------------------------------------------------------------------" >> $BACKUP_DIR/backup.log
echo "Закончено"
# посылаем сообщение
sleep 2
#echo "backup" | mutt -s "backup" f2@vt.com -a $BACKUP_DIR/backup.log
Сохранить.
Однократный запуск:
$ sudo sh backup-sql.sh
Запуск по расписанию:
$ sudo -i
# crontab -e
Добавить в конец (сработает в 18:01):
# каждые день в 18.00
0 18 * * * sh /home/user/backup-sql.sh Сохранить.
Смотреть задания:
# crontab -l
Проверка backup
Посмотрим архивные копии:
$ ls /home/user/backup
backup.log demo_2019-02-02_17-42 demo_2019-02-02_18-00
#$ sudo /bin/su postgres -c "pg_dump -Fc demo" > /home/user/test/backup/demo
Создадим тестовую базу:
$ sudo /bin/su postgres -c "createdb --username postgres -T template0 demotest"
Расшифровать:
$ gpg -d -o demo_2019-02-18_16-35-06.dump.gz demo_2019-02-18_16-35-06.dump.gz.gpg
$ gunzip demo_2019-02-18_16-35-06.dump.gz
Восстановим указав резервную копию
$ sudo /bin/su postgres -c "pg_restore -d demotest /home/user/backup/demo_2019-02-18_16-35-06.dump"
к ней можно подключиться из 1С
Посмотреть список баз:
$ sudo /bin/su postgres -c "psql -l"
Размер базы demo
$ sudo su -c "psql -d demo -c \"select pg_size_pretty( pg_database_size('demo'))\"" postgres
Размер базы demotest
$ sudo su -c "psql -d demo -c \"select pg_size_pretty( pg_database_size('demotest'))\"" postgres
Размер базы demo
$ sudo su -c "psql -c \"select pg_size_pretty( pg_database_size('demo'))\"" postgres
Размер базы demotest
$ sudo su -c "psql -c \"select pg_size_pretty( pg_database_size('demotest'))\"" postgres
Удаление базы demotest
$ sudo /bin/su postgres -c "dropdb demotest"
Посмотреть список баз:
$ sudo /bin/su postgres -c "psql -l"
Комментариев нет:
Отправить комментарий