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

6.6 KiB
Raw Permalink Blame History

MySQL数据库重命名指南

📋 概述

重要说明:MySQL 不支持直接重命名数据库。RENAME DATABASE 命令在 MySQL 5.1.23 之后被移除,因为存在数据丢失风险。

✅ 安全的重命名方法

方法一:使用自动化脚本(推荐)

使用项目提供的脚本进行数据库重命名:

# 1. 赋予执行权限
chmod +x 部署脚本/rename-mysql-database.sh

# 2. 执行重命名(旧数据库名 -> 新数据库名)
./部署脚本/rename-mysql-database.sh hzdyjs_xg hzdyjs_xg_new

# 或者指定root密码
ROOT_PASSWORD="your_password" ./部署脚本/rename-mysql-database.sh hzdyjs_xg hzdyjs_xg_new

脚本功能:

  • ✅ 自动检查数据库是否存在
  • ✅ 自动备份旧数据库
  • ✅ 自动创建新数据库
  • ✅ 自动导入数据
  • ✅ 自动验证数据完整性
  • ✅ 保留备份文件,可随时恢复

方法二:手动执行(分步操作)

步骤1:导出旧数据库

# 导出数据库(包含CREATE DATABASE语句)
mysqldump -u root -p \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --add-drop-database \
    --databases hzdyjs_xg > /tmp/hzdyjs_xg_backup.sql

参数说明:

  • --single-transaction:使用事务保证数据一致性
  • --routines:导出存储过程和函数
  • --triggers:导出触发器
  • --events:导出事件
  • --add-drop-database:包含DROP DATABASE语句
  • --databases:导出整个数据库

步骤2:修改备份文件中的数据库名

# 方法A:使用sed命令(推荐)
sed -i.bak "s/CREATE DATABASE.*\`hzdyjs_xg\`/CREATE DATABASE \`hzdyjs_xg_new\`/g" /tmp/hzdyjs_xg_backup.sql
sed -i.bak "s/USE \`hzdyjs_xg\`/USE \`hzdyjs_xg_new\`/g" /tmp/hzdyjs_xg_backup.sql

# 方法B:使用文本编辑器手动修改
# 查找并替换:
# CREATE DATABASE `hzdyjs_xg` -> CREATE DATABASE `hzdyjs_xg_new`
# USE `hzdyjs_xg` -> USE `hzdyjs_xg_new`

步骤3:创建新数据库

CREATE DATABASE hzdyjs_xg_new CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

步骤4:导入数据到新数据库

mysql -u root -p < /tmp/hzdyjs_xg_backup.sql

步骤5:验证数据

-- 检查表数量
USE hzdyjs_xg_new;
SHOW TABLES;

-- 检查数据量
SELECT COUNT(*) FROM sys_user;  -- 示例:检查用户表

-- 对比旧数据库
USE hzdyjs_xg;
SELECT COUNT(*) FROM sys_user;

步骤6:更新应用程序配置

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/hzdyjs_xg_new?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai

步骤7:删除旧数据库(确认无误后)

-- ⚠️ 危险操作,请确认数据无误后再执行
DROP DATABASE IF EXISTS hzdyjs_xg;

方法三:使用RENAME TABLE(仅适用于小数据库)

如果数据库表数量较少,可以使用RENAME TABLE方式:

-- 1. 创建新数据库
CREATE DATABASE hzdyjs_xg_new CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 2. 重命名每个表(需要手动列出所有表)
RENAME TABLE hzdyjs_xg.sys_user TO hzdyjs_xg_new.sys_user;
RENAME TABLE hzdyjs_xg.sys_role TO hzdyjs_xg_new.sys_role;
-- ... 继续重命名所有表

-- 3. 删除旧数据库
DROP DATABASE hzdyjs_xg;

缺点:

  • ❌ 需要手动列出所有表
  • ❌ 不适用于大数据库
  • ❌ 不包含存储过程、触发器、事件等

⚠️ 注意事项

1. 主从复制场景

如果数据库配置了主从复制,重命名数据库需要特殊处理:

# 1. 停止从库复制
mysql -u root -p -e "STOP SLAVE;"

# 2. 在主库执行重命名操作
# 3. 在从库执行相同的重命名操作

# 4. 更新主从复制配置
# 主库 my.cnf
binlog-do-db = hzdyjs_xg_new

# 从库 my.cnf
replicate-do-db = hzdyjs_xg_new

# 5. 重启MySQL并启动复制
mysql -u root -p -e "START SLAVE;"

2. 应用程序连接

重命名数据库后,需要更新所有应用程序的数据库连接配置:

  • ✅ 后端应用配置文件(application.yml)
  • ✅ 前端API配置(如果有)
  • ✅ 定时任务配置
  • ✅ 其他依赖数据库的服务

3. 权限和用户

如果数据库有专门的用户,需要更新用户权限:

-- 撤销旧数据库权限
REVOKE ALL PRIVILEGES ON hzdyjs_xg.* FROM 'app_user'@'%';

-- 授予新数据库权限
GRANT ALL PRIVILEGES ON hzdyjs_xg_new.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

4. 备份和恢复

重要:重命名前必须备份!

# 完整备份
mysqldump -u root -p --all-databases > /backup/all_databases_$(date +%Y%m%d).sql

# 业务数据库备份
mysqldump -u root -p hzdyjs_xg > /backup/hzdyjs_xg_$(date +%Y%m%d).sql

🔍 验证清单

重命名完成后,请验证以下项目:

  • 新数据库表数量与旧数据库一致
  • 关键表数据量一致(如用户表、角色表等)
  • 存储过程和函数已迁移
  • 触发器已迁移
  • 事件已迁移
  • 应用程序可以正常连接新数据库
  • 所有功能测试通过
  • 备份文件已保存

📊 性能影响

导出导入时间估算

数据库大小 导出时间 导入时间 总时间
< 1GB 1-5分钟 2-10分钟 3-15分钟
1-10GB 5-30分钟 10-60分钟 15-90分钟
10-50GB 30-120分钟 60-240分钟 90-360分钟
> 50GB 2-6小时 4-12小时 6-18小时

优化建议:

  • 使用 --single-transaction 减少锁表时间
  • 在业务低峰期执行
  • 使用SSD存储提升I/O性能
  • 增加 max_allowed_packet 参数

🚫 不推荐的方法

❌ 直接修改数据目录

# 危险操作,不推荐!
# 可能导致数据损坏
mv /var/lib/mysql/hzdyjs_xg /var/lib/mysql/hzdyjs_xg_new

风险:

  • 可能导致数据损坏
  • 权限问题
  • 元数据不一致
  • 无法回滚

📚 相关文档


💡 最佳实践

  1. 备份优先:重命名前必须完整备份
  2. 测试环境验证:先在测试环境验证流程
  3. 业务低峰期:选择业务低峰期执行
  4. 分步执行:不要一次性删除旧数据库
  5. 保留备份:保留备份文件至少一周
  6. 文档记录:记录重命名原因和过程

最后更新:2025-01-03
维护者:项目技术团队