一、迁移概述
|
项目 |
内容 |
|---|---|
|
项目名称 |
血糖监测与分析服务(Blood Sugar Monitoring Service) |
|
原数据库服务器 |
旧IP(MySQL 8.0) |
|
目标数据库服务器 |
本地 Docker 容器 mysql3306(宿主机端口 3306 映射) |
|
数据库名称 |
kb |
|
迁移日期 |
(填写实际迁移日期) |
|
迁移方式 |
mysqldump 逻辑备份 + 管道导入(无中间文件) |
|
迁移负责人 |
(填写负责人姓名) |
二、迁移前准备
1. 环境确认
- 源库(旧 IP)MySQL 版本:8.0
- 目标库(Docker 容器)MySQL 版本:8.0
- 网络:宿主机与源库网络连通,3306 端口开放
- 用户:kb 在源库具有 SELECT, TRIGGER, EVENT, SHOW VIEW 权限
- 防火墙:宿主机允许出站访问 旧 IP:3306
2. 目标库初始化
CREATE DATABASE IF NOT EXISTS kb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'kb'@'%' IDENTIFIED BY '新库密码';
GRANT ALL PRIVILEGES ON kb.* TO 'kb'@'%';
FLUSH PRIVILEGES;3. 应用停机 / 切换准备
sudo systemctl stop blood-sugar确认迁移期间无新的写入。
三、迁移实施步骤
1. 导出与导入(一次性管道迁移)
在宿主机执行:
export MYSQL_PWD='旧库密码'
mysqldump -h 旧 IP -P 3306 -u kb \
--databases kb \
--single-transaction --quick \
--routines --triggers --events \
--default-character-set=utf8mb4 \
--no-tablespaces \
| MYSQL_PWD='新库密码' mysql -h 127.0.0.1 -P 3306 -u kb说明:
- --single-transaction:确保 InnoDB 表一致性
- --no-tablespaces:避免 PROCESS 权限错误
- 管道直接传输,无需中间文件
四、迁移后校验
1. 数据结构校验
mysqldump -h 旧IP -u kb --no-data kb > /tmp/kb_old_schema.sql
mysqldump -h 127.0.0.1 -u kb --no-data kb > /tmp/kb_new_schema.sql
diff -u /tmp/kb_old_schema.sql /tmp/kb_new_schema.sql✅ 结构一致,无表缺失或字段差异。
2. 数据数量校验
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.tables
WHERE table_schema='kb'
ORDER BY TABLE_NAME;✅ 各表行数一致。
3. 数据内容抽查
SELECT COUNT(*) FROM kb.blood_sugar_records;
SELECT * FROM kb.blood_sugar_records ORDER BY id DESC LIMIT 10;✅ 核对关键字段值一致。
4. 对象校验
SHOW TRIGGERS FROM kb;
SHOW EVENTS FROM kb;
SHOW PROCEDURE STATUS WHERE Db='kb';
SHOW FUNCTION STATUS WHERE Db='kb';✅ 触发器、事件、存储过程均成功迁移。
五、应用配置修改
1. 更新 systemd 配置
修改 /etc/systemd/system/blood-sugar.service:
[Service]
EnvironmentFile=/etc/blood-sugar.env2. 更新
.env
文件
# /etc/blood-sugar.env
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=kb
DB_PASSWORD=
DB_NAME=kb3. 重载并启动服务
sudo systemctl daemon-reload
sudo systemctl restart blood-sugar
sudo systemctl status blood-sugar✅ 应用启动正常,日志无数据库连接错误。
六、回滚与应急方案
|
场景 |
操作 |
|---|---|
|
导入失败或中断 |
重新执行 mysqldump 管道导入 |
|
应用连接异常 |
恢复旧配置文件连接 117.50.193.215 |
|
数据错误 |
使用迁移前备份文件恢复 |
七、安全收尾
- 修改旧库和新库的数据库密码
- 删除明文密码环境变量
- 检查 Docker MySQL 日志:
docker logs mysql3306 --tail 50- 确认无错误后,可关闭旧数据库实例。
八、迁移结果总结
|
校验项 |
状态 |
备注 |
|---|---|---|
|
数据库结构 |
✅ 一致 |
无差异 |
|
数据记录数量 |
✅ 一致 |
所有表行数相同 |
|
触发器/事件/存储过程 |
✅ 一致 |
全部迁移成功 |
|
应用连接测试 |
✅ 正常 |
连接 Docker MySQL |
|
性能与响应 |
✅ 正常 |
与迁移前一致 |
九、最佳实践与后续建议
- 定期执行 mysqldump 自动备份
- 保留旧库 7 天内可访问以便回滚
- 启用增量或 binlog 备份策略
- 将数据库配置移入 .env 文件避免明文
- 定期校验 event_scheduler 状态,确保事件任务执行
✅ 迁移完成:
- 数据结构、数据记录、触发器与事件完全一致
- 应用运行正常
- Docker MySQL 连接稳定
- 项目已成功完成数据库迁移任务