Вопросы:Автоматизация процесса резервирования БД

Материал из Юпитер-8

Создание резервной копии БД в ОС Windows

Создание резервной копии с использованием командного файла

1. Создайте командный файл

1.1. Создайте и откройте текстовый документ. В меню файл выберите Сохранить как

1.2 В диалоговом окне Сохранить как укажите имя файла и расширение bat (Например start_backup.bat). Нажмите Сохранить

1.3 В результате получится командный файл с расширением bat

2. Откройте файл для редактирования

3. Добавьте в командный файл следующий текст:

REM Пример создание резервной копии базы данных POSTGRESQL
CLS
ECHO OFF
Chcp 65001
REM Установка переменных окружения
SET PGBIN=C:\PostgreSQL\9.6\bin
SET PGDATABASE=jupiter
SET PGHOST=localhost
SET PGPORT=5432
SET PGUSER=postgres
SET PGPASSWORD=postgres
REM Смена диска и переход в папку из которой запущен bat-файл
%~d0
CD %~dp0
REM Формирование имени файла резервной копии и файла-отчета
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
SET DUMPFILE=%PGDATABASE% %DATETIME%.backup
SET LOGFILE=%PGDATABASE% %DATETIME%.log
SET DUMPPATH="Backup\%DUMPFILE%"
SET LOGPATH="Backup\%LOGFILE%"
REM Создание резервной копии
IF NOT EXIST Backup MD Backup
CALL "%PGBIN%\pg_dump.exe" --format=custom --verbose --file=%DUMPPATH% 2>%LOGPATH%
REM Анализ кода завершения
IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull
REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
:Error
DEL %DUMPPATH%
MSG * "Error. See backup.log."
ECHO %DATETIME% Error backup postgresql %DUMPFILE%. See %LOGFILE%. >> backup.log
GOTO End
REM В случае удачного резервного копирования просто делается запись в журнал
:Successfull
ECHO %DATETIME% OK backup %DUMPFILE% >> backup.log
GOTO End
:End

SET PGBIN=C:\PostgreSQL\9.6\bin - указывается путь к pg_dump
SET PGDATABASE=jupiter - название базы данных
SET PGHOST=localhost - расположение базы данных
SET PGPORT=5432 - порт для подключения к базе
SET PGUSER=postgres - имя пользователя
SET PGPASSWORD=postgres - пароль для данной базы данных
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2% - задание имени backup (содержит имя, дату и время создания backup)
SET DUMPFILE=%PGDATABASE% %DATETIME%.backup - расширение файла backup
SET LOGFILE=%PGDATABASE% %DATETIME%.log - запись лога (что копировалось)
SET DUMPPATH="Backup\%DUMPFILE%" - указывается путь, куда сохранить backup базы данных
SET LOGPATH="Backup\%LOGFILE%" - указывается путь, куда сохранить лог файл
CALL "%PGBIN%\pg_dump.exe" --format=custom --verbose --file=%DUMPPATH% 2>%LOGPATH% - настройка метода сжатия базы данных при backup
--format=custom - вывести копию в архивном формате
--verbose - включить подробный режим. pg_dump будет выводить в стандартный поток ошибок подробные комментарии к объектам, включая время начала и окончания выгрузки, а также сообщения о прогрессе выполнения
--file=%DUMPPATH% 2>%LOGPATH% - отправить вывод в указанный файл
ECHO %DATETIME% OK backup %DUMPFILE% >> backup.log - дописывает данные в существующий файл. Таким образом можно вести журнал с подробными сведениями о результатах резервного копирования

4. Сохраните файл
Таким образом командный файл создан и после его исполнения, будет сохраняться резервная копия схемы данных, в указанную папку


В начало статьи

Добавление командного файла в планировщик заданий

1. Для автоматического запуска командного файла в нужное время, необходимо запустить Планировщик заданий (Пуск-Программы-Стандартные-Служебные-Планировщик Заданий)

Или запустить планировщик заданий Windows из окна «Выполнить»:

Нажмите клавиши Windows + R на клавиатуре
В появившемся окне введите taskschd.msc
Нажмите Ok или Enter

2. Выбираем пункт «Создать простую задачу»

