# MySQL数据库重命名指南 ## 📋 概述 **重要说明**:MySQL **不支持直接重命名数据库**。`RENAME DATABASE` 命令在 MySQL 5.1.23 之后被移除,因为存在数据丢失风险。 ## ✅ 安全的重命名方法 ### 方法一:使用自动化脚本(推荐) 使用项目提供的脚本进行数据库重命名: ```bash # 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:导出旧数据库 ```bash # 导出数据库(包含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:修改备份文件中的数据库名 ```bash # 方法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:创建新数据库 ```sql CREATE DATABASE hzdyjs_xg_new CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` #### 步骤4:导入数据到新数据库 ```bash mysql -u root -p < /tmp/hzdyjs_xg_backup.sql ``` #### 步骤5:验证数据 ```sql -- 检查表数量 USE hzdyjs_xg_new; SHOW TABLES; -- 检查数据量 SELECT COUNT(*) FROM sys_user; -- 示例:检查用户表 -- 对比旧数据库 USE hzdyjs_xg; SELECT COUNT(*) FROM sys_user; ``` #### 步骤6:更新应用程序配置 ```yaml # application.yml spring: datasource: url: jdbc:mysql://localhost:3306/hzdyjs_xg_new?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai ``` #### 步骤7:删除旧数据库(确认无误后) ```sql -- ⚠️ 危险操作,请确认数据无误后再执行 DROP DATABASE IF EXISTS hzdyjs_xg; ``` --- ### 方法三:使用RENAME TABLE(仅适用于小数据库) 如果数据库表数量较少,可以使用RENAME TABLE方式: ```sql -- 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. 主从复制场景 如果数据库配置了主从复制,重命名数据库需要特殊处理: ```bash # 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. 权限和用户 如果数据库有专门的用户,需要更新用户权限: ```sql -- 撤销旧数据库权限 REVOKE ALL PRIVILEGES ON hzdyjs_xg.* FROM 'app_user'@'%'; -- 授予新数据库权限 GRANT ALL PRIVILEGES ON hzdyjs_xg_new.* TO 'app_user'@'%'; FLUSH PRIVILEGES; ``` ### 4. 备份和恢复 **重要**:重命名前必须备份! ```bash # 完整备份 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` 参数 --- ## 🚫 不推荐的方法 ### ❌ 直接修改数据目录 ```bash # 危险操作,不推荐! # 可能导致数据损坏 mv /var/lib/mysql/hzdyjs_xg /var/lib/mysql/hzdyjs_xg_new ``` **风险**: - 可能导致数据损坏 - 权限问题 - 元数据不一致 - 无法回滚 --- ## 📚 相关文档 - [MySQL官方文档 - 数据库管理](https://dev.mysql.com/doc/refman/8.0/en/database-use.html) - [mysqldump官方文档](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) - [生产环境双机部署方案](./生产环境双机部署方案.md) --- ## 💡 最佳实践 1. **备份优先**:重命名前必须完整备份 2. **测试环境验证**:先在测试环境验证流程 3. **业务低峰期**:选择业务低峰期执行 4. **分步执行**:不要一次性删除旧数据库 5. **保留备份**:保留备份文件至少一周 6. **文档记录**:记录重命名原因和过程 --- **最后更新**:2025-01-03 **维护者**:项目技术团队