当Dynamic Table的数据源基表发生变化时,需要通过刷新Dynamic Table来更新数据。Dynamic Table将根据设定的刷新开始时间和刷新间隔,自动在后台执行刷新任务。本文将为您介绍如何查看和维护Dynamic Table的刷新任务。
监控与告警
监控指标
自V4.0.8版本起,Dynamic Table提供以下监控指标,便于您运维刷新任务:
实例级别动态表刷新失败QPS(count/s)
表示实例内所有Dynamic Table的刷新失败QPS,用于反映整体刷新健康度。正常情况该指标应接近0;若持续非0或明显抬升,通常表示存在持续失败的刷新任务,建议您前往HoloWeb控制台,在Dynamic Table界面查看失败任务并尽快处理。
动态表数据延迟(s)
表示实例内每张Dynamic Table的数据相对上游基表最新数据(或预期时间点)的延迟,单位:秒,用于反映数据实时性。建议您根据业务需求设置合理的延迟告警阈值。若延迟持续上升,可能原因包括:
刷新持续失败或已暂停自动刷新,请前往HoloWeb控制台的Dynamic Table管理界面排查。
上游发生大数据量变更,实例资源不足导致刷新变慢,可结合Hologres监控与刷新时长等指标综合排查。
动态表正在运行的刷新持续时长(ms)
表示实例内每张Dynamic Table当前刷新任务已持续运行的时间,单位:毫秒,用于判断刷新周期是否变长。建议您按业务场景为不同表设置刷新持续时长告警。若该指标突然升高或长期明显高于历史水平,可重点排查实例资源瓶颈、上游数据量变化等因素。
动态表刷新失败QPM(count/m)
表示实例内每张Dynamic Table每分钟的刷新失败次数(分钟粒度),用于评估单表刷新稳定性。正常情况该指标应为0。偶发失败(如因系统压力、实例升级等)且后续刷新恢复成功时,一般可忽略;若某张表的该指标持续大于0,说明该表刷新任务长期异常,请根据Dynamic Table失败日志中的错误信息进行排查与处理。
告警
您可以通过云监控为Dynamic Table刷新任务配置告警规则,以便及时发现异常。具体操作请参见云监控。
查看刷新任务
查看运行中的刷新任务
通过hologres.hg_dynamic_table_refresh_activity查看
您可以通过hologres.hg_dynamic_table_refresh_activity查看正在运行中的刷新任务(包括全量刷新和增量刷新),以及资源消耗等。hologres.hg_dynamic_table_refresh_activity系统表字段介绍详情,请参见hologres.hg_dynamic_table_refresh_activity系统表。
仅Hologres V3.0版本、V4.0.8及以上版本支持该系统表。
--查看当前正在运行的刷新任务
SELECT
pid,
query_id,
refresh_mode,
'RUNNING' as status,
refresh_start,
extract(epoch from duration) as duration, -- milliseconds
serverless_queue_time_ms::bigint / 1000 AS serverless_queue_time_sec,
serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_sec,
serverless_allocated_cores
FROM
hologres.hg_dynamic_table_refresh_activity
WHERE datname = '${database}'
AND table_write = quote_ident('${schema}') || '.' || quote_ident('${tableName}')
ORDER BY refresh_start DESC
limit 2000;通过hg_stat_activity查看
您可以通过hg_stat_activity系统视图查看正在运行中的刷新任务,在hg_stat_activity中不同的刷新模式显示存在差异:
全量刷新:会展示INSERT语句。
增量刷新:会展示Refresh任务。
通过监控指标查看刷新任务
您可以通过查看QPS、RPS、Latency等指标,确认Dynamic Table刷新任务的执行情况,其中Command Type为refresh,即为Dynamic Table的刷新任务。关于监控指标详情,请参见Hologres管控台的监控指标。
若Dynamic Table刷新任务,在Serverless Computing资源中运行,您也可以Serverless Computing相关指标中进行查看。
Dynamic Table刷新任务支持通过云监控,创建告警规则,详情请参见云监控。
查看历史刷新任务
通过hologres.hg_dynamic_table_refresh_history查看
hologres.hg_dynamic_table_refresh_history系统表会记录近一个月,所有Dynamic Table刷新任务(包括全量刷新、增量刷新、手动刷新)的历史信息。hologres.hg_dynamic_table_refresh_history系统表字段介绍详情,请参见hologres.hg_dynamic_table_refresh_history 系统表。
数据默认保留近一个月的记录,无法查询一个月之前的数据。
表Owner仅能查看自身的刷新历史,而Superuser则具备查看所有刷新记录的权限。
示例1:查看增量刷新过去一天的记录。
--示例1:查看增量刷新过去一天的记录 SELECT query_id, refresh_mode, status, refresh_start, duration, refresh_latency / 1000 AS refresh_latency_second, serverless_allocated_cores, queue_time_ms::bigint / 1000 AS queue_time_second, serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second FROM hologres.hg_dynamic_table_refresh_history WHERE refresh_start >= CURRENT_DATE - INTERVAL '1 day' AND dynamic_table_name = '<dynamic_table>' AND refresh_mode = 'incremental' ORDER BY refresh_start DESC limit 100;示例2:查看当前实例,过去1天所有的刷新任务。
--查看实例内过去1天所有的刷新记录 SELECT query_id, refresh_mode, status, refresh_start, duration, refresh_latency / 1000 AS refresh_latency_second, serverless_allocated_cores, queue_time_ms::bigint / 1000 AS queue_time_second, serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second FROM hologres.hg_dynamic_table_refresh_history where refresh_start >= CURRENT_DATE - INTERVAL '1 day'示例3:查看指定表过去一天的刷新记录。
--查看某个表过去一天的刷新记录 SELECT query_id, refresh_mode, status, refresh_start, duration, refresh_latency / 1000 AS refresh_latency_second, serverless_allocated_cores, queue_time_ms::bigint / 1000 AS queue_time_second, serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second FROM hologres.hg_dynamic_table_refresh_history where schema_name='<scehma_name>' and dynamic_table_name='<dynamic_table>' and refresh_start >= CURRENT_DATE - INTERVAL '1 day'
对于3.0旧语法创建的全量模式Dynamic Table,hologres.hg_dynamic_table_refresh_history可能无法反映刷新的真实成功或失败状态,失败的刷新也可能展示为Success。可通过以下方式查询某张3.0语法全量Dynamic Table的真实刷新历史状态:
从
hologres.hg_dynamic_table_properties获取cron_job_name。使用
cron_job_name在hologres.hg_user_cron_tasks中查询Cron任务执行记录。
-- 获取cron_job_name
SELECT property_value AS cron_job_name
FROM hologres.hg_dynamic_table_properties
WHERE dynamic_table_name = '<dt_name>' AND property_key = 'cron_job_name';
-- 通过cron_job_name查询Cron任务执行记录
SELECT *
FROM hologres.hg_user_cron_tasks
WHERE jobname = '<cron_job_name>'
ORDER BY start_time DESC;通过慢Query日志查看
您可以通过慢Query日志查看Dynamic Table的刷新任务,Command Type为refresh。通过慢Query日志查看详情,请参见慢Query日志查看与分析。
查看刷新任务的执行计划
与普通Query一致,支持通过EXPLAIN和EXPLAIN ANALYZE查看刷新任务的执行计划和运行信息,以便于分析刷新任务的性能瓶颈,帮助业务进一步Query调优。示例如下:
explain refresh dynamic table hmtest.dt_order_lineitem;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------
Gather (cost=0.00..10.13 rows=1 width=16)
-> Insert (cost=0.00..10.13 rows=1 width=16)
-> Redistribution (cost=0.00..10.11 rows=1 width=16)
-> Final HashAggregate (cost=0.00..10.11 rows=1 width=16)
Group Key: orders.o_orderpriority
-> Redistribution (cost=0.00..10.11 rows=10 width=16)
Hash Key: orders.o_orderpriority
-> Partial HashAggregate (cost=0.00..10.11 rows=10 width=16)
Group Key: orders.o_orderpriority
-> Hash Left Semi Join (cost=0.00..10.11 rows=1000 width=8)
Hash Cond: (orders.o_orderkey = lineitem.l_orderkey)
-> Redistribution (cost=0.00..5.03 rows=1000 width=16)
Hash Key: orders.o_orderkey
-> Local Gather (cost=0.00..5.01 rows=1000 width=16)
-> Seq Scan on orders (cost=0.00..5.01 rows=1000 width=16)
Filter: ((o_orderdate >= '1996-07-01 00:00:00+08'::timestamp with time zone) AND (o_orderdate < '199
6-10-01 00:00:00+08'::timestamp with time zone))
-> Hash (cost=5.03..5.03 rows=1000 width=8)
-> Redistribution (cost=0.00..5.03 rows=1000 width=8)
Hash Key: lineitem.l_orderkey
-> Local Gather (cost=0.00..5.03 rows=1000 width=8)
-> Seq Scan on lineitem (cost=0.00..5.03 rows=1000 width=8)
Filter: (l_commitdate < l_receiptdate)
Optimizer: HQO version 2.1.0
(23 rows)设置刷新超时时长
与普通Query一样,Dynamic Table的刷新任务也支持设置超时时长。
表级别设置
创建Dynamic Table表时,设置刷新任务超时时长,对该表的所有刷新任务都生效。以下SQL代码以tpch_10g公共数据集为例,在执行之前,请确保已成功导入tpch_10g公共数据集。具体操作,请参见新建公共数据集导入任务。
--创建表时设置刷新任务超时时间。
CREATE DYNAMIC TABLE tpch_q1_batch
WITH (
refresh_mode='full',
auto_refresh_enable='true',
full_auto_refresh_interval='1 hours',
refresh_guc_statement_timeout='30 mins'--刷新超时时间为30 mins
)
AS
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) asAScount_order
FROM
hologres_dataset_tpch_10.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus;Session级别设置
手动刷新时,可通过Session级GUC设置超时时长,SQL示例如下。
SET statement_timeout = <time>;
refresh DYNAMIC TABLE <dynamic_schema_name.dynamic_table_name>;关于更多设置详情,请参见修改活跃Query超时时间。
通过 refresh with option 设置
手动刷新时,也可通过refresh ... with (refresh_guc_statement_timeout = '...')为当次刷新指定超时时间。示例如下。
REFRESH DYNAMIC TABLE <schema_name.table_name> WITH (
refresh_guc_statement_timeout = '30 mins'
);手动刷新
支持对Dynamic Table执行手动刷新,语法如下:
REFRESH DYNAMIC TABLE <schema_name.table_name>;若表属性中已开启自动刷新,同时执行手动刷新时,相当于与自动刷新并行执行,两者均可正常执行,系统最终保证仅有一份最新数据,不会产生多份数据。
取消刷新任务
3.1新语法创建的Dynamic Table
取消正在运行的刷新任务
对于3.1新语法创建的Dynamic Table,可先通过hologres.hg_dynamic_table_refresh_log查询正在运行的刷新任务的query_job_id,再通过hologres.hg_internal_cancel_query_job取消该刷新任务。
-- 获取query_job_id
SELECT query_job_id
FROM hologres.hg_dynamic_table_refresh_log('<dt_name>')
WHERE status = 'Running';
-- 根据query_job_id取消对应的刷新任务
SELECT hologres.hg_internal_cancel_query_job('<query_job_id>');仅Superuser可以通过hologres.hg_internal_cancel_query_job取消刷新任务。
取消表的所有刷新任务
如果Dynamic Table已设置刷新任务,可执行ALTER TABLE在表级别取消后续所有刷新任务。若需重新开启刷新,请参见ALTER DYNAMIC TABLE。
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (auto_refresh_enable=false);请谨慎操作,否则可能导致后续数据无法更新。
3.0语法创建的Dynamic Table
取消正在运行的刷新任务
如果您发现刷新任务长时间运行未结束或出现卡顿等问题,可通过pg_cancel_backend取消正在运行的刷新任务。
您可以通过如下命令,取消单个正在运行的刷新任务。
-- pid为刷新任务ID,可通过查看刷新任务获取query_id
SELECT pg_cancel_backend(<pid>);上述参数pid为刷新任务ID,您可通过查看刷新任务获取刷新任务ID(query_id),详情请参见查看刷新任务。
批量取消正在运行的刷新任务,同普通Query的方式相同,详情请参见终止Query。
取消表的所有刷新任务
如果Dynamic Table已经设置了刷新任务,您可以通过ALTER DYNAMIC TABLE命令,在表级别取消后续所有的刷新任务。
ALTER DYNAMIC TABLE [IF EXISTS ] [<schema>.]<table_name> set (auto_refresh_enable=false);请谨慎操作,否则可能导致后续数据无法更新。