128 lines
4.2 KiB
Bash
Executable File
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 "=========================================="
|
|
|