Dynamic Table增量刷新常见问题

更新时间:
复制为 MD 格式

本文介绍Dynamic Table增量刷新时的常见问题及排查方法。

增量数据过多导致刷新失败

增量刷新每次触及的增量数据量通常是不稳定的,某次增量数据较多时可能会导致刷新失败。导致增量数据变多的原因通常包括:

  • 对部分源表做了Overwrite操作,可能产生大量的数据变更。如果是这种情况,建议在DB级别设置如下GUC,使源表被Overwrite时自动触发Dynamic TableOverwrite。

ALTER DATABASE xxx SET hg_experimental_enable_dynamic_table_consume_change_when_base_overwrite = off;
  • 手动暂停或因其他原因导致Dynamic Table一段时间没刷新,积累了较多的增量数据。

  • 业务原因导致源表导入/变更数据短时间内突增。

这类问题导致的常见增量刷新报错信息如下:

  • Query OOM:ERRCODE_OUT_OF_MEMORY: Total memory used by all existing queries exceeded memory limitation。

  • Worker OOM:SERVER_INTERNAL_ERROR message: "ERPC_ERROR_CONNECTION_CLOSED, reason: Ping timeout"。

  • BinaryArray Exceed 2G:internal error: Capacity error: BinaryArray cannot contain more than 2147483646 bytes。

此时可以采用REFRESH OVERWRITE做一次手动增全量刷新,执行成功后观察后续的增量刷新是否恢复。

REFRESH OVERWRITE TABLE dynamic_table_xxx WITH (refresh_mode = 'incremental', refresh_guc_hg_computing_resource = 'serverless');

报错:Multiple partitions / No partition is selected

报错信息示例:Multiple partitions of table XXX is selectedNo partition of table XXX is selected

问题原因:base表是物理分区表,Dynamic Table没有分区过滤,导致选取了多个物理分区子表。

解决方案

  • 建议将base表换成逻辑分区,Dynamic Table会自动适应分区选取。

  • 如果base表是物理分区,且Dynamic Table也是物理分区,必须在Dynamic Table的定义里有分区过滤,且分区要一一对应。

增量刷新报错:Cannot find index full id: XXX

问题原因:增量Dynamic Tablebase表允许rename,rename之后可以正常增量刷新;但rename之后的base表又被drop,导致增量刷新根据后端unique table id找不到对应表,无法消费数据。

解决方案:确保报错中的表名对应base表都存在的情况下,执行一次REFRESH OVERWRITE。

REFRESH OVERWRITE TABLE dynamic_table_xxx WITH (refresh_mode = 'incremental');

增量刷新报错:GetLatestStreamOffset snapshots is emptystream XXX is not existed

问题原因:增量Dynamic Table在某次成功刷新之后,太久没有刷新,导致后台记录的base表点位被自动清理。

解决方案:执行一次REFRESH OVERWRITE。

REFRESH OVERWRITE TABLE dynamic_table_xxx WITH (refresh_mode = 'incremental');