6.3.7 Автоматическое резервное копирование

Automatic backup banner

Существует необходимость создавать резервную копию директории согласно графику и хранить ее на внешнем хранилище?

Это можно весьма просто выполнить используя KeepData в качестве удаленного облачного хранилища. Более того, такой процесс можно полностью автоматизировать.

Решение отличается в зависимости от ОС, но общий алгоритм состоит в запуске исполняемого файла по назначенному расписанию. Давайте разберем на примерах.

Создание бэкапов в Windows

В ОС Windows подобное реализуемо с помощью исполняемого файла в формате .bat и планировщика задач Windows.

Рассмотрим пошаговую инструкцию:

1. Для корректного исполнения будущего .bat-файла, нам понадобится скачать и установить программу WinSCP. Сделать это можно на их официальном сайте. Выполнять какие-либо действия в самой программе при этом не понадобится.

2. Создайте новый текстовый файл в любой удобной локации. Это и будет наш новый скрипт для резервного копирования.

3. Самый важный шаг – наполнение скрипта. Ниже представлен пример с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:

backup.bat

@echo off

"C:\Program Files (x86)\WinSCP\WinSCP.exe" ^
  /ini=nul ^
  /command ^
    "open ftp://login:password@server.keepdata.thehost.ua/" ^
    "lcd C:\Folder\Work" ^
    "cd /backups-work/" ^
    "mkdir %%TIMESTAMP#yyyy-mm-dd%%" ^
    "cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^
    "put File1" ^
    "lcd C:\" ^
    "put Folder2" ^
    "lcd C:\Users\User" ^
    "put File3" ^
    "exit"

set WINSCP_RESULT=%ERRORLEVEL%
if %WINSCP_RESULT% equ 0 (
  echo Success
) else (
  echo Error
)

exit /b %WINSCP_RESULT%

Теперь, к пояснениям:

  • "C:\Program Files (x86)\WinSCP\WinSCP.exe" ^ – укажите путь к .exe файлу WinSCP. В примере указан путь при стандартной установке.
  • "open ftp://login:password@server.keepdata.thehost.ua/" ^ – эта строка выполняет подключения к Вашему Облачному хранилищу. Здесь необходимо указать логин, пароль и сервер подключения. Все эти данные Вы можете узнать в Письме об открытии услуги.
  • "lcd C:\Folder\Work" ^ – эта команда переходит по выделенному пути на локальном ПК.
  • "cd /backups-work/" ^ – эта команда переходит по выделенному пути на Вашем Облачном хранилище.
  • "mkdir %%TIMESTAMP#yyyy-mm-dd%%" ^ – создает директорию в KeepData с названием в формате год-месяц-день.
  • "cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^ – переходит в указанную директорию.
  • "put File1" ^ – загружает в эту директорию файл File1 с текущего местоположения на локальном ПК (D:\Folder\Work в этом примере).
  • "lcd C:\" ^ – переходит по новому пути на локальном ПК.
  • "put Folder2" ^ – загружает папку File2 и все ее содержимое из нового пути на Облачное хранилище.
  • "lcd C:\Users\User" ^ – переходит по новому пути на локальном ПК.
  • "put File3" ^ – загружает файл File3 из нового пути на Облачное хранилище.

Важно: в Windows для разделения директорий используется символ \, в Linux же – /. Облачное хранилище построено именно на архитектуре Linux. Учтите это при редактировании пользовательского скрипта

Таким образом, мы получили скрипт, который подключается к KeepData, создает в указанной директории новую папку и загружает в нее три файла из разных местоположений на локальном ПК. Созданная папка будет иметь имя аналогичное времении ее создания, что облегчит дальнейшую работу с имеющимися резервными копиями. При необходимости, указанный скрипт можно отредактировать под Ваши нужды.

4. Сохраняем наш текстовый файл в формате .bat. Для этого нужно в файловом редакторе вместо Сохранить нажать Сохранить как. При сохранении выбираем Все файлы и указываем полное имя файла, вместе с форматом .bat в конце:

Текстовый редактор, сохранить как

Теперь у нас есть написанный скрипт, который выполняет резервное копирование. Как этот процесс автоматизировать? В этом нам поможет Планировщик задач Windows.

