Темы резервного копирования MySQL я уже касался где-то здесь.
Как и в прошлый раз, вся суматоха с MySQL началась из-за тестирования новой версии шлюза удалённых рабочих столов Apache Guacamole. Постоянно забивая базу данных историей неудачных входов, множа сущности пользователей и подключений, я начинал путаться в буреломе многочисленных настроек приложения. В конце концов, мне приходилось восстанавливать базу данных guacamole_db до первозданного или близкого к нему состояния.
Кстати, если кому-то нужен дамп пустой базы для Apache Guacamole — забирайте.
По началу дампирование и восстановление базы проводились стандартными командами, но потом количество задач расширялось (вместе с количеством файлов дампа) и, в конечном итоге, мной были сформированы два bash-скрипта: для создания резервной копии и для её восстановления.
Сначала про скрипт создания дампа. Скачать его можно с моего сайта прямо из терминала операционной системы командой:
sudo wget -P /scripts https://ngdream.ru/sqlbackup.sh
Утилита wget создаст папку scripts и скачает туда скрипт sqlbackup.sh. Так как папка scripts будет создаваться в корне файловой системы — необходимо использование утилиты sudo. Да, и в целом при работе скрипта не обойтись без повышенных прав доступа.
Здесь я описал принцип входа в систему под пользователем root в ОС Linux Ubuntu.
Конечно, чтобы скрипт понял, что от него хотят, необходимо его подредактировать, внеся свои данные в переменные. Открываем скрипт с помощью редактора nano:
sudo nano /scripts/sqlbackup.sh
Если всё сделано правильно — перед Вами предстанет во всей красе код скрипта:
#!/bin/bash # sudo chmod +x /scripts/sqlbackup.sh user="root" pass="password" db="dbname" dir="/sqlbackup" date=$(date +"%Y-%m-%d-%H-%M-%S") dumpname=$dir/$date.sql.gz echo "$db backuping..." if [ ! -d "$dir" ]; then mkdir $dir; fi sudo mysqldump --user=$user --password=$pass $db | gzip > $dumpname find $dir -type f -name "*.gz" -mtime +60 -delete echo "$db backuping complete!"
Чтобы настроить скрипт под Вашу базу, в коде нужно заменить значения переменных user, pass и db. Переменной user присваивается имя пользователя с правами доступа к базе, в pass прописывается пароль, а в db указывается имя базы данных. Сохраняем изменения (Ctrl+O, Enter) и выходим (Ctrl+X) из nano.
Я добавил в оба скрипта в виде комментария (вторая строка скрипта) команду для присвоения исполняемых прав.
Сообщаем системе, что скрипт является исполняемым:
sudo chmod +x /scripts/sqlbackup.sh
Скрипт sqlbackup.sh умеет аккуратно укладывать дамп в gz-архив и удалять резервные копии, которым исполнилось больше 60 дней. Само собой, параметр -mtime +60 можете заменить на любой нужный период.
Теперь про скрипт восстановления sqlrestore.sh. Он ищет в директории /sqlrestore файл дампа с названием целевой базы данных и запускает восстановление. Если нужного файла нет — скрипт завершает свою работу. Можно создать коллекцию скриптов для восстановления, переназвать их в соответствии с базами и начать жонглировать восстановлениями в своё удовольствие.
Скачать скрипт можно вот так:
sudo wget -P /scripts https://ngdream.ru/sqlrestore.sh
Как отредактировать скрипт с помощью редактора nano я описывал чуть выше. Содержимое скрипта sqlrestore.sh:
#!/bin/bash # sudo chmod +x /scripts/sqlrestore.sh user="root" pass="password" db="dbname" path="/sqlrestore/$db.sql" if [ ! -f "$path" ]; then echo "File $path is not there, aborting..."; exit; fi echo "$db restoring..." sudo mysql -u $user -p$pass $db < $path echo "$db restore!"
Здесь нужно указать значения для переменных user, pass, db. Если Вы будете использовать директорию отличную от пути, указанной в переменной path — смените путь. Как видите, имя базы данных (переменная db) должно совпадать с именем дампа (расширение файла не учитывается и прописано в скрипте, как .sql).
Не забываем сделать скрипт исполняемым:
sudo chmod +x /scripts/sqlrestore.sh
И в завершении — немного автоматизации.
Попробуем создать задачу с помощью утилиты crontab и запускать резервное копирование базы данных по времени. Для начала запустим crontab с атрибутом -e для создания и редактирования задач:
sudo crontab -e
Если команда выполняется впервые, утилита предложит выбрать текстовый редактор. Я всё ещё предпочитаю nano (первый вариант в списке).

В моём случае crontab запускает скрипт создания резервной копии базы данных каждый день в 02:00:
0 2 * * * /scripts/sqlbackup.sh
Выглядит это так:

Время запуска можете поставить на своё усмотрение.
Скачать скрипты для ознакомления можно по кнопкам ниже.
В качестве постскриптума…
Если все пользователи уже созданы, подключения корректно настроены, а база данных guacamole_db уже успела разрастись от истории тестовых подключений — можно смело очистить от записей таблицу guacamole_connection_history. Например, вот так:
TRUNCATE 'guacamole_connection_history';