6.6 KiB
6.6 KiB
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
风险:
- 可能导致数据损坏
- 权限问题
- 元数据不一致
- 无法回滚
📚 相关文档
💡 最佳实践
- 备份优先:重命名前必须完整备份
- 测试环境验证:先在测试环境验证流程
- 业务低峰期:选择业务低峰期执行
- 分步执行:不要一次性删除旧数据库
- 保留备份:保留备份文件至少一周
- 文档记录:记录重命名原因和过程
最后更新:2025-01-03
维护者:项目技术团队