5. Открываем Планировщик задач с помощью меню Пуск или альтернативным способом – нажав Win + R и выполнив taskschd.msc:

Планировщик задач, запуск

6. Правым кликом мыши по Библиотека планировщика заданий открываем контектное меню и нажимаем Создать задачу:

Планировщик задач, Создать задачу

7. Переходим в подменю Триггеры и нажимаем Создать. В открытой форме указываем по какому расписанию необходимо выполняться задаче. Например, каждый день в 12:00:

Планировщик задач, Триггеры

8. Аналогично переходим в подменю Действия и снова нажимаем Создать. В открытой форме выбираем Запуск программы и указываем путь к нашему скрипту, в ручную или с помощью кнопки Обзор:

Планировщик задач, Действия

Совет: в подменю Условия и Параметры можно дополнительно настроить Вашу задачу, например, разрешить ей запускаться только при подключении к определенной сети.

9. Задание создано. Оно будет выполняться согласно указанному расписанию. Крайне желательно сразу же протестировать его выполнение с помощью ручного запуска – кликнув на задание правой кнопкой мыши и нажав Выполнить. В случае, если тестовое выполнение закончилось безуспешно – обратитесь в нашу Службу поддержки предоставив максимум информации, включая текст Вашего скрипта.

Создание бэкапов в Linux

В Linux процесс аналогичен, с поправкой на инструментарий и завимости ОС. Также, скриптов для выполнения бэкапа будет два – для непосредственно файлов и для баз данных.

Зависимостью для работы исполняемого файла создания бэкапа в Linux является консольный FTP-клиент LFTP.

Давайте рассмотрим инструкцию по настройке с помощью пошагового примера:

1. Установите LFTP.

  • Установить в Ubuntu/Debian можно так:
sudo apt update
sudo apt install lftp
  • В CentOS/AlmaLinux/RockyLinux:
sudo yum install lftp

2. В Linux нам понадобится два скрипта – для резервирования определенных директорий и для резервирования определенных баз данных. В нашем примере они называются backup-dir.sh и backup-mysql.sh, их создани посвящены шаги 3 и 4 этой инструкции. Если Вам необходим только один – создавайте только один. Создание будущих исполняемых файлов в формате .sh в нужной директории выполняется так:

touch backup-dir.sh
touch backup-mysql.sh

3. Начнем со скрипта который резервирует файлы нужной директории, в этом примере он носит название backup-dir.sh. Откроем его любым текстовым редаткором, к примеру с помощью nano backup-dir.sh. Ниже представлен пример скрипта с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:

backup-dir.sh
#!/bin/bash
echo "Directory Backuper by TheHost"

#Определение переменных и параметров доступа к FTP-серверу
TMP_PATH="/tmp"
BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"

#Создание новой резервной копии локально, во временной директории
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DIR_BACKUP-$DATE"
cd $TMP_PATH/DIR_BACKUP-$DATE
GZIPFILE="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPFILE... "
tar -czf $GZIPFILE $BACKUP_DIRS && echo "OK" || echo -e "Failed!\a"

#Загрузка созданного архива на FTP-хранилище
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPFILE; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi

#Удаление временной директории
cd $TMP_PATH
rm -rf $TMP_PATH/DIR_BACKUP-$DATE

echo "Done."
exit 0

Несмотря на громоздкий вид скрипта, модифицировать в нем необходимо совсем немного. А именно:

  • TMP_PATH="/tmp" – устанавливает временную директорию для хранения созданной резервной копии перед ее загрузкой на удаленный сервер. Можно оставить стандартное значением /tmp.
  • BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3" – какие именно директории будут резервироваться в архив. Можно указать одну.
  • FTP_HOST="ftp://server.keepdata.thehost.ua" – адрес Вашего Облачного хранилища.
  • FTP_USER="ftp_user" – FTP-пользователь Вашего Облачного хранилища.
  • FTP_PASS="ftp_password" – пароль FTP-пользователя Вашего Облачного хранилища.

