Bash · 27.10.2023

MySQL: backup & restore

Темы резервного копирования 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';