一、迁移概述

项目

内容

项目名称

血糖监测与分析服务(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.env

2. 更新 

.env

 文件

# /etc/blood-sugar.env
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=kb
DB_PASSWORD=
DB_NAME=kb

3. 重载并启动服务

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 连接稳定
  • 项目已成功完成数据库迁移任务

🧩 数据库迁移实施文档