Такой скрипт будет при запуске создавать архив в формате .tgz директорий указанных в BACKUP_DIRS=, сохранять их в TMP_PATH= локально и затем пытаться закгрузить архив на удаленнное FTP-хранилище, в им же созданную директорию с названием в виде текущей даты. В случае успешного выполнения, он удалит локальную копию архива. После редактирования скрипта, сохраните файл, обязательно в формате .sh.

4. Теперь редактируем скрипт для баз данных, у нас в примере это backup-mysql.sh. Откроем его любым текстовым редаткором, к примеру с помощью nano backup-mysql.sh. Ниже представлен пример скрипта с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:

backup-mysql.sh
#!/bin/bash
echo "Database Backuper by TheHost"

#Определение переменных и параметров доступа
DATABASES='database1 database2 database3'
TMP_PATH="/tmp"
BACKUP_USER="mysql_user"
BACKUP_PASS="mysql_password"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"

#Создание нового бэкапа
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DB_BACKUP-$DATE"
cd $TMP_PATH/DB_BACKUP-$DATE
for DB in $DATABASES; do
  echo -n "Dumping $DB... "
  mysqldump -E -R -u"$BACKUP_USER" -p"$BACKUP_PASS" $DB > noc-$DATE_TIME.$DB.sql && echo "OK" || echo -e "Failed!\a"
done
GZIPDB="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPDB... "
tar -czf $GZIPDB --remove-files backup-$DATE_TIME.*.sql && echo "OK" || echo -e "Failed!\a"

#Загрузка бэкапа на удаленный сервер
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPDB; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi

#Удаление временной директории
cd $TMP_PATH
rm -rf $TMP_PATH/DB_BACKUP-$DATE

echo "Done."
exit 0

Пояснения:

  • DATABASES='database1 database2 database3 – список баз данных, которые будет затрагивать задание. Указывать через пробел.
  • TMP_PATH="/tmp" – устанавливает временную директорию для хранения созданной резервной копии перед ее загрузкой на удаленный сервер. Можно оставить стандартное значением /tmp.
  • BACKUP_USER="mysql_user" – пользователь для входа в MySQL.
  • BACKUP_PASS="mysql_password" – пароль указанного пользователя.
  • FTP_HOST="ftp://server.keepdata.thehost.ua" – адрес Вашего Облачного хранилища.
  • FTP_USER="ftp_user" – FTP-пользователь Вашего Облачного хранилища.
  • FTP_PASS="ftp_password" – пароль FTP-пользователя Вашего Облачного хранилища.

Такой скрипт будет при запуске создавать дампы баз данных DATABASES= и сжимать их в архив в формате .tgz, сохранять его в TMP_PATH= локально и затем пытаться загрузить его на удаленнное FTP-хранилище, в им же созданную директорию с названием в виде текущей даты. В случае успешного выполнения, он удалит локальную копию архива. После редактирования скрипта, сохраните файл, обязательно в формате .sh.

5. Предоставьте скриптам права на выполнение:

chmod +x /path/to/backup-dir.sh
chmod +x /path/to/backup-mysql.sh

Где /path/to/ замените путями к созданным скриптам.

6. Скрипты созданы, осталось автоматизировать их выполнения. Для этого мы используем CRON-задание.

Откройте файл crontab с помощью команды:

crontab -e

Добавьте новые задания на выполнения Ваших скриптов. К примеру:

30 3 * * * /path/to/backup-dir.sh
30 3 * * * /path/to/backup-mysql.sh

Замените /path/to/ путями к созданным скриптам, после чего сохраните файл. Предоставленные примеры будут выполняться ежедневно, в 3:30 ночи.

Совет: ознакомиться с возможностями CRON для настройки пользовательских заданий можно в соответствующей инструкции.

7. Готово! Скрипты созданы и отредактированы с Вашими данными, CRON-задание на их выполнение уже ожидает необходимой даты. Советуем также выполнить скрипт мануально для тестирования. Это можно сделать следующей командой:

./path/to/backup-dir.sh

Где /path/to/ замените путем к скрипту. Если тест оказался успешен, значит Вами все было настроено верно. Если же желаемый результат не был достигнут – обратитесь в нашу Службу поддержки предоставив максимум информации, включая содержимое Ваших скриптов.