1. 课程背景与目标
1.1 数据库迁移的常见场景
数据库迁移是企业架构演进中不可避免的工程活动。根据迁移目标与范围,可将常见场景归纳为以下三类:
| 迁移场景 | 典型动因 | 技术挑战 |
|---|---|---|
| 云迁移 | 降低硬件成本、弹性扩缩容、托管运维 | 网络延迟变化、连接协议差异、云厂商限流策略 |
| 分库分表 | 单库容量瓶颈、写入吞吐不足、冷热数据分离 | 分布式事务、跨库查询、路由规则一致性 |
| 版本升级 | 安全补丁、新功能(如 MySQL 5.7 → 8.0) | 驱动兼容性、SQL 语法变更、连接参数默认值变化 |
关键认知: 无论迁移类型如何,连接管理与内存模型的差异往往是故障的根源。迁移后的系统并非原样复制,而是运行在一个全新的运行时环境中。
1.2 迁移后典型故障概述
根据生产环境故障统计,数据库迁移后最常见的两类故障是连接池泄漏与GC 停顿。它们往往相互诱发,形成恶性循环。
⚠ 常见误区: 很多团队在迁移后只关注 SQL 性能,而忽略了连接池配置与 JVM 堆内存的适配。实际上,连接池泄漏和GC 停顿是迁移后前 72 小时内最高频的 P0 故障原因。
1.3 连接池泄漏的典型表现
- 现象: 应用日志频繁出现
Cannot get a connection, pool exhausted或Timeout: pool empty。 - 根因: 连接未正确归还(
connection.close()未调用、异常分支未释放、事务拦截器失效)。 - 迁移放大效应: 新环境连接超时时间、最大连接数、驱动版本变化导致原有代码的隐藏泄漏暴露。
1.4 GC 停顿的典型表现
- 现象: 接口响应时间周期性飙升(秒级暂停),CPU 使用率下降,GC 日志显示 Full GC 频繁。
- 根因: 迁移后连接池增大 → 活跃连接数上升 → 连接对象及关联缓存(PreparedStatement、ResultSet)占用堆内存 → 老年代膨胀。
- 迁移放大效应: 新数据库驱动可能创建更多临时对象,或连接池默认的
maxLifetime导致对象频繁晋升。
1.5 课程学习目标
完成本课程后,你将能够:
- 诊断连接池泄漏: 使用 JMX、HikariCP 指标、
jstack和连接池监控快速定位泄漏代码。 - 分析 GC 停顿根因: 通过 GC 日志、堆转储、JVM 参数调优识别迁移后的内存异常。
- 建立故障排查框架: 从“现象 → 指标 → 日志 → 代码”的递进式排查方法论。
- 制定迁移后稳定性清单: 连接池参数、JVM 参数、监控告警的标准化配置。
1.6 前置知识要求
| 领域 | 具体要求 |
|---|---|
| Java 基础 | 理解 JDBC 连接管理、线程池、异常处理机制 |
| JVM 基础 | 了解堆内存结构、GC 算法(CMS/G1)、GC 日志格式 |
| 数据库基础 | 熟悉连接池概念(HikariCP/Druid)、常见 SQL 执行流程 |
| Linux 基础 | 能使用 top、jstat、jstack、netstat 等工具 |
💡 学习建议: 本课程包含大量实战案例和工具操作。建议准备一个测试环境(Java 8/11 + MySQL 8.0 + HikariCP),跟随课程步骤进行复现和排查练习。