# 数据库迁移设计文档 ## 概述 将 CCDI 纪检初核系统的开发环境数据库完整迁移到生产环境,包括所有表结构和数据的导出与导入。 ## 需求分析 ### 迁移目标 - **源数据库**: 116.62.17.81:3306/ccdi - **目标环境**: 全新的生产数据库(空库) - **迁移范围**: 所有表的结构和数据 ### 关键要求 1. 表结构和数据分离导出(两个独立文件) 2. 只导出表,不包括视图、存储过程、触发器等 3. 完整导出所有数据,不需要脱敏 4. 确保字符集正确,避免乱码问题 5. 使用 mysqldump 命令导出 6. 提供自动化脚本简化操作 ## 技术方案 ### 导出工具 使用 MySQL 官方工具 `mysqldump` 进行导出,优势: - 标准化工具,兼容性最佳 - 性能优秀,适合大数据库 - 生成的 SQL 文件通用性强 ### 字符集处理 - **字符集**: utf8mb4(支持完整 Unicode,包括 emoji) - **排序规则**: utf8mb4_general_ci - **客户端字符集**: utf8mb4 关键措施: 1. mysqldump 命令添加 `--default-character-set=utf8mb4` 参数 2. SQL 文件头部添加字符集声明语句 3. 导入时指定字符集参数 4. 导入后验证中文数据正确性 ## 导出设计 ### 文件组织 ``` ccdi/ ├── export_database.sh # 自动化脚本 ├── db_config.conf.template # 配置模板 ├── db_config.conf # 实际配置(不纳入版本控制) └── doc/ └── database/ └── backup/ ├── ccdi_structure.sql # 表结构文件 ├── ccdi_data.sql # 数据文件 └── export_guide.md # 操作指南 ``` ### 表结构导出命令 ```bash mysqldump -h 116.62.17.81 -P 3306 -u root -p \ --no-data \ --skip-triggers \ --skip-add-drop-table \ --default-character-set=utf8mb4 \ --single-transaction \ ccdi > ccdi_structure.sql ``` **参数说明**: - `--no-data`: 只导出表结构,不导出数据 - `--skip-triggers`: 跳过触发器 - `--skip-add-drop-table`: 不添加 DROP TABLE 语句(避免误删) - `--default-character-set=utf8mb4`: 指定字符集 - `--single-transaction`: InnoDB 表一致性导出,不锁表 ### 数据导出命令 ```bash mysqldump -h 116.62.17.81 -P 3306 -u root -p \ --no-create-info \ --skip-triggers \ --default-character-set=utf8mb4 \ --single-transaction \ --complete-insert \ --extended-insert \ ccdi > ccdi_data.sql ``` **参数说明**: - `--no-create-info`: 只导出数据,不导出表结构 - `--complete-insert`: INSERT 语句包含列名 - `--extended-insert`: 使用多行 INSERT,提高导入效率 ### SQL 文件字符集声明 ```sql SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; SET GLOBAL character_set_client=utf8mb4; SET GLOBAL character_set_connection=utf8mb4; SET GLOBAL character_set_results=utf8mb4; ``` ## 导入设计 ### 导入顺序 1. 先导入表结构:`ccdi_structure.sql` 2. 再导入数据:`ccdi_data.sql` ### 导入命令 ```bash # 导入表结构 mysql -h 生产环境IP -P 3306 -u 用户名 -p \ --default-character-set=utf8mb4 \ 数据库名 < ccdi_structure.sql # 导入数据 mysql -h 生产环境IP -P 3306 -u 用户名 -p \ --default-character-set=utf8mb4 \ 数据库名 < ccdi_data.sql ``` ### 前置条件 1. 目标数据库已创建(如:`CREATE DATABASE ccdi CHARACTER SET utf8mb4;`) 2. 目标用户有足够权限 3. 磁盘空间充足 ## 自动化脚本设计 ### 脚本功能 - **导出模式**: `./export_database.sh export` - 检查 mysqldump 命令可用性 - 创建备份目录 - 执行结构导出和数据导出 - 添加字符集声明到文件头部 - 验证文件生成 - 记录操作日志 - **导入模式**: `./export_database.sh import [production|test]` - 读取配置文件获取目标环境信息 - 检查目标数据库连接 - 依次导入结构和数据文件 - 验证导入结果 - 记录操作日志 ### 配置文件设计 ```bash # 源数据库配置(开发环境) SOURCE_DB_HOST=116.62.17.81 SOURCE_DB_PORT=3306 SOURCE_DB_USER=root SOURCE_DB_PASS=Kfcx@1234 SOURCE_DB_NAME=ccdi # 生产环境数据库配置 PROD_DB_HOST=生产环境IP PROD_DB_PORT=3306 PROD_DB_USER=生产环境用户名 PROD_DB_PASS=生产环境密码 PROD_DB_NAME=ccdi # 测试环境数据库配置(可选) TEST_DB_HOST=测试环境IP TEST_DB_PORT=3306 TEST_DB_USER=测试环境用户名 TEST_DB_PASS=测试环境密码 TEST_DB_NAME=ccdi # 导出文件配置 BACKUP_DIR=doc/database/backup STRUCTURE_FILE=ccdi_structure.sql DATA_FILE=ccdi_data.sql ``` ### 安全措施 1. `db_config.conf` 添加到 `.gitignore` 2. 提供 `db_config.conf.template` 模板文件 3. 首次运行时检测配置文件,提示用户填写 ## 验证测试 ### 导出验证 1. 检查生成的 SQL 文件大小是否合理 2. 检查文件头部是否包含字符集声明 3. 随机抽取数据检查是否有乱码 4. 统计表数量和数据行数 ### 导入验证 1. 在测试环境先进行导入测试 2. 对比源数据库和目标数据库的表数量 3. 抽查关键表的数据行数 4. 查询包含中文的数据验证编码正确性 5. 使用 `SHOW CREATE TABLE` 检查表字符集 ### 验证命令 ```sql -- 查看数据库字符集 SHOW CREATE DATABASE ccdi; -- 查看表数量 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ccdi'; -- 查看各表行数 SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema='ccdi' ORDER BY table_rows DESC; -- 检查表字符集 SHOW CREATE TABLE sys_user; ``` ## 错误处理 ### 常见问题 1. **字符集乱码** - 原因:未指定字符集参数 - 解决:确保所有命令都添加 `--default-character-set=utf8mb4` 2. **导入失败** - 原因:外键约束冲突 - 解决:导入前临时禁用外键检查 `SET FOREIGN_KEY_CHECKS=0;` 3. **连接超时** - 原因:数据库过大或网络慢 - 解决:添加 `--max_allowed_packet=512M` 参数 4. **权限不足** - 原因:用户权限不够 - 解决:使用 root 用户或授予足够权限 ## 操作流程 ### 完整迁移流程 1. 配置 `db_config.conf` 文件 2. 执行导出:`./export_database.sh export` 3. 验证导出文件正确性 4. 在测试环境验证导入:`./export_database.sh import test` 5. 验证测试环境数据完整性 6. 在生产环境执行导入:`./export_database.sh import production` 7. 验证生产环境数据完整性 8. 应用程序连接测试 ### 回滚方案 保留源数据库,如迁移失败可继续使用源数据库,重新执行迁移流程。 ## 交付物 1. **自动化脚本**: `export_database.sh` 2. **配置模板**: `db_config.conf.template` 3. **表结构文件**: `doc/database/backup/ccdi_structure.sql` 4. **数据文件**: `doc/database/backup/ccdi_data.sql` 5. **操作指南**: `doc/database/backup/export_guide.md` 6. **设计文档**: `docs/plans/2026-02-28-database-migration-design.md` ## 时间估算 - 脚本开发:30分钟 - 导出执行:10-30分钟(取决于数据量) - 测试环境导入验证:10-30分钟 - 生产环境导入:10-30分钟 - 验证测试:10分钟 **总计**: 约1.5-2小时 ## 风险评估 | 风险项 | 等级 | 缓解措施 | |--------|------|----------| | 数据量过大导致超时 | 中 | 添加 max_allowed_packet 参数,分批导出 | | 字符集乱码 | 高 | 严格遵循字符集规范,导入后验证 | | 网络中断 | 低 | 本地保存SQL文件,可重复导入 | | 生产环境数据冲突 | 无 | 全新空库,无冲突风险 | | 权限问题 | 低 | 使用 root 用户或确保权限充足 | ## 成功标准 1. ✅ 所有表结构成功导出,无遗漏 2. ✅ 所有表数据成功导出,无丢失 3. ✅ SQL 文件字符集正确,无乱码 4. ✅ 测试环境导入成功,数据完整 5. ✅ 生产环境导入成功,数据完整 6. ✅ 中文数据正确显示,编码无误 7. ✅ 应用程序可正常连接和操作数据库