понедельник, 18 февраля 2019 г.

Скрипт бэкапа postgres pg_dump


Скрипт бэкапа 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"

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

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