Удалить все таблицы из базы 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