12 KiB
CCDI 数据库迁移操作指南
概述
本文档提供 CCDI 纪检初核系统数据库迁移的详细操作步骤,包括从开发环境导出数据库和导入到生产/测试环境。
脚本说明
项目提供两个独立的脚本:
-
export_database.sh - 数据库导出脚本
- 从开发环境导出数据库
- 生成表结构和数据文件到
doc/database/backup/文件夹 - 配置已内置在脚本顶部
-
import_database.sh - 数据库导入脚本
- 从
doc/database/backup/文件夹读取备份文件 - 导入到指定的目标环境(dev/test/prod)
- 配置已内置在脚本顶部
- 从
文件结构
项目根目录/
├── export_database.sh # 导出脚本(配置已内置)
├── import_database.sh # 导入脚本(配置已内置)
└── doc/
└── database/
├── 数据库迁移操作指南.md # 本文档
├── alter_collation_to_general_ci.sql # 排序规则修改脚本
└── backup/ # 备份文件夹
├── .gitkeep
├── ccdi_structure.sql # 表结构(~60KB)
└── ccdi_data.sql # 数据文件(~5.7MB)
注意: 数据库配置已直接内置在脚本中,无需额外的配置文件。
前置条件
必需工具
- MySQL 客户端工具(包含 mysqldump 和 mysql 命令)
- Bash shell 环境(Windows 用户可使用 Git Bash)
- 网络访问权限(能连接源数据库和目标数据库)
检查工具是否安装
mysqldump --version
mysql --version
如果未安装,请根据操作系统安装 MySQL 客户端:
- Windows: 安装 MySQL Community Server
- Linux (Ubuntu/Debian):
sudo apt-get install mysql-client - Linux (CentOS/RHEL):
sudo yum install mysql - macOS:
brew install mysql-client
配置步骤
1. 修改导出脚本配置
编辑 export_database.sh 脚本顶部配置:
# 源数据库配置(开发环境)
DB_HOST="116.62.17.81" # 数据库地址
DB_PORT="3306" # 数据库端口
DB_USER="root" # 数据库用户名
DB_PASS="Kfcx@1234" # 数据库密码
DB_NAME="ccdi" # 数据库名称
2. 修改导入脚本配置
编辑 import_database.sh 脚本顶部配置:
开发环境:
DEV_DB_HOST="116.62.17.81" # 开发环境数据库地址
DEV_DB_PORT="3306" # 数据库端口
DEV_DB_USER="root" # 数据库用户名
DEV_DB_PASS="Kfcx@1234" # 数据库密码
DEV_DB_NAME="ccdi" # 数据库名称
测试环境:
TEST_DB_HOST="your_test_host" # 测试环境数据库地址
TEST_DB_PORT="3306" # 数据库端口
TEST_DB_USER="your_test_user" # 数据库用户名
TEST_DB_PASS="your_test_password" # 数据库密码
TEST_DB_NAME="ccdi" # 数据库名称
生产环境:
PROD_DB_HOST="your_prod_host" # 生产环境数据库地址
PROD_DB_PORT="3306" # 数据库端口
PROD_DB_USER="your_prod_user" # 数据库用户名
PROD_DB_PASS="your_prod_password" # 数据库密码
PROD_DB_NAME="ccdi" # 数据库名称
3. 验证配置
查看配置是否正确:
# 查看导出脚本配置
head -20 export_database.sh
# 查看导入脚本配置
head -30 import_database.sh
数据库导出
执行导出
# 方式1: 使用默认命令
./export_database.sh
# 方式2: 显式指定命令
./export_database.sh export
预期输出
[INFO] ========== 开始导出数据库 ==========
[INFO] 配置文件加载成功
[INFO] mysqldump 命令检查通过
[INFO] 开始导出表结构...
[INFO] 表结构导出成功: doc/database/backup/ccdi_structure.sql
[INFO] 文件大小: 60K
[INFO] 开始导出数据...
[INFO] 数据导出成功: doc/database/backup/ccdi_data.sql
[INFO] 文件大小: 5.7M
[INFO] 验证导出文件...
[INFO] 导出文件验证通过
[INFO] 表结构文件: doc/database/backup/ccdi_structure.sql (60K)
[INFO] 数据文件: doc/database/backup/ccdi_data.sql (5.7M)
[INFO] ========== 数据库导出完成 ==========
[INFO] 使用 ./import_database.sh <env> 导入到目标环境
验证导出文件
1. 检查文件是否存在
ls -lh doc/database/backup/
应该看到:
ccdi_structure.sql- 表结构文件(~60KB)ccdi_data.sql- 数据文件(~5.7MB)
2. 检查字符集声明
head -20 doc/database/backup/ccdi_structure.sql
应该包含:
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
3. 检查文件内容
# 查看表数量
grep "CREATE TABLE" doc/database/backup/ccdi_structure.sql | wc -l
# 查看数据量(INSERT 语句数量)
grep "INSERT" doc/database/backup/ccdi_data.sql | wc -l
数据库导入
准备工作
1. 确认目标数据库已创建
连接到目标数据库服务器:
mysql -h 目标IP -P 3306 -u 用户名 -p
创建数据库(如果不存在):
CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 确认用户权限
目标数据库用户需要以下权限:
- CREATE、ALTER、DROP(创建和修改表)
- INSERT、UPDATE、DELETE(数据操作)
- INDEX(创建索引)
- REFERENCES(外键约束)
导入到测试环境
./import_database.sh test
导入到生产环境
./import_database.sh production
或简写:
./import_database.sh prod
导入到开发环境
./import_database.sh dev
预期输出
[INFO] ========== 开始导入数据库到 test 环境 ==========
[INFO] 配置文件加载成功
[INFO] mysql 命令检查通过
[INFO] 检查备份文件...
[INFO] 备份文件检查通过
[INFO] 表结构文件: doc/database/backup/ccdi_structure.sql (60K)
[INFO] 数据文件: doc/database/backup/ccdi_data.sql (5.7M)
[INFO] 导入表结构到 test 环境: XXX:3306/ccdi
[INFO] 表结构导入成功
[INFO] 导入数据到 test 环境: XXX:3306/ccdi
[INFO] 数据导入成功
[INFO] 验证导入结果...
[INFO] 目标数据库表数量: 42
[INFO] sys_user 表数据行数: XX
[INFO] 数据库字符集: utf8mb4
[INFO] ========== 数据库导入完成 ==========
导入后验证
1. 验证表数量
连接到目标数据库:
mysql -h 目标IP -P 3306 -u 用户名 -p ccdi
查询表数量:
SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema='ccdi';
对比源数据库和目标数据库的表数量是否一致。
2. 验证数据行数
查询各表数据行数:
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema='ccdi'
ORDER BY table_rows DESC
LIMIT 20;
对比源数据库和目标数据库的关键表行数。
3. 验证字符集
检查数据库字符集:
SHOW CREATE DATABASE ccdi;
应该显示:DEFAULT CHARACTER SET utf8mb4
检查表字符集:
SHOW CREATE TABLE sys_user;
应该显示:ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
4. 验证中文数据
查询包含中文的数据:
-- 查询用户表
SELECT user_name, nick_name FROM sys_user LIMIT 10;
-- 查询字典数据
SELECT dict_label, dict_value FROM sys_dict_data LIMIT 10;
-- 查询业务表
SELECT name, person_type FROM ccdi_biz_intermediary LIMIT 10;
确保中文字符显示正常,无乱码。
5. 应用程序连接测试
修改应用程序配置文件连接到目标数据库,启动应用程序进行功能测试。
完整迁移流程示例
场景:从开发环境迁移到生产环境
1. 配置数据库连接
# 编辑导出脚本配置(开发环境)
nano export_database.sh
# 修改脚本顶部的 DB_HOST, DB_USER, DB_PASS 等配置
# 编辑导入脚本配置(生产环境)
nano import_database.sh
# 修改脚本顶部的 PROD_DB_HOST, PROD_DB_USER, PROD_DB_PASS 等配置
2. 导出数据库
./export_database.sh
3. 验证导出文件
ls -lh doc/database/backup/
head -20 doc/database/backup/ccdi_structure.sql
4. 先在测试环境验证
# 确保已在 import_database.sh 中配置测试环境
./import_database.sh test
5. 验证测试环境
- 连接测试数据库验证数据
- 应用程序连接测试环境进行功能测试
6. 导入到生产环境
./import_database.sh prod
7. 验证生产环境
- 连接生产数据库验证数据
- 应用程序连接生产环境进行功能测试
8. 完成迁移
常见问题
1. mysqldump: command not found
原因: MySQL 客户端未安装或未添加到 PATH
解决:
- 安装 MySQL 客户端工具
- 或使用完整路径:
/usr/bin/mysqldump
2. 数据库连接失败
错误信息: 连接被拒绝或认证失败
解决:
- 检查脚本顶部的数据库配置是否正确
- 使用 mysql 命令手动测试连接
- 检查防火墙规则
3. 导入时字符集乱码
原因: 未正确指定字符集
解决:
- 确保导出文件包含字符集声明
- 导入命令添加
--default-character-set=utf8mb4参数 - 脚本已自动处理,如仍有问题请检查数据库默认字符集
5. 外键约束失败
错误信息: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
解决:
- 脚本已自动添加
SET FOREIGN_KEY_CHECKS=0;和SET FOREIGN_KEY_CHECKS=1; - 如仍有问题,请检查数据完整性
6. 数据包过大
错误信息: ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
解决:
- 配置文件中的
MAX_ALLOWED_PACKET=512M已处理此问题 - 如数据量特别大,可增大此值
7. 权限不足
错误信息: ERROR 1044 (42000): Access denied for user
解决:
- 使用具有足够权限的用户(如 root)
- 或授予用户必要权限
8. 备份文件不存在
错误信息: 表结构文件不存在: doc/database/backup/ccdi_structure.sql
解决:
- 先执行导出:
./export_database.sh - 检查 backup 文件夹中是否有 SQL 文件
回滚方案
如果迁移失败或出现问题:
- 保留源数据库: 不要删除开发环境数据库
- 重新迁移: 修复问题后重新执行迁移流程
- 从备份恢复: 如生产环境有备份,可从备份恢复
注意事项
-
安全性:
- 数据库配置已内置在脚本中,包含敏感信息
- 不要将脚本提交到公开的版本控制系统
- 迁移完成后建议删除脚本中的密码或使用占位符
-
性能:
- 大数据库导出/导入可能需要较长时间
- 建议在低峰期执行迁移
- 确保有足够的磁盘空间
-
数据一致性:
- 导出期间源数据库应避免写入操作
- 或使用
--single-transaction参数(已包含)
-
字符集:
- 确保所有步骤都使用 utf8mb4 字符集
- 验证阶段重点检查中文数据
- 表结构文件不再包含显式的 COLLATE 配置(使用默认 utf8mb4_general_ci)
-
脚本配置:
- 首次使用前必须在脚本顶部配置数据库信息
- 三个环境的配置是独立的,可以只配置需要的环境
- 修改配置后无需其他操作即可使用
技术支持
如遇到问题:
- 检查本文档的常见问题部分
- 查看脚本执行的错误信息
- 检查数据库连接和权限
- 查看数据库日志
相关文件
- 导出脚本:
export_database.sh(配置已内置) - 导入脚本:
import_database.sh(配置已内置) - 表结构文件:
doc/database/backup/ccdi_structure.sql - 数据文件:
doc/database/backup/ccdi_data.sql - 排序规则修改脚本:
doc/database/alter_collation_to_general_ci.sql - 设计文档:
docs/plans/2026-02-28-database-migration-design.md