Элементарный Bash скрипт для резервного копирования данных
Привет хабралюди, сейчас я расскажу как можно немного автоматизировать рутиную работу по подготовке бэкапов.
В данном случае, мы не будем использовать мощные программы, или даже целые системы для резервного копирования данных, ограничимся самым доступным что у нас есть. А именно — Bash скриптом.
Что должен выполнять наш скрипт?
Бэкапить веб проект, а именно:
— Делать резервную копию базы MySQL.
— Делать резервную копию файлов.
— Структурировать это.
#!/bin/bash
PROJNAME= #Имя проекта
CHARSET= #Кодировка базы данных (utf8)
DBNAME= #Имя базы данных для резервного копирования
DBFILENAME= #Имя дампа базы данных
ARFILENAME= #Имя архива с файлами
HOST= #Хост MySQL
USER= #Имя пользователя базы данных
PASSWD= #Пароль от базы данных
DATADIR= #Путь к каталогу где будут храниться резервные копии
SRCFILES= #Путь к каталогу файлов для архивирования
PREFIX=`date +%F` #Префикс по дате для структурирования резервных копий
#start backup
echo «[———————————[`date +%F—%H-%M`]———————————]»
echo «[———-][`date +%F—%H-%M`] Run the backup script. »
mkdir $DATADIR/$PREFIX 2> /dev/null
echo «[++———][`date +%F—%H-%M`] Generate a database backup. »
#MySQL dump
mysqldump —user=$USER —host=$HOST —password=$PASSWD —default-character-set=$CHARSET $DBNAME > $DATADIR/$PREFIX/$DBFILENAME-`date +%F—%H-%M`.sql
if [[ $? -gt 0 ]];then
echo «[++———][`date +%F—%H-%M`] Aborted. Generate database backup failed.»
exit 1
fi
echo «[++++——][`date +%F—%H-%M`] Backup database [$DBNAME] — successfull.»
echo «[++++++—-][`date +%F—%H-%M`] Copy the source code project [$PROJNAME]. »
#Src dump
tar -czpf $DATADIR/$PREFIX/$ARFILENAME-`date +%F—%H-%M`.tar.gz $SRCFILES 2> /dev/null
if [[ $? -gt 0 ]];then
echo «[++++++—-][`date +%F—%H-%M`] Aborted. Copying the source code failed.»
exit 1
fi
echo «[++++++++—][`date +%F—%H-%M`] Copy the source code project [$PROJNAME] successfull.»
echo «[+++++++++-][`date +%F—%H-%M`] Stat datadir space (USED): `du -h $DATADIR | tail -n1`»
echo «[+++++++++-][`date +%F—%H-%M`] Free HDD space: `df -h /home|tail -n1|awk »`»
echo «[++++++++++][`date +%F—%H-%M`] All operations completed successfully!»
exit 0
Запускать можно парой способов:
— Простой запуск: ./backup.sh
— Запуск + запись в лог: ./backup.sh | tee backup.log
— а еще его можно в cron запихать: 00 20 * * 7 root sh /home/bond/backup.sh | tee /home/bond/backup/backup.log
После успешного завершения скрипта, мы увидим следующее:
bond@serv:~$ sudo sh backup.sh
[———————————[2009-02-14—12-28]———————————]
[———-][2009-02-14—12-28] Run the backup script.
[++———][2009-02-14—12-28] Generate a database backup.
[++++——][2009-02-14—12-29] Backup database [images] — successfull.
[++++++—-][2009-02-14—12-29] Copy the source code project [itmages].
[++++++++—][2009-02-14—12-29] Copy the source code project [itmages] — successfull.
[+++++++++-][2009-02-14—12-29] Stat datadir space (USED): 1,3G /home/bond/backup
[+++++++++-][2009-02-14—12-29] Free HDD space: 49G
[++++++++++][2009-02-14—12-29] All operations completed successfully!
bond@serv:~$
В итоге наши бэкапы складываются в каталог который вы указали, + резервные копии лежат в каталогах именованых по дате.
п.с. спасибо opkdx за хинт при написании.
Пример скрипта для создания резервной копии файлового сервера
Обновлено: 19.06.2023 Опубликовано: 24.05.2022
- Ежедневная актуализация данных в каталоге резервный копий daily.
- Еженедельная актуализация данных в каталоге резервный копий weekly.
- Создание полного архива с данными раз в 30 дней.
- Старые архивы (которым более 370 дней) будут удаляться.
Пример скрипта
Скрипт будет сравнивать файлы в рабочем каталоге и папке резервного копирования с помощью rsync. Это позволит нам сэкономить на времени выполнения задания. Долго будет выполняться только задание создания архива с помощью tar.
Создаем каталог для скриптов и сам скрипт:
- #!/bin/bash
- PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
- source=»/data»
- destination_root=»/backup»
- fdate=$(date +%Y-%m-%d)
- # Clean old archives
- find $/archive -type f -name «*.tar.gz» -ctime +370 -exec rm -R <> \; 2>&1
- # Daily
- rsync -a —partial —inplace —append —delete-after $/ $/daily/
- # Weekly
- if [[ $(date +%u) -eq 0 ]]
- then
- rsync -a —partial —inplace —append —delete-after $/ $/weekly/
- fi
- # Archive
- count_last_archives=$(find $/archive/ -name «*.tar.gz» -mtime -30 | wc -l)
- if [[ $count_last_archives -eq 0 ]]
- then
- cd $
- tar zcf $/archive/samba_$.tar.gz ./*
- fi
Задаем права скрипту на выполнение:
chmod +x /scripts/samba_backup.sh
Описание скрипта
Опишем значимые строки нашего скрипта:
1 | Указываем на путь к интерпретатору. |
2 | Задаем системные переменные, чтобы не пришлось в скрипте прописывать полные пути до исполняемых файлов. |
4 — 6 | Задаем переменные. |
4 | Каталог и рабочими данными, которые нужно резервировать. |
5 | Корневая папка, где нужно хранить резервные копии. |
6 | Дата, когда запускается скрипт. Используется для |
9 | Поиск и удаление всех архивов, которым более 370 дней. |
11 — 18 | Синхронизация данных с помощью rsync |
12 | Выполнение синхронизации данных в каталог daily. |
15 | Задаем условие. Номер дня недели должен равняться 0 (воскресенье). Если это так, то будет выполнена строка 17. |
17 | Выполнение синхронизации данных в каталог weekly. |
20 — 26 | Создание архива. |
21 | Получим количество файлов с архивами, которым меньше 30 дней и сохраним результат в переменную count_last_archives. |
22 | Проверяем условие, равна ли переменная count_last_archives нулю. На практике это значит, что за последние 30 дней у нас нет ни одного архива. Если это так, то выполняем строки 24 — 25. |
24 | Переходим внутрь каталога с рабочими данными. Это нужно для того, чтобы наш архив создавался относительно не корня, а рабочего каталога. Так удобнее при восстановлении данных. |
25 | С помощью утилиты tar мы архивируем все данные и создаем архив в каталоге archive. В название архива добавляем дату его создания. |
Подготовка системы
Создаем каталоги, в которых будут храниться резервные копии:
В нашем примере, это три каталога, относительно, папки /backup:
- daily — ежедневные копии. Для быстрого восстановления.
- weekly — еженедельные. На случай, если ежедневный бэкап успел стереть важные данные.
- archive — архивы на крайний случай.
Наша система готова к созданию резервных копий.
Сохранение данных на удаленном компьютере
Резервные копии необходимо создавать на удаленном компьютере или внешнем диске, чтобы они были доступны при выходе из строя сервера. Предположим, у нас используется общая папка на удаленном сервере, в которой будут размещаться файлы с backup.
Чтобы упростить процесс монтирования сетевой папки, откроем на редактирование следующий файл:
//192.168.0.1/backup /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0
* в данном примере выполняется монтирование общей папки backup на сервере с IP-адресом 192.168.0.1 в каталог /mnt. В качестве сетевой файловой системы используется cifs (протокол SMB: сервер samba или общая папка Windows). Параметры для подключения — user: позволяет выполнить монтирование любому пользователю, rw: с правом на чтение и запись, noauto: не монтировать автоматически при старте системы, credentials: файл, в котором написаны логин и пароль для подключения к общей папке.
Теперь создадим файл с логином и паролем:
и приведем его к следующему виду:
* где username: имя пользователя, password: пароль. Само собой, в вашем случае указываются свои данные.
Устанавливаем пакет cifs-utils, позволяющий в Linux монтировать smb-шары. В зависимости от типа Linux, команды будут немного различаться.
а) Deb (Ubuntu / Debian, Astra Linux):
б) RPM (Rocky Linux / РЕД ОС / CentOS):
Теперь введите следующую команду:
Должна примонтировать сетевая папка //192.168.0.1/backup. Это можно проверить следующей командой:
Подробнее про монтирование сетевых папок читайте в инструкции Как в Linux монтировать шару CIFS.
Автоматический запуск по расписанию
Создадим правило в cron для автоматического запуска нашего скрипта. Выполняем команду:
0 3 * * * /scripts/samba_backup.sh
* в данном примере мы будем запускать резервирование каждый день в 3 часа ночи.