Удалить все таблицы из базы MySQL и закачать дамп в bash скрипте
Задача через скрипт обнулить базу и накатить сохраненный дамп. Есть другая база, которая бэкапится периодически, и сохраняется в zip архиве в папку /home/user/backups/db/. Нужно взять самый последний и накатить его в свою базу.
Причем можно было бы сделать через удаление и потом создание такой же базы, однако записывать пароль от root базы данных не очень секьюрно. Крайне желательно чтобы решение требовало только пароль текущего пользователя бд, у которого доступ только к его базе.
В ходе решения получился такой скрипт:
#!/bin/bash
DB_NAME="mydb"
DB_USER="myuser"
DB_PASSWORD="123456"
# получим список всех таблиц
all_tables=$(mysql -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -N -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ', ') AS all_tables FROM information_schema.tables WHERE TABLE_SCHEMA = '$DB_NAME';")
# echo $all_tables
# Отключаем внешние ключи командой "SET FOREIGN_KEY_CHECKS=0;"
# а затем удаляем все таблицы из списка
mysql -u$DB_USER -p$DB_PASSWORD -D $DB_NAME -e "SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS $all_tables;"
# получим название самого свежего файла в папке
latest_file=$(ls -t /home/user/backups/db/ | head -1)
latest_file="/home/user/backups/db/$latest_file"
echo "Выбранный дамп:"
echo $latest_file
# загрузить дамп в базу:
unzip -p $latest_file | mysql -u $DB_USER -p$DB_PASSWORD $DB_NAME
В базе у таблиц есть внешние ключи, которые связаны с другими таблицами. По умолчанию MySQL не позволяет удалять таблицы, у которых есть связи с другими таблицами, чтобы сохранить целостность данных. И если просто так пытаться удалить все таблицы, то можно получить ошибку:
ERROR 1451 (23000) at line 1: Cannot delete or update a parent row: a foreign key constraint fails
Поэтому требуется перед командой drop отключить внешние ключи командой «SET FOREIGN_KEY_CHECKS=0;
Далее приведены значения атрибутов команды mysql:
-u
— задает имя пользователя базы данных, которому разрешен доступ к БД.-p
— указывает на то, что нужно ввести пароль для подключения к БД.После -p необходимо ввести пароль, либо нажать Enter в случае, если пароль не задан явно, но требуется авторизация.-D
— указывает на имя базы данных, в которой нужно выполнить запрос.-N
— отключает вывод столбца с именами полей в результате запроса.-e
— задает SQL-запрос, который нужно выполнить.
Запуск скрипта
Вышеприведённый код запишем в файле myscipt.sh
сделаем файл исполняемым:
sudo chmod +x myscript.sh
теперь можно запихать его в крон, либо запускать его по необходимости в командной строке:
./myscript.sh