实现功能: - 创建自动化导出脚本 export_database.sh - 支持表结构和数据分离导出 - 添加 utf8mb4 字符集支持避免乱码 - 支持导入到生产和测试环境 - 创建配置文件模板和安全措施 - 添加详细的操作指南文档 文件说明: - db_config.conf.template: 配置文件模板 - export_database.sh: 自动化迁移脚本 - doc/database/backup/export_guide.md: 操作指南 - doc/database/backup/ccdi_structure.sql: 表结构(42个表) - doc/database/backup/ccdi_data.sql: 数据文件(5.7MB) 使用方法: 1. cp db_config.conf.template db_config.conf 2. 编辑 db_config.conf 填写数据库信息 3. ./export_database.sh export # 导出数据库 4. ./export_database.sh import test # 导入到测试环境 5. ./export_database.sh import prod # 导入到生产环境
399 lines
9.1 KiB
Markdown
399 lines
9.1 KiB
Markdown
# CCDI 数据库迁移操作指南
|
||
|
||
## 概述
|
||
|
||
本文档提供 CCDI 纪检初核系统数据库迁移的详细操作步骤,包括从开发环境导出数据库和导入到生产/测试环境。
|
||
|
||
## 前置条件
|
||
|
||
### 必需工具
|
||
- MySQL 客户端工具(包含 mysqldump 和 mysql 命令)
|
||
- Bash shell 环境
|
||
- 网络访问权限(能连接源数据库和目标数据库)
|
||
|
||
### 检查 mysqldump 是否安装
|
||
```bash
|
||
mysqldump --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. 创建配置文件
|
||
|
||
```bash
|
||
# 复制配置模板
|
||
cp db_config.conf.template db_config.conf
|
||
|
||
# 编辑配置文件
|
||
nano db_config.conf # 或使用其他编辑器
|
||
```
|
||
|
||
### 2. 填写配置信息
|
||
|
||
编辑 `db_config.conf` 文件,填写以下信息:
|
||
|
||
**源数据库(开发环境):**
|
||
- `SOURCE_DB_HOST`: 开发环境数据库地址
|
||
- `SOURCE_DB_PORT`: 数据库端口(默认 3306)
|
||
- `SOURCE_DB_USER`: 数据库用户名
|
||
- `SOURCE_DB_PASS`: 数据库密码
|
||
- `SOURCE_DB_NAME`: 数据库名称(ccdi)
|
||
|
||
**生产环境数据库:**
|
||
- `PROD_DB_HOST`: 生产环境数据库地址
|
||
- `PROD_DB_PORT`: 数据库端口
|
||
- `PROD_DB_USER`: 生产环境数据库用户名
|
||
- `PROD_DB_PASS`: 生产环境数据库密码
|
||
- `PROD_DB_NAME`: 数据库名称(ccdi)
|
||
|
||
**测试环境数据库(可选):**
|
||
- `TEST_DB_HOST`: 测试环境数据库地址
|
||
- `TEST_DB_PORT`: 数据库端口
|
||
- `TEST_DB_USER`: 测试环境数据库用户名
|
||
- `TEST_DB_PASS`: 测试环境数据库密码
|
||
- `TEST_DB_NAME`: 数据库名称(ccdi)
|
||
|
||
### 3. 验证配置
|
||
|
||
检查配置文件格式:
|
||
```bash
|
||
cat db_config.conf | grep -E "^[A-Z]"
|
||
```
|
||
|
||
确保所有必需的配置项都已填写。
|
||
|
||
## 数据库导出
|
||
|
||
### 执行导出
|
||
|
||
```bash
|
||
./export_database.sh export
|
||
```
|
||
|
||
### 预期输出
|
||
|
||
```
|
||
[INFO] ========== 开始导出数据库 ==========
|
||
[INFO] 配置文件加载成功
|
||
[INFO] mysqldump 命令检查通过
|
||
[INFO] 开始导出表结构...
|
||
[INFO] 表结构导出成功: doc/database/backup/ccdi_structure.sql
|
||
[INFO] 文件大小: XXX
|
||
[INFO] 开始导出数据...
|
||
[INFO] 数据导出成功: doc/database/backup/ccdi_data.sql
|
||
[INFO] 文件大小: XXX
|
||
[INFO] 验证导出文件...
|
||
[INFO] 导出文件验证通过
|
||
[INFO] 表结构文件: doc/database/backup/ccdi_structure.sql (XXX)
|
||
[INFO] 数据文件: doc/database/backup/ccdi_data.sql (XXX)
|
||
[INFO] ========== 数据库导出完成 ==========
|
||
```
|
||
|
||
### 验证导出文件
|
||
|
||
**1. 检查文件是否存在**
|
||
```bash
|
||
ls -lh doc/database/backup/
|
||
```
|
||
|
||
应该看到:
|
||
- `ccdi_structure.sql` - 表结构文件
|
||
- `ccdi_data.sql` - 数据文件
|
||
|
||
**2. 检查字符集声明**
|
||
```bash
|
||
head -20 doc/database/backup/ccdi_structure.sql
|
||
```
|
||
|
||
应该包含:
|
||
```sql
|
||
SET NAMES utf8mb4;
|
||
SET CHARACTER SET utf8mb4;
|
||
```
|
||
|
||
**3. 检查文件内容**
|
||
```bash
|
||
# 查看表结构
|
||
grep "CREATE TABLE" doc/database/backup/ccdi_structure.sql | wc -l
|
||
|
||
# 查看数据量(INSERT 语句数量)
|
||
grep "INSERT" doc/database/backup/ccdi_data.sql | wc -l
|
||
```
|
||
|
||
## 数据库导入
|
||
|
||
### 准备工作
|
||
|
||
**1. 确认目标数据库已创建**
|
||
|
||
连接到目标数据库服务器:
|
||
```bash
|
||
mysql -h 目标IP -P 3306 -u 用户名 -p
|
||
```
|
||
|
||
创建数据库(如果不存在):
|
||
```sql
|
||
CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||
```
|
||
|
||
**2. 确认用户权限**
|
||
|
||
目标数据库用户需要以下权限:
|
||
- CREATE、ALTER、DROP(创建和修改表)
|
||
- INSERT、UPDATE、DELETE(数据操作)
|
||
- INDEX(创建索引)
|
||
- REFERENCES(外键约束)
|
||
|
||
### 导入到测试环境
|
||
|
||
```bash
|
||
./export_database.sh import test
|
||
```
|
||
|
||
### 导入到生产环境
|
||
|
||
```bash
|
||
./export_database.sh import production
|
||
```
|
||
|
||
或简写:
|
||
```bash
|
||
./export_database.sh import prod
|
||
```
|
||
|
||
### 预期输出
|
||
|
||
```
|
||
[INFO] ========== 开始导入数据库到 test 环境 ==========
|
||
[INFO] 导入表结构到 test 环境: XXX:3306/ccdi
|
||
[INFO] 表结构导入成功
|
||
[INFO] 导入数据到 test 环境: XXX:3306/ccdi
|
||
[INFO] 数据导入成功
|
||
[INFO] 验证导入结果...
|
||
[INFO] 目标数据库表数量: XX
|
||
[INFO] sys_user 表数据行数: XX
|
||
[INFO] 数据库字符集: utf8mb4
|
||
[INFO] ========== 数据库导入完成 ==========
|
||
```
|
||
|
||
## 导入后验证
|
||
|
||
### 1. 验证表数量
|
||
|
||
连接到目标数据库:
|
||
```bash
|
||
mysql -h 目标IP -P 3306 -u 用户名 -p ccdi
|
||
```
|
||
|
||
查询表数量:
|
||
```sql
|
||
SELECT COUNT(*) FROM information_schema.tables
|
||
WHERE table_schema='ccdi';
|
||
```
|
||
|
||
对比源数据库和目标数据库的表数量是否一致。
|
||
|
||
### 2. 验证数据行数
|
||
|
||
查询各表数据行数:
|
||
```sql
|
||
SELECT table_name, table_rows
|
||
FROM information_schema.tables
|
||
WHERE table_schema='ccdi'
|
||
ORDER BY table_rows DESC
|
||
LIMIT 20;
|
||
```
|
||
|
||
对比源数据库和目标数据库的关键表行数。
|
||
|
||
### 3. 验证字符集
|
||
|
||
检查数据库字符集:
|
||
```sql
|
||
SHOW CREATE DATABASE ccdi;
|
||
```
|
||
|
||
应该显示:`DEFAULT CHARACTER SET utf8mb4`
|
||
|
||
检查表字符集:
|
||
```sql
|
||
SHOW CREATE TABLE sys_user;
|
||
```
|
||
|
||
应该显示:`ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`
|
||
|
||
### 4. 验证中文数据
|
||
|
||
查询包含中文的数据:
|
||
```sql
|
||
-- 查询用户表
|
||
SELECT user_name, nick_name FROM sys_user LIMIT 10;
|
||
|
||
-- 查询字典数据
|
||
SELECT dict_label, dict_value FROM sys_dict_data LIMIT 10;
|
||
```
|
||
|
||
确保中文字符显示正常,无乱码。
|
||
|
||
### 5. 应用程序连接测试
|
||
|
||
修改应用程序配置文件连接到目标数据库,启动应用程序进行功能测试。
|
||
|
||
## 完整迁移流程示例
|
||
|
||
### 场景:从开发环境迁移到生产环境
|
||
|
||
**1. 配置数据库连接**
|
||
```bash
|
||
cp db_config.conf.template db_config.conf
|
||
nano db_config.conf
|
||
# 填写开发环境和生产环境数据库信息
|
||
```
|
||
|
||
**2. 导出数据库**
|
||
```bash
|
||
./export_database.sh export
|
||
```
|
||
|
||
**3. 验证导出文件**
|
||
```bash
|
||
ls -lh doc/database/backup/
|
||
head -20 doc/database/backup/ccdi_structure.sql
|
||
```
|
||
|
||
**4. 先在测试环境验证**
|
||
```bash
|
||
./export_database.sh import test
|
||
```
|
||
|
||
**5. 验证测试环境**
|
||
- 连接测试数据库验证数据
|
||
- 应用程序连接测试环境进行功能测试
|
||
|
||
**6. 导入到生产环境**
|
||
```bash
|
||
./export_database.sh import production
|
||
```
|
||
|
||
**7. 验证生产环境**
|
||
- 连接生产数据库验证数据
|
||
- 应用程序连接生产环境进行功能测试
|
||
|
||
**8. 完成迁移**
|
||
|
||
## 常见问题
|
||
|
||
### 1. mysqldump: command not found
|
||
|
||
**原因**: MySQL 客户端未安装或未添加到 PATH
|
||
|
||
**解决**:
|
||
- 安装 MySQL 客户端工具
|
||
- 或使用完整路径:`/usr/bin/mysqldump`
|
||
|
||
### 2. 配置文件不存在
|
||
|
||
**错误信息**: `配置文件不存在: db_config.conf`
|
||
|
||
**解决**:
|
||
```bash
|
||
cp db_config.conf.template db_config.conf
|
||
# 编辑 db_config.conf 填写实际配置
|
||
```
|
||
|
||
### 3. 连接数据库失败
|
||
|
||
**可能原因**:
|
||
- 数据库地址、端口、用户名或密码错误
|
||
- 防火墙阻止连接
|
||
- 数据库服务未启动
|
||
|
||
**解决**:
|
||
- 检查配置文件中的连接信息
|
||
- 使用 mysql 命令手动测试连接
|
||
- 检查防火墙规则
|
||
|
||
### 4. 导入时字符集乱码
|
||
|
||
**原因**: 未正确指定字符集
|
||
|
||
**解决**:
|
||
- 确保导出文件包含字符集声明
|
||
- 导入命令添加 `--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)
|
||
- 或授予用户必要权限
|
||
|
||
## 回滚方案
|
||
|
||
如果迁移失败或出现问题:
|
||
|
||
1. **保留源数据库**: 不要删除开发环境数据库
|
||
2. **重新迁移**: 修复问题后重新执行迁移流程
|
||
3. **从备份恢复**: 如生产环境有备份,可从备份恢复
|
||
|
||
## 注意事项
|
||
|
||
1. **安全性**:
|
||
- `db_config.conf` 包含敏感信息,已添加到 `.gitignore`
|
||
- 不要将配置文件提交到版本控制系统
|
||
- 迁移完成后建议删除配置文件中的密码
|
||
|
||
2. **性能**:
|
||
- 大数据库导出/导入可能需要较长时间
|
||
- 建议在低峰期执行迁移
|
||
- 确保有足够的磁盘空间
|
||
|
||
3. **数据一致性**:
|
||
- 导出期间源数据库应避免写入操作
|
||
- 或使用 `--single-transaction` 参数(已包含)
|
||
|
||
4. **字符集**:
|
||
- 确保所有步骤都使用 utf8mb4 字符集
|
||
- 验证阶段重点检查中文数据
|
||
|
||
## 技术支持
|
||
|
||
如遇到问题:
|
||
1. 检查本文档的常见问题部分
|
||
2. 查看脚本执行的错误信息
|
||
3. 检查数据库连接和权限
|
||
4. 查看数据库日志
|
||
|
||
## 相关文件
|
||
|
||
- 自动化脚本: `export_database.sh`
|
||
- 配置模板: `db_config.conf.template`
|
||
- 实际配置: `db_config.conf`
|
||
- 表结构文件: `doc/database/backup/ccdi_structure.sql`
|
||
- 数据文件: `doc/database/backup/ccdi_data.sql`
|
||
- 设计文档: `docs/plans/2026-02-28-database-migration-design.md`
|