Пример скрипта для создания резерва MySQL
Обновлено:
Опубликовано:
Данный скрипт написан на Unix Shell под управлением операционной системы CentOS. Он будет работать на большинстве систем семейств Linux и BSD.
Пример скрипта для резервного копирования MySQL/MariaDB
Описание скрипта
Создание SQL-пользователя для резервного копирования
Пример при монтировании шары на сетевом хранилище
Запуск скрипта по расписанию
Использование my.cnf для хранения данных подключения к базе
Дополнительные материалы
Пример скрипта
Скрипт будет создавать для каждой базы свой дамп. Это необходимо для быстрого восстановления данных.
Создаем каталог для скриптов и сам скрипт:
mkdir /scripts
vi /scripts/mysql_backup.sh
- #!/bin/bash
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
- destination="/backup/mysql"
- userDB="backup"
- passwordDB="backup"
- fdate=`date +%Y-%m-%d`
- test -d $destination/$fdate || mkdir $destination/$fdate
- find $destination -type d \( -name "*-1[^5]" -o -name "*-[023]?" \) -mtime +30 -exec rm -R {} \; 2>&1
- find $destination -type d -name "*-*" -mtime +180 -exec rm -R {} \; 2>&1
- for dbname in `echo show databases | mysql -u$userDB -p$passwordDB -Bs | egrep -v 'information_schema|performance_schema|mysql|sys|test'`; do
- mysqldump --skip-comments --no-tablespaces -u$userDB -p$passwordDB $dbname | gzip > $destination/$fdate/$dbname.sql.gz
- done;
* в данном примере мы указываем пароль в скрипте, что лучше не делать в продуктивной среде. Ниже по тексту рассказано, как подключаться к базе без необходимости вводить пароль.
Создаем каталог, в котором будут храниться копии (в нашем примере, /backup/mysql):
mkdir -p /backup/mysql
Задаем права скрипту на выполнение:
chmod +x /scripts/mysql_backup.sh
Описание скрипта
| 1 | Указываем на путь к интерпретатору. |
| 2 | Задаем системные переменные, чтобы не пришлось в скрипте прописывать полные пути до исполняемых файлов. |
| 4 - 7 | Задаем переменные. |
| 4 | Каталог, в котором будем сохранять резервные копии. |
| 5 | Учетная запись для подключения к базе данных. |
| 6 | Пароль для подключения к базе данных. |
| 7 | Дата, когда запускается скрипт. |
| 9 | Создаем каталог (если его нет), в который будем сохранять резервные копии. В качестве имени каталога используем дату запуска скрипта в формате ГГГГ-MM-ДД. |
| 10 | Находим все резервные копии, которые старше 30 дней и удаляем их. Оставаляем для архива файлы на 15 число. |
| 11 | Удаляем все резервные копии старше 180 дней. |
| 13 - 15 | Подключаемся к базе данных и вытаскиваем список всех баз данных (пропускаем служебные базы information_schema, mysql, performance_schema, sys, test). Для каждой делаем резервную копию. |
| 14 | Делаем резервную копию для баз. |
Подготовка системы
Подключаемся к базе данных и создаем учетную запись с правом на создание резервных копий:
mysql -uroot -p
> CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup';
* в данном примере мы создаем учетную запись backup с паролем backup.
А также даем права:
> GRANT SELECT, SHOW VIEW, EVENT, TRIGGER, LOCK TABLES, EXECUTE, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER, LOCK TABLES, EXECUTE ON *.* TO backup@localhost;
Выходим из SQL-оболочки:
> quit
Сохранение данных на удаленном компьютере
Резервные копии необходимо создавать на удаленном компьютере или внешнем диске, чтобы они были доступны при выходе из строя сервера. В данном примере используется общая папка на удаленном сервере, в которой будут размещаться файлы с backup.
Чтобы упростить процесс монтирования сетевой папки, откроем на редактирование следующий файл:
# vi /etc/fstab
и добавим в него следующую строчку:
//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: файл, в котором написаны логин и пароль для подключения к общей папке.
Теперь создадим файл с логином и паролем:
# vi /root/.smbclient
и приведем его к следующему виду:
username=backup
password=backup
* username: имя пользователя, password: пароль. Само собой, в вашем случае указываются свои данные.
Теперь введите следующую команду:
# mount /mnt
Должна примонтировать сетевая папка //192.168.0.1/backup. Это можно проверить следующей командой:
# mount
Автоматический запуск по расписанию
Создадим правило в cron для автоматического запуска нашего скрипта. Выполняем команду:
crontab -e
И добавляем строку:
0 3 * * * /scripts/mysql_backup.sh
* в данном примере мы будем запускать резервирование каждый день в 3 часа ночи.
Убрать пароль из скрипта
Использовать пароль в скрипте — не самая лучшая практика. Для баз данных MySQL/MariaDB в домашней директории пользователя, от которого запускаем команду, есть возможность создать конфигурационный файл, который будет хранить данные для аутентификации.
Предположим, что скрипт для создания резервной копии запускается от пользователя backup. Заходим в систему под ним:
su - backup
Создаем файл:
vi ~/.my.cnf
[mysq]
host = localhost
user=backup
password="backup"
[mysqldump]
host = localhost
user=backup
password="backup"
* в данном примере мы будем хранить данные для подключения к базе, если мы запускаем команды mysql и mysqldump.
Теперь поправим сам скрипт:
vi /scripts/mysql_backup.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
destination="/backup/mysql"
userDB="backup"
passwordDB="backup"
fdate=`date +%Y-%m-%d`
test -d $destination/$fdate || mkdir $destination/$fdate
find $destination -type d \( -name "*-1[^5]" -o -name "*-[023]?" \) -mtime +30 -exec rm -R {} \; 2>&1
find $destination -type d -name "*-*" -mtime +180 -exec rm -R {} \; 2>&1
for dbname in `echo show databases | mysql -u$userDB -p$passwordDB -Bs | egrep -v 'information_schema|performance_schema|mysql|sys|test'`; do
mysqldump --skip-comments --no-tablespaces -u$userDB -p$passwordDB $dbname | gzip > $destination/$fdate/$dbname.sql.gz
done;
* нам больше не нужны данные для подключения к СУБД. Они будут автоматически браться из файла .my.cnf.
Читайте также
Дополнительная информация, которая может помочь:
1. Как сделать дамп базы MySQL / MariaDB.
2. Создание пользователей MySQL/MariaDB и предоставление прав доступа.
3. Как восстановить базу MySQL из резервной копии.