3. Вводим Имя задачи и нажимаем Далее

4. Выбираем как часто запускать задачу и нажимаем Далее

5. Укажите время выполнения задания. Время выполнения необходимо выбирать исходя из минимальной активности объектов и минимальной загруженности серверного компьютера.
Обычно это ночное время с 1.00 до 5.00 утра.
Укажите как часто его необходимо выполнять
Нажмите Далее

6. Выбираем действие для задачи и нажимаем Далее

7. Выберите командный файл резервирования созданный ранее, нажав кнопку Обзор, после чего нажимаем Далее

8. Установите флажок и нажмите Готово

9. Установить флажок Выполнять только для зарегистрированного пользователя и Выполнять с наивысшими правами

10. Перейти во складку Условия и убрать галочку Запускать только при питании от электросети

11. Нажать ОК


В начало статьи

Удаление старых резервных копий с использованием командного файла

Ежедневные бэкапы со временем занимают очень много пространства на жестком диске

Можно чистить вручную, но лучше автоматически

Решается этот вопрос также созданием bat-файла и задачи в планировщике заданий Windows

Содержимое bat-файла такое:

forfiles /p "C:\Users\Nikolay Sherstnev\Desktop\Backup\Backup" /S /D -5 /C "cmd /c del /f /a /q @file" - Здесь указана команда при выполнении которой будут удаляться файлы старше 5 дней

В планировщике заданий можно создать задачу на исполнения этого bat-файла раз в неделю
В начало статьи

Создание резервной копии БД в ОС Linux

!!!ВНИМАНИЕ!!!
В случае, когда для проверки запуска PostgreSQL, был использован наш скрипт, в дальнейшем команда start/stop/restart для smpo-server будет иметь вид:

service smpo-server start/stop/restart

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

Скрипт необходимо запускать от пользователя postgres

Создание файла скрипта

Создаем файл под root

1. Создадим файл

touch /etc/pgsql-backup.sh

2. Откроем файл для редактирования

vi /etc/pgsql-backup.sh

или

nano /etc/pgsql-backup.sh

3. Запишем текст скрипта

<syntaxhighlight lang=shell>#!/bin/bash
USER=postgres
PASS=postgres
KEEP=14
DIR=/etc/backup
PGPASSWORD=$PASS
export PGPASSWORD
NOW=$(date +"%Y-%m-%d")
DBS="$(psql -U $USER -lt | awk '{print $1}' |grep -vE '^\||^-|^List|^Name|template[0|1]|postgres')"
for db in $DBS
  do
    BACKUPS=`find $DIR -name $db.*.gz |wc -l|sed 's/\ //g'`
    while [ $BACKUPS -ge $KEEP ]
      do
       ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
       BACKUPS=`expr $BACKUPS - 1`
      done
    FILE=$DIR/$db.$NOW-$(date +"%H"-"%M")
    pg_dump --column-inserts --attribute-inserts -U $USER -Fc $db | gzip -c > $FILE.gz
  done
PGPASSWORD=
export PGPASSWORD
exit 0
</syntaxhighlight>

USER=postgres - Имя пользователя
PASS=postgres - Пароль для доступа к базе данных
KEEP=14 - Количество бэкапов, которое требуется сохранять
DIR=/etc/backup - Каталог, куда сохранять бэкапы

4. Сохраним его
5. Дадим права на выполнение

chmod +x /etc/pgsql-backup.sh

6. Создадим каталог, куда будет делаться backup

 mkdir /etc/backup

7. При выполнении скрипта будет сохраняться резервная копия схемы данных в указанный каталог

Изменим владельца для папки backup на postgres

chown postgres /etc/backup

Запуск скрипта

1. Заходим под postgres

su postgres

2. Выполняем скрипт

/etc/pgsql-backup.sh

После выполнения скрипта резервная копия сохранилась в папку:

/etc/backup

Ошибки при выполнении скрипта

/bin/sh^M: bad interpreter: No such file or directory
/bin/sh^M: плохой интерпретатор: Нет такого файла или каталога

