如何解决 Snowflake 中仅针对任务运行出现的 Stream Not Found 错误?

Posted

技术标签:

【中文标题】如何解决 Snowflake 中仅针对任务运行出现的 Stream Not Found 错误?【英文标题】:How do I resolve a Stream Not Found error in Snowflake that only appears for Task Runs? 【发布时间】:2021-04-07 17:03:47 【问题描述】:

当任务正在执行使用流的查询时,我收到错误消息。错误在通过任务执行查询时出现。

在查询information_schema.task_history时,我可以看到任务状态为FAILED,错误代码为091111。我无法找到任何有关错误代码的文档,所以我主要依靠错误消息 Stream my_stream not found.

创建流时将SHOW_INITIAL_ROWS 参数设置为TRUE。这是因为源表已经存在了很长一段时间,我希望该任务除了处理传入数据之外还处理过去的数据。

我注意到了什么

SYSTEM$STREAM_HAS_DATA 返回 False,直到出现新的 CDC。由于SHOW_INITIAL_ROWS 设置为TRUE,当我查询流时,我得到的行数与查询表本身时相同。但是,SYSTEM$STREAM_HAS_DATA 仍然返回 False。

我的尝试

    可以查询流

我已通过使用此角色和查询确认任务所有者有权访问流。

SELECT * FROM my_stream LIMIT 5; -- Works.

这证实了流确实存在。

    执行 UPDATE 命令确实会使 SYSTEM$STREAM_HAS_DATA 返回带有所有行的 TRUE(而不仅仅是这个命令的差异)。

    我可以运行任务本身的 SQL。进入历史页面,我可以复制并粘贴查询并运行它。

这确认查询本身有效。

    随后的更改实际上由任务处理。

我需要帮助的地方

我需要在没有人工干预和执行的情况下处理流的任务,以使流看起来存在

我假设通过手动执行查询,幕后发生了一些事情,使得该流可以访问。 An example of this would be a stream being created on at able by its owner enables change tracking on that table. 但是,我一直无法找到导致在查询之前无法找到流的情况的原因。

更新:重现错误的分步说明

遇到了更容易查看发生了什么的错误。从那里,能够提出逐步说明来重现错误。

首先,没有 show_initial_rows

use database stream_database;
use schema stream_schema;
create table test_table (a integer);
create stream test_stream on table test_table;

select * from test_stream;  -- Works
select * from stream_database.stream_schema.test_stream;  -- Works
 
use database different_database;  -- Use a different database
select * from stream_database.stream_schema.test_stream;  -- Still works

现在,show_initial_rows 设置为 TRUE

use database stream_database;
use schema stream_schema;


create table test_table (a integer);
create stream test_stream on table test_table  **show_initial_rows** = true;

select * from test_stream;  -- Works
select * from stream_database.stream_schema.test_stream;  -- Works
 
use database different_database;
select * from stream_database.stream_schema.test_stream;  -- Error is raised!

select * from stream_database.stream_schema.test_table;  -- Works, so there is still access to the table.

(假定)预期行为:在流上启用 show_initial_rows 不应更改流可访问的范围。

【问题讨论】:

根据您今天的更新和您提供的代码示例,您似乎遇到了我昨天发布的类似问题 Snowflake - “Stream not found” when accessing using fully-qualified name from different schema @LukaszSzozda 这似乎是同一个问题。我也刚刚收到 Snowflake 的回复——他们说修复正在等待部署,所以希望它很快就会修复 【参考方案1】:

Snowflake 支持已确认这是一个错误。他们已经在内部开了一张票来解决这个问题。

将在解决后尝试在此处发布更新。

2021 年 4 月 30 日更新

Snowflake 已包含适用于 >= 5.15 版本的修复程序。 您可以通过查询SELECT CURRENT_VERSION(); 来检查您的版本,除非有任何回滚,否则这应该适用于所有人。

更新已为我修复了代码为091111Stream not found 错误。但是,在对源表进行新更改之前,它还没有修复 SYSTEM$STREAM_HAS_DATA 返回 False。

2021 年 5 月 26 日更新

已针对 >= 5.20 的版本修复了 SYSTEM$STREAM_HAS_DATA 对初始行返回 False 的问题

【讨论】:

以上是关于如何解决 Snowflake 中仅针对任务运行出现的 Stream Not Found 错误?的主要内容,如果未能解决你的问题,请参考以下文章

数据推送到 Snowflake 阶段时触发 Snowflake 任务

Snowflake&SQLAlchemy“意外的'UNIQUE'

如何解决回归任务数据不均衡的问题?

如何解决回归任务数据不均衡的问题?

如何在iOS 7中仅针对一个视图禁用后退手势

如何从 Hiveql 中的 select over 语句中仅提取最近一周?