2. 源平台资产盘点与依赖分析

迁移项目最容易失控的地方,不是目标端建表,而是对源平台“到底有什么、谁依赖谁”认识不清。Teradata、Oracle、Netezza、Hadoop 这几类平台的资产形态差异极大:Teradata 以数据库对象和 BTEQ/TPT 脚本为主,Oracle 大量逻辑藏在 PL/SQL 包体和物化视图中,Netezza 常见存储过程与 nzsql 脚本,Hadoop 则分散在 Hive 元仓、Spark 作业、Oozie/Airflow 调度和 HDFS 文件之间。资产盘点的目标,是形成一份可追溯的清单:对象清单、血缘关系、作业依赖、存储过程逻辑,以及由此推导出的迁移评估报告。

盘点四类资产,先分清“采什么”

盘点不是把源库全量导出,而是按迁移决策需要采集四类信息。第一类是结构元数据:库、模式、表、视图、列、数据类型、主外键、分区、索引、统计信息。第二类是数据血缘:字段级或表级的来源与去向,例如 Oracle 中 DBA_DEPENDENCIES 能给出对象间引用,Hive 中 LINEAGE_INFO 或解析 SQL 可得到表级血缘。第三类是作业依赖:调度系统中的任务、触发条件、上下游、执行频率、SLA。第四类是过程逻辑:存储过程、函数、触发器中承载的业务规则,这部分最难自动转换,必须单独评估。

采集方式通常分三层:数据库系统表/视图直读、脚本与调度配置解析、以及 SQL 文本解析。以 Teradata 为例,可通过 DBC.TablesV、DBC.ColumnsV 获取对象与列信息,通过 DBC.Table_Text 或 SHOW TABLE 获取 DDL;Oracle 侧用 ALL_TAB_COLUMNS、ALL_CONSTRAINTS、ALL_SOURCE;Netezza 用 _V_TABLE、_V_RELATION_COLUMN;Hadoop 侧则通过 Hive Metastore API 和调度系统 API 拉取。采集脚本应统一输出为中间格式,便于后续合并分析。

血缘与依赖:把“点”连成“网”

单张表清单价值有限,真正决定迁移顺序和风险的是依赖网络。血缘分析要回答三个问题:某张目标表的数据来自哪些源表?某个字段经过哪些转换?如果这张表延迟或缺失,会影响哪些下游报表和作业?作业依赖则回答调度层面的先后关系。两者结合,才能识别出关键路径和迁移批次。

实际做法是构建一张有向图:节点是表、视图、存储过程、作业、文件;边是“读取”“写入”“触发”“引用”。对 SQL 文本做解析时,可先用正则或 SQL 解析器提取 FROM、JOIN、INSERT INTO、CREATE VIEW AS 等模式,再结合系统表补全。对于动态 SQL 和拼接表名,自动解析往往失效,需要人工标注或运行时采集。血缘图建成后,用拓扑排序即可得到迁移批次:无上游依赖的源表先迁,强依赖的存储过程和报表后迁。

源平台资产盘点与依赖分析视图 源平台 Teradata DBC 系统表 / BTEQ Oracle ALL_* 视图 / PL/SQL Netezza _V_* 视图 / nzsql Hadoop Hive Metastore / Spark 调度系统 Oozie / Airflow / Ctrl-M 采集与解析 元数据采集器 JDBC / API 直读 SQL 文本解析 FROM / JOIN / INSERT 调度配置解析 任务 / 触发 / 频率 存储过程抽取 包体 / 函数 / 触发器 中间格式输出 JSON / CSV 清单 依赖分析 对象清单 表 / 视图 / 过程 血缘有向图 读 / 写 / 引用 作业依赖图 触发 / 上下游 拓扑排序 迁移批次划分 复杂度评分 行数 / 嵌套 / 函数 评估报告 资产总览 对象数量 / 容量 迁移批次 按依赖排序 风险清单 动态 SQL / 复杂过程 工作量估算 人天 / 优先级 改造建议 自动 / 手工 / 重写 采集 → 解析 → 依赖建模 → 评估报告,形成可追溯的迁移资产基线

存储过程:迁移工作量的主要来源

存储过程是评估报告中最需要单独列项的部分。以 Oracle PL/SQL 为例,一个包体可能包含数百行逻辑,涉及游标循环、异常处理、动态 SQL、自治事务、序列和同义词。迁移到 Snowflake 时,这些逻辑通常要改写为 Snowpark、JavaScript 存储过程或 SQL 脚本,无法直接翻译。评估时应统计每个过程的代码行数、嵌套深度、动态 SQL 数量、引用的源表数量、是否含事务控制,并据此给出复杂度等级。

一个可用的复杂度评分示例:代码行数每 100 行计 1 分,动态 SQL 每处计 2 分,游标循环每处计 1 分,异常处理块每处计 1 分,跨库引用每处计 1 分。总分 0–5 为低复杂度,可自动转换;6–15 为中复杂度,需人工改写;16 以上为高复杂度,建议重新设计。这个评分不是精确科学,但能让迁移团队对工作量有统一口径。

生成迁移评估报告

盘点与分析的最终交付物是迁移评估报告。报告至少应包含:资产总览(各平台对象数量、数据量、存储过程数量)、依赖关系摘要(关键路径、循环依赖、孤立对象)、迁移批次建议(按拓扑排序分层)、风险清单(动态 SQL、复杂过程、无血缘对象、调度强耦合)、工作量估算(按复杂度分级汇总人天)、以及改造建议(自动转换、人工改写、重新设计、暂缓迁移)。

报告生成应尽量自动化:采集器输出 JSON,分析脚本计算依赖和评分,模板引擎渲染为 HTML 或 Excel。这样每次源平台变更后可以重新跑一遍,保持评估结果与现状一致。需要提醒的是,自动工具对动态 SQL、拼接表名、外部脚本调用的识别率有限,报告中应明确标注“需人工复核”的条目,避免把工具输出直接当作最终结论。

盘点阶段建议先做一次小范围试点:选一条完整的血缘链路(源表→ETL 作业→目标表→报表),手工核对自动采集结果是否准确。试点通过后再全量铺开,能显著降低误判风险。

完成本节工作后,团队应能回答:源平台有哪些对象、它们之间如何依赖、哪些过程最难迁、第一批应该迁什么。这份基线是后续 Schema 转换、数据迁移和作业改造的输入,也是判断迁移进度是否偏离计划的参照。