104 lines
3.7 KiB
Bash
104 lines
3.7 KiB
Bash
#!/bin/bash
|
|
|
|
# Использование: ./copy_db.sh <source_db> <target_db> <username>
|
|
# Пример: ./copy_db.sh old_db new_db appuser
|
|
|
|
set -e # Завершать выполнение при любой ошибке
|
|
|
|
if [ "$#" -ne 3 ]; then
|
|
echo "Использование: $0 <исходная_база> <целевая_база> <имя_пользователя>"
|
|
exit 1
|
|
fi
|
|
|
|
SOURCE_DB="$1"
|
|
TARGET_DB="$2"
|
|
DB_USER="$3"
|
|
BACKUP_DIR="."
|
|
|
|
# Функция для запроса пароля от MariaDB один раз
|
|
read_mysql_password() {
|
|
if [ -z "$MYSQL_PWD" ]; then
|
|
read -s -p "Введите пароль MariaDB для пользователя root: " MYSQL_PWD
|
|
echo
|
|
export MYSQL_PWD
|
|
fi
|
|
}
|
|
|
|
# Функция проверки существования базы данных
|
|
db_exists() {
|
|
local db_name="$1"
|
|
if mysql -u root -e "SHOW DATABASES LIKE '$db_name';" | grep -q "^$db_name$"; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Функция резервного копирования базы
|
|
backup_db() {
|
|
local db_name="$1"
|
|
local backup_file="${BACKUP_DIR}/${db_name}.backup.sql"
|
|
echo "Создаётся резервная копия базы '$db_name' в файл '$backup_file'..."
|
|
mysqldump -u root \
|
|
--routines \
|
|
--triggers \
|
|
--events \
|
|
--single-transaction \
|
|
"$db_name" > "$backup_file"
|
|
echo "Резервная копия '$db_name' успешно создана."
|
|
}
|
|
|
|
# === НАЧАЛО ОСНОВНОГО СЦЕНАРИЯ ===
|
|
|
|
read_mysql_password
|
|
|
|
echo "Проверка существования исходной базы '$SOURCE_DB'..."
|
|
if ! db_exists "$SOURCE_DB"; then
|
|
echo "Ошибка: исходная база данных '$SOURCE_DB' не существует."
|
|
exit 1
|
|
fi
|
|
|
|
# Резервное копирование исходной базы (всегда)
|
|
backup_db "$SOURCE_DB"
|
|
|
|
# Проверка существования целевой базы
|
|
if db_exists "$TARGET_DB"; then
|
|
echo "Целевая база '$TARGET_DB' уже существует."
|
|
backup_db "$TARGET_DB"
|
|
echo "Удаление существующей базы '$TARGET_DB'..."
|
|
mysql -u root -e "DROP DATABASE \`$TARGET_DB\`;"
|
|
else
|
|
echo "Целевая база '$TARGET_DB' не существует — будет создана."
|
|
fi
|
|
|
|
# Создание новой целевой базы
|
|
echo "Создание новой базы '$TARGET_DB'..."
|
|
mysql -u root -e "CREATE DATABASE \`$TARGET_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
|
|
|
# Создание временного дампа без указания базы (без CREATE DATABASE и USE)
|
|
TEMP_DUMP=$(mktemp)
|
|
echo "Создание временного дампа из '$SOURCE_DB'..."
|
|
mysqldump -u root \
|
|
--routines \
|
|
--triggers \
|
|
--events \
|
|
--single-transaction \
|
|
--no-create-db \
|
|
"$SOURCE_DB" > "$TEMP_DUMP"
|
|
|
|
# Восстановление в целевую базу
|
|
echo "Восстановление данных в '$TARGET_DB'..."
|
|
mysql -u root "$TARGET_DB" < "$TEMP_DUMP"
|
|
|
|
# Удаление временного файла
|
|
rm -f "$TEMP_DUMP"
|
|
|
|
# Настройка прав пользователя
|
|
echo "Настройка прав для пользователя '$DB_USER'@'%' на базу '$TARGET_DB'..."
|
|
mysql -u root -e "CREATE USER IF NOT EXISTS \`$DB_USER\`@'%';"
|
|
mysql -u root -e "GRANT ALL PRIVILEGES ON \`$TARGET_DB\`.* TO \`$DB_USER\`@'%';"
|
|
mysql -u root -e "FLUSH PRIVILEGES;"
|
|
|
|
echo "✅ Копирование завершено успешно!"
|
|
echo "Исходная база: $SOURCE_DB → Целевая база: $TARGET_DB"
|
|
echo "Пользователь: $DB_USER@% имеет полные права на целевую базу." |