#!/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@% имеет полные права на целевую базу."