Files
2025-11-27 00:02:01 +08:00

128 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
# MySQL数据库重命名脚本
# 用途:安全地重命名MySQL数据库(通过导出导入方式)
# 注意:MySQL不支持直接重命名数据库,需要通过导出导入实现
set -e
# 配置参数
OLD_DB_NAME="${1:-hzdyjs_xg}"
NEW_DB_NAME="${2:-}"
ROOT_PASSWORD="${ROOT_PASSWORD:-Hzdyjs@Root@123456}"
BACKUP_DIR="/tmp/mysql_rename_backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${OLD_DB_NAME}_backup_${TIMESTAMP}.sql"
echo "=========================================="
echo "MySQL数据库重命名脚本"
echo "=========================================="
echo "⚠️ 注意:MySQL不支持直接重命名数据库"
echo " 本脚本通过导出导入方式实现重命名"
echo "=========================================="
# 检查参数
if [ -z "$NEW_DB_NAME" ]; then
echo "用法: $0 <旧数据库名> <新数据库名>"
echo "示例: $0 hzdyjs_xg hzdyjs_xg_new"
exit 1
fi
# 检查新旧数据库名是否相同
if [ "$OLD_DB_NAME" = "$NEW_DB_NAME" ]; then
echo "错误:新旧数据库名不能相同!"
exit 1
fi
# 检查旧数据库是否存在
echo "[1/6] 检查旧数据库是否存在..."
DB_EXISTS=$(mysql -u root -p"$ROOT_PASSWORD" -e "SHOW DATABASES LIKE '$OLD_DB_NAME';" | grep -c "$OLD_DB_NAME" || true)
if [ "$DB_EXISTS" -eq 0 ]; then
echo "错误:数据库 '$OLD_DB_NAME' 不存在!"
exit 1
fi
echo "✓ 数据库 '$OLD_DB_NAME' 存在"
# 检查新数据库是否已存在
echo "[2/6] 检查新数据库是否已存在..."
NEW_DB_EXISTS=$(mysql -u root -p"$ROOT_PASSWORD" -e "SHOW DATABASES LIKE '$NEW_DB_NAME';" | grep -c "$NEW_DB_NAME" || true)
if [ "$NEW_DB_EXISTS" -gt 0 ]; then
echo "警告:数据库 '$NEW_DB_NAME' 已存在!"
read -p "是否删除现有数据库 '$NEW_DB_NAME'? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "操作已取消"
exit 1
fi
echo "正在删除数据库 '$NEW_DB_NAME'..."
mysql -u root -p"$ROOT_PASSWORD" -e "DROP DATABASE IF EXISTS $NEW_DB_NAME;"
fi
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 导出旧数据库
echo "[3/6] 导出旧数据库 '$OLD_DB_NAME'..."
mysqldump -u root -p"$ROOT_PASSWORD" \
--single-transaction \
--routines \
--triggers \
--events \
--add-drop-database \
--databases "$OLD_DB_NAME" > "$BACKUP_FILE"
if [ ! -f "$BACKUP_FILE" ] || [ ! -s "$BACKUP_FILE" ]; then
echo "错误:数据库导出失败!"
exit 1
fi
echo "✓ 数据库导出完成: $BACKUP_FILE"
# 修改备份文件中的数据库名
echo "[4/6] 修改备份文件中的数据库名..."
sed -i.bak "s/CREATE DATABASE.*\`$OLD_DB_NAME\`/CREATE DATABASE \`$NEW_DB_NAME\`/g" "$BACKUP_FILE"
sed -i.bak "s/USE \`$OLD_DB_NAME\`/USE \`$NEW_DB_NAME\`/g" "$BACKUP_FILE"
echo "✓ 数据库名已修改"
# 创建新数据库
echo "[5/6] 创建新数据库 '$NEW_DB_NAME'..."
mysql -u root -p"$ROOT_PASSWORD" <<EOF
CREATE DATABASE $NEW_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
EOF
echo "✓ 新数据库创建完成"
# 导入数据到新数据库
echo "[6/6] 导入数据到新数据库(这可能需要几分钟)..."
mysql -u root -p"$ROOT_PASSWORD" < "$BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "✓ 数据导入完成"
else
echo "错误:数据导入失败!"
echo "备份文件已保存: $BACKUP_FILE"
exit 1
fi
# 验证数据
echo ""
echo "=========================================="
echo "验证新数据库..."
echo "=========================================="
TABLE_COUNT=$(mysql -u root -p"$ROOT_PASSWORD" -e "USE $NEW_DB_NAME; SHOW TABLES;" | wc -l)
echo "新数据库 '$NEW_DB_NAME' 包含 $((TABLE_COUNT - 1)) 个表"
# 显示操作结果
echo ""
echo "=========================================="
echo "数据库重命名完成!"
echo "=========================================="
echo "旧数据库名: $OLD_DB_NAME"
echo "新数据库名: $NEW_DB_NAME"
echo "备份文件: $BACKUP_FILE"
echo ""
echo "⚠️ 重要提示:"
echo "1. 请验证新数据库数据完整性"
echo "2. 更新应用程序配置文件中的数据库名"
echo "3. 如果确认无误,可以删除旧数据库:"
echo " mysql -u root -p -e \"DROP DATABASE IF EXISTS $OLD_DB_NAME;\""
echo "4. 备份文件已保存,可随时恢复"
echo "=========================================="