Часть 1. Ежедневный бэкап
Собственно скриптов будет два и они весьма просты. Один будет запускаться ежедневно, второй только - по понедельникам. Начнем с первого.
1.1. Находясь в корне системы мы создадим папку, куда будем собирать ежедневный бэкап. (в этой инструкции пропущен раздел по монтированию этой папки на USB устройство, возможно добавлю позже)
sudo mkdir /backup
1.2. В этой директории создадим файл с названием backup_ed.sh (ed - every day, ежедневно)
sudo touch /backup/backup_ed.sh
1.3. Откроем файл в редакторе
sudo nano /backup/backup_ed.sh
Прежде чем мы поместим что-то в этот файл здесь необходимо дать некоторые комментарии.
Обратите внимание на комментарии к переменным в самом начале файла. Вы можете изменить их под свои нужды.
В моем случае бэкапить нужно три базы данных MySQL и три директории с файлами.
Поехали! Вставим следующий текст:
#!/bin/bash
#
# backup all data by cron every day
# Stdout and Stderr redirects to log-file
#
# Example start - ./backup_ed.sh
#
### Переменные ###
log="/var/log/backup.log" # файл лога
old="7" # дней хранения бэкапов
mysql_user="root" # имя пользователя mysql
mysql_pass="o9djflkzx90k" # пароль пользователя mysql
db1="params" # имя базы данных1, которую будем сохранять
db2="joomla" # имя базы данных2, которую будем сохранять
db3="weewx" # имя базы данных3, которую будем сохранять
dir1="/media" # папка с файлами, где лежат картинки видеонаблюдения
dir2="/var/www" # папка со скриптами и веб-сервер
dir3="/home/pi/.node-red" # папка с данными Node-RED
echo -e "\n" >> $log 2>&1
echo -e "### Start section BACKUP EVERY DAY ###" >> $log 2>&1
starttime=`date +%s`
echo "Time: $(date)" >> $log 2>&1
### Удаляем старый бэкапы старше 7 дней из папки /backup ###
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'.tar.gz -d "$old day ago"` >> $log 2>&1
### Создаем пустой архив .tar, удаляем неполные файлы бэкапов ###
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar >> $log 2>&1
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar.gz >> $log 2>&1
sudo tar -cf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar -T /dev/null
### Создаем временную директорию для бэкапа MySQL ###
sudo mkdir -p /backup/mysql >> $log 2>&1
### Выполняем дамп баз данны и сохраняем в папку /backup ###
sudo mysqldump -u $mysql_user -p$mysql_pass $db1 --log-error $log > /backup/mysql/$db1-db.sql
sudo mysqldump -u $mysql_user -p$mysql_pass $db2 --log-error $log > /backup/mysql/$db2-db.sql
sudo mysqldump -u $mysql_user -p$mysql_pass $db3 --log-error $log > /backup/mysql/$db3-db.sql
### Добавляем другие директории к архиву tar ###
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar /backup/mysql/
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir1
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir2
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir3
### Сжимаем архив ###
sudo gzip /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar
echo "Archive size : " >> $log 2>&1
sudo ls -sh backup-`hostname`-`date '+%Y-%m-%d'`.tar.gz >> $log 2>&1
### Удаляем временную папку для MySQL ###
sudo rm -rf /backup/mysql >> $log 2>&1
### Пишем в лог о завершении ###
stoptime=`date +%s`
duration=`expr ${stoptime} - ${starttime}`
echo "Stop time: $(date)" >> $log 2>&1
echo "Duration is `date +%H:%M:%S -ud @${duration}`" >> $log 2>&1
echo -e "### Stop section BACKUP EVERY DAY ###" >> $log 2>&1
Сохраняем файл Ctrl+X
1.4. Делаем этот файл исполняемым при помощи команды
sudo chmod 755 /backup/backup_ed.sh
1.5.Осталось добавить автозапуск бэкапа ежедневно в 3:30. Для этого выполните команду
sudo crontab -e
и вставьте в конец файла следующую строку
30 3 * * * /backup/backup_ed.sh > /dev/null 2>&1 # Run backup everyday at 3:30
Сохраните Сtrl+X
Готово. Теперь в нашей директории /backup будет накапливаться архив ежедневного бэкапа. За 7 ночей будет накоплено 7 файлов.
В моем случае, каждый ежедневный архив занимает от 60 до 100 МБ.
В файле /var/log/backup.log сохраняется информация о ежедневном бэкапе. Конечно, лог будет расти, поэтому его необходимо делать rotate, но об этом в другой раз.