Суть проблемы в том, что под на платформе Windows редакторы добавляют символ «возврата каретки» CR/LF. Не все редакторы под Linux виндовый перенос строки умеют отображать, но он там есть, о чем свидетельствует сообщение об ошибке.

Удаляем возврат каретки с использованием tr:

<syntaxhighlight lang=shell>cat name_old.sh | tr -d '\r' > name_new.sh</syntaxhighlight>


В начало статьи

Добавление скрипта в планировщик cron

1. Для автоматического запуска скрипта в нужное время, необходимо запустить Планировщик cron
Так как данный скрипт нужно выполнять под пользователем postgres, то переключаемся на него:

su postgres

Чтобы создать или изменить пользовательское расписание наберите команду:

crontab -e

При первом запуске утилита предложит выбрать редактор, рекомендуем выбирать mcedit (требует установленного mc), либо другой редактор
2. Формат строк расписания имеет вид:

минута час день месяц день_недели команда

Минута - время в минутах от 0 до 59
Час - от 0 до 23
День - день месяца от 1 до 31
Месяц - от 1 до 12 либо буквенные обозначения jan - dec
День недели - от 0 до 6 (0 - воскресенье) или sat - sun
Команда - строка в формате командного интерпретатора которая будет исполнена, допускается запись типа команда1 && команда2 для запуска нескольких команд подряд.

Значения минут, часов, дней можно указывать следующим образом:
Значение - число обозначающее дату или время, допускается подстановочный знак * допускающий полный диапазон значений
Несколько значений - допускается указывать несколько значений через запятую, например 2,14,22
Диапазон значений - указывается через дефис, например 2-10
Шаг значений - указывается через дробь, в знаменатель которой ставится шаг, например */3 - каждое третье значение 0, 3, 6, 9 и т.д. В качестве числителя должен быть диапазон значений либо звездочка.

Пример:

 0 8-19/2 * * 1 /etc/pgsql-backup.sh

Она означает что каждый второй час с 8 до 19 (8, 10,12,14,16) по понедельникам запускать скрипт

при указании периодического исполнения все даты должны быть указаны явно, звездочка обозначает полный диапазон значений, а не их отсутствие.

Кроме даты можно использовать ряд специальных строк:

  • @reboot - выполнять команду при перезагрузке
  • @yearly или @annually - выполнять 1 января, аналогично записи: "0 0 1 1 * "
  • @monthly - выполнять 1 числа каждого месяца, аналогично "0 0 1 * * "
  • @weekly - выполнять каждое воскресенье, равносильно "0 0 * * 0"
  • @daily или @midnight - ежедневно в полночь,"0 0 * * * "
  • @hourly - раз в час, "0 * * * * "

3. Так для ежедневного исполнения нашего скрипта каждую полночь можно написать:

@midnight /etc/pgsql-backup.sh

4. Завершив составление расписания сохраняем файл и выходим из редактора. Пользовательское расписание будет сохранено в /var/spool/cron/crontabs под именем текущего пользователя.

5. Для системных и административных задач предусмотрен файл /etc/crontab синтаксис записей в нем отличается наличием дополнительного значения - пользователя, от чьего имени будет запущено задание:

минута час день месяц день_недели пользователь команда

Пример такой записи:

0 19 * * 1-5 root /etc/pgsql-backup.sh

Согласно которой в 19:00 с понедельника по пятницу будет запускаться скрипт /etc/pgsql-backup.sh от имени пользователя root


В начало статьи

Восстановление данных из резервной копии

su postgres
pg_restore -d jupiter jupiter.dump

pg_restore - восстановить базу данных PostgreSQL из файла архива, созданного командой pg_dump
Она выполняет команды, необходимые для восстановления того состояния базы данных, в котором база была сохранена.
Где:

-d jupiter - Подключиться к базе данных имя_базы и восстановить данные непосредственно в неё.
jupiter.dump - название файла из которого восстанавливаем

Одной командой восстановление:

zcat jupiter.gz | psql jupiter


В начало статьи

Сторонние программы для создания резервной копии БД

PostgreSQL backups

https://postgresql-backup.com/

Описание программы:

https://postgresql-backup.com/thankyou/?t=i&g=fda13c8b-83d2-49a6-98ec-40204d9c23d1


В начало статьи