一、迁移前评估
-
梳理资产清单
- 统计实例数、Schema 数、表数、索引数、视图、序列、触发器、存储过程、JOB、物化视图。
- 统计单表行数、最大表大小、LOB 表数量、分区表数量、日增量数据量。
- 识别核心交易表、报表表、历史归档表、低频表。
-
识别兼容性风险
- Oracle 中
''通常等价于 NULL,TiDB 严格区分 NULL 与空字符串,业务逻辑需改造。 - Oracle
NUMBER无精度时需明确映射为BIGINT或DECIMAL。 - Oracle 函数如
SYSDATE通常需改为CURRENT_TIMESTAMP或应用层处理。 TO_NUMBER等 Oracle 专有函数需改为CAST/CONVERT或在应用层处理。- 存储过程、触发器、自定义函数、复杂 PL/SQL 包在 TiDB 上通常需要下沉到应用层。
- 自增主键在 TiDB 中可能产生写入热点,建议评估
AUTO_RANDOM或业务分布式 ID。
- Oracle 中
-
确定迁移目标
- 是否允许停机窗口。
- 是否需要零停机切换。
- 是否需要反向同步,保留 Oracle 作为回退源。
- 切换后是否继续保留 Oracle,还是彻底下线。
二、环境与工具规划
-
目标集群规划
- TiDB 8.x 建议按生产规格部署,包含 TiDB、TiKV、PD,必要时启用 TiFlash。
- 规划字符集,建议优先统一为
utf8mb4。 - 规划账号权限、Schema 命名、连接地址、连接池配置。
-
迁移链路选择
- 结构迁移:优先通过脚本/工具将 Oracle DDL 转换为 TiDB/MySQL 兼容 DDL。
- 全量数据迁移:可使用
sqluldr2/Data Pump 导出,再通过TiDB Lightning或LOAD DATA导入。 - 增量同步:生产场景常用 Oracle GoldenGate → TiDB,或结合 TiCDC/自研链路 做持续同步。
- 数据校验:通过行数、抽样、字段级校验、业务关键查询对比完成。
注意:TiDB DM 主要面向 MySQL 协议兼容源端,不能直接作为 Oracle 11g 的标准增量同步工具。 Oracle 场景通常仍需 OGG、Flink CDC、DataX 或自研链路配合。
三、对象与 DDL 改造
-
表结构改造
NUMBER→BIGINT/DECIMAL,需根据精度和小数位确认。VARCHAR2(n)→VARCHAR(n),注意 BYTE/CHAR 语义差异。DATE/TIMESTAMP需结合业务确认是否保留时区信息。CLOB/LONG等大字段需评估 TiDB 单行大小限制。- 序列通常改造为自增列、
AUTO_RANDOM或应用层发号器。
-
约束与索引改造
- 外键在 TiDB 中支持有限,核心交易系统建议尽量在应用层维护一致性。
- 长字符串索引需评估前缀索引,避免超过索引长度限制。
- 唯一索引、组合索引、函数索引需逐类验证。
-
SQL 与程序改造
- 替换 Oracle 专有函数,如
NVL、DECODE、TO_CHAR、TO_NUMBER、SYSDATE、ROWNUM等。 - 分页语句从
ROWNUM改写为LIMIT。 - 存储过程、触发器、JOB 尽量迁移到应用层或调度系统。
- 应用侧 JDBC/连接串、事务隔离、批量提交逻辑需同步调整。
- 替换 Oracle 专有函数,如
四、全量数据迁移
-
源端准备
- 确认 Oracle 字符集、NLS 参数。
- 对大表规划分批导出,避免单次导出时间过长。
- 记录全量导出时的 SCN 或时间点,用于后续增量衔接。
-
导出数据
- 可使用
sqluldr2、Data Pump 或静态快照库导出。 - 导出文件格式建议采用 CSV/Parquet 或 Lightning 兼容格式。
- 大表按主键或分区拆批导出,提高并发度。
- 可使用
-
导入 TiDB
- 小表可通过
LOAD DATA导入。 - 大表推荐使用
TiDB Lightning,并开启并发导入。 - 导入前关闭非必要索引,导入后重建索引。
- 导入过程中注意控制事务大小,避免
transaction too large。
- 小表可通过
五、增量同步搭建
-
选择增量方案
- 若要求低停机切换,建议采用 OGG 增量同步到 TiDB。
- 若已有数据集成平台,也可评估 Flink CDC、DataX、自研 CDC 链路。
-
源端配置
- Oracle 11g 需开启归档日志。
- 开启 Force Logging。
- 配置最小补全日志,按表、Schema 或库级开启。
- 创建同步账号并授予必要权限。
-
目标端配置
- TiDB 侧建议开启主键冲突检查相关参数,避免复制进程遇到主键冲突时异常。
- 同步进程建议按表分批配置,避免单任务过大。
- 对大事务场景需控制批量大小,必要时调整 TiDB 事务相关参数。
-
持续同步监控
- 监控同步延迟、错误率、冲突表、断点恢复情况。
- 对 DDL 变更建立审批机制,避免同步链路中断。
- 增量阶段定期做数据抽样校验,不要等到切换前才第一次核对。
六、数据校验
-
基础校验
- 对比 Oracle 与 TiDB 的表行数。
- 对比主键最大值、最小值。
- 对比 NULL 值数量、空字符串数量。
- 对比关键字段的长度、精度、字符集。
-
业务校验
- 抽取近 N 天增量数据逐行比对。
- 对金额、状态、时间类字段做定点核对。
- 验证最大 LOB 记录、特殊字符记录、边界值记录。
-
应用校验
- 在测试环境回放真实查询。
- 对核心报表、交易查询、批量作业进行对比。
- 验证并发写入、批量导入、定时任务是否正常。
七、性能压测与调优
-
压测重点
- 核心交易接口 QPS、RT。
- 批量作业耗时。
- 复杂查询执行计划。
- 热点表写入表现。
-
常见调优方向
- 对单调递增主键表评估
AUTO_RANDOM。 - 补充缺失索引,避免全表扫描。
- 对慢 SQL 固化执行计划或改写 SQL。
- 调整 GC 生命周期,避免长查询或同步任务被回收影响。
- 定期更新统计信息,防止执行计划劣化。
- 对单调递增主键表评估
八、切换演练
-
演练目标
- 验证全量 + 增量链路是否可重复执行。
- 验证数据校验脚本是否可靠。
- 验证应用切换步骤是否清晰。
- 验证回退流程是否可在限定时间内完成。
-
演练内容
- 模拟一次完整割接。
- 模拟增量延迟升高。
- 模拟切换失败回退。
- 模拟主键冲突、大事务报错、DDL 变更冲突。
九、正式割接步骤
-
割接前 T-1 天
- 冻结非必要 DDL 变更。
- 确认增量同步延迟稳定。
- 完成最后一次全量数据核对。
- 准备回退脚本、回退检查清单。
-
割接窗口内
- 停止应用对 Oracle 的写入,或改为只读。
- 等待增量同步追平。
- 进行最终数据一致性校验。
- 切换应用数据源到 TiDB。
- 开启应用验证用例。
- 观察核心指标:错误率、延迟、慢查询、连接数、Region 热点。
-
割接后观察
- 保留 Oracle 只读访问能力,用于紧急核对。
- 若采用反向同步,继续运行一段时间。
- 观察 24 小时、72 小时、首个业务高峰周期。
- 确认无异常后再正式下线 Oracle 依赖。
十、回退预案
-
未切写回退
- 若应用尚未切换写流量,直接中断切换流程。
- 恢复 Oracle 读写。
- 记录问题原因,重新评估改造点。
-
已切写回退
- 立即停止 TiDB 写入入口。
- 评估是否通过反向同步将新数据回写 Oracle。
- 若无反向同步,则按业务容忍度选择人工补数或延长 Oracle 双写期。
- 回退后重新梳理主键冲突、序列号、JOB 重复执行等问题。
十一、DBA 交付物清单
- 《Oracle 对象清单与兼容性评估表》
- 《DDL 改造对照表》
- 《SQL 改造清单》
- 《全量迁移脚本与导入记录》
- 《增量同步拓扑与点位记录》
- 《数据校验报告》
- 《压测报告与调优记录》
- 《割接操作手册》
- 《回退预案与演练记录》
- 《上线后观察清单》
关键风险提示
- 空字符串与 NULL 差异 是最容易遗漏的业务风险点,必须在改造阶段处理。
- 自增主键热点 会影响写入性能,不能直接照搬 Oracle 序列模式。
- 大事务 容易导致导入或同步失败,需分批控制。
- 存储过程、触发器、JOB 不能指望 TiDB 完全等价替代,应提前下沉到应用层。
- 增量同步点位管理 必须严格记录,否则割接失败后难以恢复。
- 数据校验不能只看行数,还需覆盖字段语义、边界值和业务查询。
建议先在测试环境完整跑通一轮:结构改造 → 全量导入 → 增量同步 → 数据校验 → 压测 → 割接演练 → 回退演练,确认所有脚本可重复执行后再安排正式割接。