本文介绍Dynamic Table增量刷新时的常见问题及排查方法。
增量数据过多导致刷新失败
增量刷新每次触及的增量数据量通常是不稳定的,某次增量数据较多时可能会导致刷新失败。导致增量数据变多的原因通常包括:
对部分源表做了Overwrite操作,可能产生大量的数据变更。如果是这种情况,建议在DB级别设置如下GUC,使源表被Overwrite时自动触发Dynamic Table的Overwrite。
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 selected或No partition of table XXX is selected。
问题原因:base表是物理分区表,Dynamic Table没有分区过滤,导致选取了多个物理分区子表。
解决方案:
建议将base表换成逻辑分区,Dynamic Table会自动适应分区选取。
如果base表是物理分区,且Dynamic Table也是物理分区,必须在Dynamic Table的定义里有分区过滤,且分区要一一对应。
增量刷新报错:Cannot find index full id: XXX
问题原因:增量Dynamic Table的base表允许rename,rename之后可以正常增量刷新;但rename之后的base表又被drop,导致增量刷新根据后端unique table id找不到对应表,无法消费数据。
解决方案:确保报错中的表名对应base表都存在的情况下,执行一次REFRESH OVERWRITE。
REFRESH OVERWRITE TABLE dynamic_table_xxx WITH (refresh_mode = 'incremental');增量刷新报错:GetLatestStreamOffset snapshots is empty或stream XXX is not existed
问题原因:增量Dynamic Table在某次成功刷新之后,太久没有刷新,导致后台记录的base表点位被自动清理。
解决方案:执行一次REFRESH OVERWRITE。
REFRESH OVERWRITE TABLE dynamic_table_xxx WITH (refresh_mode = 'incremental');