diff --git a/copy_databases.sh b/copy_databases.sh new file mode 100644 index 0000000..5837928 --- /dev/null +++ b/copy_databases.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# Использование: ./copy_db.sh +# Пример: ./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@% имеет полные права на целевую базу." \ No newline at end of file