Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import FunctionDescription from '@site/src/components/FunctionDescription';
import LanguageDocs from '@site/src/components/LanguageDocs';
import DetailsWrap from '@site/src/components/DetailsWrap';

<FunctionDescription description="引入或更新:v1.2.901"/>
<FunctionDescription description="引入或更新:v1.2.935"/>

本页介绍 [databend-query.toml](https://github.com/databendlabs/databend/blob/main/scripts/distribution/configs/databend-query.toml) 配置文件中可用的 Query 节点配置。

Expand Down Expand Up @@ -77,6 +77,25 @@ on = true
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| on | 是否在 Databend Query 节点上启用私有化 Task 调度与执行,默认为 `false`。 |

## [lineage] 部分

使用 `[lineage]` 配置捕获并持久化对象级和列级数据血缘:

```toml
[lineage]
on = true
# retention = 720
```

请在所有 Query 节点上使用相同配置,并在修改配置后重启节点。启用数据血缘后,Databend 会自动配置内部历史存储;不要将 `lineage_history` 添加到 `[log.history.tables]`。

| 参数 | 描述 |
|------|------|
| on | 是否启用血缘捕获和持久化,默认为 `false`。 |
| retention | 可选的 DML 血缘保留时长,单位为小时。省略时永久保留血缘。 |

有关使用方法,请参见[数据血缘](/guides/data-management/data-lineage)。

## [log] 部分

该部分可包含以下子部分:[log.file]、[log.stderr]、[log.query] 和 [log.tracing]。
Expand Down
130 changes: 130 additions & 0 deletions docs/cn/guides/57-data-management/05-data-lineage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
---
title: 数据血缘
---

import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新:v1.2.935"/>

数据血缘用于展示数据如何从源对象流向目标对象。你可以使用数据血缘了解对象依赖关系、评估变更影响、排查数据管道问题,以及将派生列追溯到其源列。

Databend 会记录对象级和列级关系:

- **上游血缘(Upstream Lineage)**:标识为当前对象提供数据的表、视图或 Stage。
- **下游血缘(Downstream Lineage)**:标识使用当前对象数据的其他对象。
- **列级血缘(Column Lineage)**:展示源列到派生目标列的映射关系。

![Databend Cloud 中的表级和列级血缘](/img/guides/data-lineage.png)

## 启用数据血缘

对于提供 **Lineage** 页签的 Databend Cloud Warehouse,血缘配置由服务管理。私有化部署需要在每个 Query 节点的 `databend-query.toml` 中添加以下配置,然后重启节点:

```toml title="databend-query.toml"
[lineage]
on = true
```

默认情况下,血缘历史会永久保留。如需设置固定的保留时长,可通过 `retention` 指定小时数,例如:

```toml title="databend-query.toml"
[lineage]
on = true
retention = 720
```

请仅使用专用的 `[lineage]` 配置,不要将内部表 `lineage_history` 添加到 `[log.history.tables]`。完整配置说明请参见 [Query 节点配置](/guides/self-hosted/references/node-config/query-config#lineage-部分)。

## 生成血缘关系

启用数据血缘后,Databend 会自动记录由 `CREATE TABLE ... AS SELECT`、`CREATE VIEW`、`INSERT ... SELECT`、多表 `INSERT`、`REPLACE`、`MERGE` 和 `COPY` 等操作产生的关系。通过 Stream 读取数据时,血缘会解析到其底层表。

以下示例创建了一条包含两跳关系的血缘链路:

```sql
CREATE OR REPLACE DATABASE lineage_demo;

CREATE OR REPLACE TABLE lineage_demo.fact_orders (
order_id BIGINT,
customer_id BIGINT,
amount DECIMAL(12, 2),
order_time TIMESTAMP
);

CREATE OR REPLACE TABLE lineage_demo.agg_customer_sales AS
SELECT
customer_id,
sum(amount) AS total_amount,
count(*) AS order_count,
max(order_time) AS last_order_time
FROM lineage_demo.fact_orders
GROUP BY customer_id;

CREATE OR REPLACE TABLE lineage_demo.customer_segments AS
SELECT
customer_id,
total_amount,
order_count,
if(total_amount >= 1000, 'high_value', 'standard') AS segment,
now() AS updated_at
FROM lineage_demo.agg_customer_sales;
```

## 查看血缘关系

在 Databend Cloud 中,通过 Database Explorer 打开一个表或视图,然后选择 **Lineage** 页签。血缘图会显示上下游对象;如果存在列级血缘,还会显示列之间的连接关系。

如需通过 SQL 查询血缘,请使用 [`GET_LINEAGE`](/sql/sql-functions/table-functions/get-lineage) 表函数:

```sql
SELECT
distance,
source_object_database,
source_object_name,
target_object_database,
target_object_name
FROM GET_LINEAGE(
'lineage_demo.agg_customer_sales',
'TABLE',
'UPSTREAM',
2
)
ORDER BY distance;
```

查询列级血缘时,请使用带限定符的列名,并将对象域指定为 `COLUMN`:

```sql
SELECT
distance,
source_object_name,
source_column_name,
target_object_name,
target_column_name
FROM GET_LINEAGE(
'lineage_demo.customer_segments.segment',
'COLUMN',
'UPSTREAM',
2
)
ORDER BY distance;
```

## 刷新现有视图的血缘

启用数据血缘后创建的视图会被自动追踪。如果部署中已存在视图,请先预览缺失或过期的关系,然后再进行刷新:

```sql
REFRESH LINEAGE FOR ALL VIEWS DRY RUN;
REFRESH LINEAGE FOR ALL VIEWS;
```

该命令会校准 `default` Catalog 中所有视图的血缘关系。结果只显示需要变更或无法处理的视图,不显示未发生变化的视图。执行命令需要全局 `SUPER` 权限。有关输出列的详细说明,请参见 [`REFRESH LINEAGE`](/sql/sql-commands/ddl/view/refresh-lineage)。

## 使用限制

- `GET_LINEAGE` 最多可遍历五跳关系。
- `system` 和 `information_schema` 中的对象不会作为血缘源记录。
- Stage 支持对象级血缘,但 Stage 文件字段无法提供稳定的列级映射。
- 外部 Catalog 对象可作为血缘端点显示,但不会继续跨越外部 Catalog 边界遍历。
- 查询结果仅包含当前角色可见的对象。
3 changes: 2 additions & 1 deletion docs/cn/guides/57-data-management/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ title: 数据管理
| **[数据生命周期](./01-data-lifecycle.md)** | 创建和管理对象 | • 数据库和表 <br/>• 外部表<br/>• Stream 和视图<br/>• 索引和 Stage | • CREATE/DROP/ALTER<br/>• SHOW TABLES<br/>• DESCRIBE TABLE |
| **[数据恢复](./02-data-recovery.md)** | 访问和恢复历史数据 | • 时间回溯<br/>• 闪回表<br/>• 备份和恢复<br/>• AT 和 UNDROP | • SELECT ... AT<br/>• FLASHBACK TABLE<br/>• BENDSAVE BACKUP |
| **[数据保护](./03-data-protection.md)** | 安全访问和防止数据丢失 | • 网络策略<br/>• 访问控制<br/>• 时间回溯和故障安全<br/>• 数据加密 | • NETWORK POLICY<br/>• GRANT/REVOKE<br/>• USER/ROLE |
| **[数据回收](./04-data-recycle.md)** | 释放存储空间 | • VACUUM 命令<br/>• 保留策略<br/>• 孤立文件清理<br/>• 临时文件管理 | • VACUUM TABLE<br/>• VACUUM DROP TABLE<br/>• DATA_RETENTION_TIME |
| **[数据回收](./04-data-recycle.md)** | 释放存储空间 | • VACUUM 命令<br/>• 保留策略<br/>• 孤立文件清理<br/>• 临时文件管理 | • VACUUM TABLE<br/>• VACUUM DROP TABLE<br/>• DATA_RETENTION_TIME |
| **[数据血缘](./05-data-lineage.md)** | 追踪数据流和依赖关系 | • 上游和下游<br/>• 对象级和列级血缘<br/>• 影响分析 | • GET_LINEAGE<br/>• REFRESH LINEAGE<br/>• 血缘图 |
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ title: 视图(View)
| [ALTER VIEW](ddl-alter-view.md) | 为现有视图分配或移除 Tag |
| [DROP VIEW](ddl-drop-view.md) | 删除视图 |
| [物化视图](materialized-view.md) | 创建并维护由物理存储支持的物化视图 |
| [REFRESH LINEAGE](refresh-lineage.md) | 回填或校准现有视图的血缘关系 |

## 视图信息

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
title: REFRESH LINEAGE
sidebar_position: 7
---

import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新:v1.2.935"/>

回填或校准 `default` Catalog 中现有视图的血缘关系。在已有视图的部署中启用数据血缘后,请使用此命令进行回填。启用数据血缘后创建的视图会被自动追踪。

执行此命令需要全局 `SUPER` 权限,并且必须已启用数据血缘。请参见[数据血缘](/guides/data-management/data-lineage#启用数据血缘)。

## 语法

```sql
REFRESH LINEAGE FOR ALL VIEWS [ DRY RUN ]
```

`DRY RUN` 只计算并报告变更,不会写入数据。建议先使用该选项检查刷新将执行的操作。

## 输出列

| 列 | 描述 |
|----|------|
| `object_domain` | 对象域,当前为 `VIEW`。 |
| `catalog` | 视图所属的 Catalog,当前为 `default`。 |
| `database` | 视图所属的数据库。 |
| `object_name` | 视图名称。 |
| `status` | `DRY_RUN`、`REFRESHED` 或 `ERROR`。 |
| `edge_count` | 当前视图定义中发现的血缘边数量。 |
| `upsert_count` | 需要新增或更新的缺失或已变更血缘边数量。 |
| `delete_count` | 需要删除的过期血缘边数量。 |
| `error` | `status` 为 `ERROR` 时的错误信息;其他情况为 `NULL`。 |

没有变更且处理成功的视图不会出现在结果中。

## 示例

预览现有视图需要执行的变更:

```sql
REFRESH LINEAGE FOR ALL VIEWS DRY RUN;
```

应用变更:

```sql
REFRESH LINEAGE FOR ALL VIEWS;
```

命令完成后,可通过 [`GET_LINEAGE`](/sql/sql-functions/table-functions/get-lineage) 查询视图的上游血缘:

```sql
SELECT
distance,
source_object_database,
source_object_name,
target_object_database,
target_object_name
FROM GET_LINEAGE(
'lineage_demo.sales_view',
'VIEW',
'UPSTREAM',
1
);
```

:::note
如需修改逻辑视图定义,请使用 [`CREATE OR REPLACE VIEW`](ddl-create-view.md)。不支持 `ALTER VIEW ... AS ...`,因为不重新创建视图就修改定义可能导致已持久化的血缘关系不一致。
:::
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
---
title: GET_LINEAGE
---

import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新:v1.2.935"/>

返回表、视图、Stage 或列的上游或下游血缘。结果中的每一行表示血缘路径中的一条源对象到目标对象的关系。

在私有化部署中使用该函数之前,需要先在 `databend-query.toml` 中启用数据血缘。请参见[数据血缘](/guides/data-management/data-lineage#启用数据血缘)。

## 语法

```sql
GET_LINEAGE(
'<object_name>',
'<object_domain>',
'<direction>'
[, <distance> ]
)
```

## 参数

| 参数 | 描述 |
|------|------|
| `object_name` | 查询起点。表或视图使用 `[catalog.]database.object`,Stage 使用 `stage_name`,列使用 `[catalog.]database.object.column`。省略 Catalog 或数据库时,将使用当前会话中的值。 |
| `object_domain` | 对象类型:`TABLE`、`VIEW`、`STAGE` 或 `COLUMN`。 |
| `direction` | `UPSTREAM` 表示向数据源方向追溯;`DOWNSTREAM` 表示向数据使用方方向追溯。 |
| `distance` | 可选的最大遍历跳数,取值范围为 `1` 到 `5`,默认为 `5`。 |

所有参数均为位置参数。

## 输出列

| 列 | 类型 | 描述 |
|----|------|------|
| `source_object_catalog` | Nullable(String) | 源对象所属的 Catalog;Stage 为 `NULL`。 |
| `source_object_database` | Nullable(String) | 源对象所属的数据库;Stage 为 `NULL`。 |
| `source_object_name` | Nullable(String) | 源对象名称。 |
| `source_object_domain` | Nullable(String) | 源对象域:`TABLE`、`VIEW` 或 `STAGE`。 |
| `source_column_name` | Nullable(String) | 列级血缘中的源列;非列级血缘为 `NULL`。 |
| `source_status` | String | `ACTIVE`;如果源列应用了 Masking Policy,则为 `MASKED`。 |
| `target_object_catalog` | Nullable(String) | 目标对象所属的 Catalog;Stage 为 `NULL`。 |
| `target_object_database` | Nullable(String) | 目标对象所属的数据库;Stage 为 `NULL`。 |
| `target_object_name` | Nullable(String) | 目标对象名称。 |
| `target_object_domain` | Nullable(String) | 目标对象域:`TABLE`、`VIEW` 或 `STAGE`。 |
| `target_column_name` | Nullable(String) | 列级血缘中的目标列;非列级血缘为 `NULL`。 |
| `target_status` | String | `ACTIVE`;如果目标列应用了 Masking Policy,则为 `MASKED`。 |
| `distance` | Int32 | 相对于查询起点的跳数。直接关系的距离为 `1`。 |
| `process` | Nullable(String) | 创建该关系的操作元数据,采用 JSON 字符串格式,例如 Query ID、查询文本、用户、时间和血缘类型。 |

## 示例

### 查询上游表

以下查询返回 `agg_customer_sales` 两跳以内的上游关系:

```sql
SELECT
distance,
source_object_catalog,
source_object_database,
source_object_name,
source_object_domain,
target_object_database,
target_object_name
FROM GET_LINEAGE(
'lineage_demo.agg_customer_sales',
'TABLE',
'UPSTREAM',
2
)
ORDER BY distance;
```

### 查询下游列

以下查询追踪 `fact_orders.amount` 被哪些列使用:

```sql
SELECT
distance,
source_object_name,
source_column_name,
target_object_name,
target_column_name
FROM GET_LINEAGE(
'lineage_demo.fact_orders.amount',
'COLUMN',
'DOWNSTREAM',
5
)
ORDER BY distance, target_object_name, target_column_name;
```

## 使用说明

- 如果对象存在但没有已记录的血缘,函数将返回空结果。
- 查询结果会根据当前角色的对象可见性进行过滤。
- Stage 仅支持对象级关系;Stage 文件字段不会作为稳定列返回。
- `system` 和 `information_schema` 中的对象不会被记录为血缘源。
- 外部 Catalog 对象会作为终止端点返回,不会继续向外部 Catalog 内部遍历。
- 对于启用数据血缘之前已存在的视图,请使用 [`REFRESH LINEAGE`](/sql/sql-commands/ddl/view/refresh-lineage) 回填血缘关系。
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ title: 表函数 (Table Functions)
| [FUSE_VACUUM_TEMPORARY_TABLE](./fuse-vacuum-temporary-table.md) | 清理临时表 | `SELECT * FROM FUSE_VACUUM_TEMPORARY_TABLE()` |
| [FUSE_AMEND](./fuse-amend.md) | 执行数据修正操作 | `SELECT * FROM FUSE_AMEND()` |
| [TAG_REFERENCES](./tag-references.md) | 返回指定对象上分配的所有 Tag | `SELECT * FROM TAG_REFERENCES('default.users', 'TABLE')` |
| [GET_LINEAGE](./get-lineage.md) | 返回对象和列的上游或下游血缘 | `SELECT * FROM GET_LINEAGE('mydb.mytable', 'TABLE', 'UPSTREAM')` |

## Iceberg 集成函数

Expand Down
Loading
Loading