数据血缘分析
AnalyticDB for PostgreSQL支持从数据库审计日志中异步解析数据加工 SQL,并生成表级和字段级血缘关系。您可以在DataWorks 数据地图中查看数据的上下游关系。
使用说明
-
数据血缘分析基于审计日志中的 SQL 文本进行静态解析,不解析 SQL 的实际执行计划,也不校验 SQL 是否执行成功、事务是否提交或数据是否实际写入。血缘结果不能作为 SQL 执行状态、执行次数或数据一致性的判断依据。
-
本文采用白名单口径。仅本文明确列出的 SQL 形态属于支持范围;未列出的语法、对象类型和组合方式均不支持。
-
开启该功能后,后台进程会持续读取并解析审计日志,因此会增加 Master 节点的 CPU 和内存消耗。业务越繁忙、审计日志产生越快,资源消耗通常越高。如需关闭血缘分析功能,请提交工单。
-
在 DataWorks 中使用数据地图功能时,会自动启动AnalyticDB for PostgreSQL血缘分析功能,无需手动开启。
前提条件
使用数据血缘分析功能前,实例必须同时满足以下条件:
-
实例为公共云AnalyticDB for PostgreSQL 6.0 版,且内核版本为 6.3.11.1 或以上版本。AnalyticDB for PostgreSQL 7.0 版实例不支持。
-
实例不是 Serverless 模式。
-
实例为公共云实例。
SQL 支持范围
数据血缘分析仅支持同时包含明确源表和目标表、且字段映射关系简单明确的数据加工 SQL。支持以下三类语句:
|
SQL 类型 |
支持的语句形态 |
表级血缘 |
字段级血缘 |
|
|
|
支持 |
支持 |
|
|
|
支持 |
支持 |
|
|
|
支持 |
支持 |
上述三类 SQL 还必须同时满足以下全部条件:
-
单条 SQL 仅包含一个源表和一个目标表。
-
表名和字段名使用未加双引号的小写标识符。
-
SELECT列表必须显式列出字段,不支持SELECT *或table_name.*。 -
源字段与目标字段必须按照顺序一一对应。
-
每个目标字段只能直接来源于一个源字段,不支持函数、运算、常量或其他表达式。
-
INSERT INTO SELECT必须显式指定目标字段列表,且目标字段数量与SELECT字段数量相同。 -
SQL 中不能包含本文"不支持的 SQL 和查询结构"章节列出的任何结构。
支持示例
CREATE TABLE AS SELECT
CREATE TABLE target_table AS
SELECT id, name
FROM source_table;
生成的血缘包括:
-
表级血缘:
source_table→target_table -
字段级血缘:
source_table.id→target_table.id -
字段级血缘:
source_table.name→target_table.name
SELECT INTO
SELECT id, name
INTO target_table
FROM source_table;
生成的血缘包括:
-
表级血缘:
source_table→target_table -
字段级血缘:
source_table.id→target_table.id -
字段级血缘:
source_table.name→target_table.name
INSERT INTO SELECT
INSERT INTO target_table (id, name)
SELECT id, name
FROM source_table;
生成的血缘包括:
-
表级血缘:
source_table→target_table -
字段级血缘:
source_table.id→target_table.id -
字段级血缘:
source_table.name→target_table.name
不支持的 SQL 和查询结构
如果一条 SQL 包含以下任一语法、对象或场景,则整条 SQL 均不属于支持范围。即使系统偶尔生成了部分血缘,也不保证结果正确或完整。
|
类型 |
不支持的范围或示例 |
|
普通查询 |
不带 |
|
|
所有 |
|
其他 DML |
|
|
多表查询 |
|
|
子查询 |
|
|
CTE |
|
|
集合运算 |
|
|
聚合和分组 |
聚合函数、 |
|
排序和结果修饰 |
|
|
条件过滤 |
|
|
字段表达式 |
函数调用、算术运算、字符串拼接、 |
|
非直接字段映射 |
常量、一个源字段映射到多个目标字段、多个源字段计算后映射到一个目标字段 |
|
未显式指定目标字段 |
|
|
DDL 和管理语句 |
不带查询子句的 |
|
视图 |
|
|
特殊表类型 |
临时表、分区表、外部表及其他非普通持久表 |
|
跨 Schema 或跨库 |
非 |
|
特殊标识符 |
使用双引号、大小写敏感名称或无法唯一还原的对象名称 |
|
外部数据读写 |
|
|
过程化或动态 SQL |
存储过程、UDF、 |
|
解释执行 |
|
|
复杂输入 |
一次提交多条 SQL、审计日志中被截断或无法完整还原的 SQL |
其他使用限制
-
异步展示:血缘由后台进程异步解析并上报,不保证实时生成。SQL 执行后,DataWorks 数据地图中的血缘展示可能存在延迟。
-
不判断执行结果:解析器不判断 SQL 是否执行成功,也不判断事务是否提交。执行失败或最终回滚的 SQL 仍可能生成血缘,因此可能出现与实际数据写入情况不一致的结果。
-
不补充隐含关系:系统仅解析 SQL 文本中直接出现的源表、目标表和字段映射,不推导分区父子关系、视图展开关系、函数内部关系或过程内部关系。
-
不提供实时性和完整性 SLA:血缘结果用于辅助影响分析和数据理解,不应作为审计、计费、任务状态判断或数据一致性校验的唯一依据。