DBE_ILM
接口介绍
服务于ILM策略实施,实现ADO Task的手动触发与停用接口。DBE_ILM支持的接口请参见表1。
- DBE_ILM.EXECUTE_ILM
根据参数执行对指定的数据和ILM策略进行评估,评估通过则会生成对应的压缩Job。
DBE_ILM.EXECUTE_ILM原型为:
DBE_ILM.EXECUTE_ILM( OWNER IN VARCHAR2, OBJECT_NAME IN VARCHAR2, TASK_ID IN OUT NUMBER, SUBOBJECT_NAME IN VARCHAR2 DEFAULT NULL, POLICY_NAME IN VARCHAR2 DEFAULT 'ALL POLICIES', EXECUTION_MODE IN NUMBER DEFAULT 2, TURBO_FORCE IN BOOLEAN DEFAULT FALSE, TURBO_BLKSTART IN INTEGER DEFAULT -1, TURBO_BLKEND IN INTEGER DEFAULT -1)
表2 DBE_ILM.EXECUTE_ILM接口参数说明 参数
描述
OWNER
对象所属Schema。
OBJECT_NAME
对象名称。
TASK_ID
输出生成ADO task的描述符id。
SUBOBJECT_NAME
子对象名称。
POLICY_NAME
策略名称,通过查询GS_ADM_ILMOBJECTS视图可知,默认DBE_ILM.ILM_ALL_POLICIES代表该对象上所有策略。DBE_ILM.ILM_ALL_POLICIES默认值为'ALL POLICIES',不支持小写。
EXECUTION_MOD
执行模式,当前版本不支持该参数,仅做预留。
TURBO_FORCE
是否开启忽略冷热管理的强制压缩,仅对跨页透明压缩生效。TRUE表示开启,FALSE表示关闭。
TURBO_BLKSTART
强制压缩开始的block number,仅对跨页透明压缩生效。
TURBO_BLKEND
强制压缩结束的block number,仅对跨页透明压缩生效。
- DBE_ILM.EXECUTE_ILM依据当前数据库名及表名,生成类似“数据库名_表名_分区名_数字”格式的JOBNAME命名规则,然后通过DBE_SCHEDULER.Create_job创建对应名称的任务;当表名包含特殊字符时,调用该接口将报错:Invalid program name。
- 当DBE_ILM.EXECUTE_ILM与DBE_ILM.STOP_ILM并发时,有较低概率会导致任务FAILED,gs_adm_ilmresults视图中comments字段内容显示“tuple concurrently updated”。
- 业务进行压缩操作时(无论是自动调度还是手动调度),应尽可能避免对压缩中的相关表进行DDL操作。特别是在一段长事务中执行DDL,可能会引发死锁或锁等待问题。若确有必要进行DDL操作,建议使用DBE_ILM.STOP_ILM接口将相关表的压缩任务停止,确认停止后再进行DDL操作。
- 执行DBE_ILM.EXECUTE_ILM需要拥有CREATE JOB权限,可通过DBE_SCHEDULER.GRANT_USER_AUTHORIZATION进行赋权,非SYSADMIN用户执行需要表的owner权限。
- 若要压缩二级分区,SUBOBJECT_NAME字段不可传入其一级分区名称,需传入具体的二级分区名称(或者传入NULL,即压缩所有子二级分区)。
- 事务内调用此接口,需要等待事务结束、或者COMMIT后,压缩动作才能生效。多个不同事务内调用DBE_ILM.EXECUTE_ILM接口,先执行的事务若一直不提交,后执行的事务可能存在锁超时风险。
- TURBO_FORCE参数的不同取值,对gs_adm_ilmresults视图有不同影响:
- 当指定为FALSE时:由于gs_adm_ilmresults视图中的statistics字段统计内容本身对跨页透明压缩无意义,因此跨页透明压缩对象在该字段中显示为默认值。
- 当指定为TRUE时:当前压缩任务独立于ILM原有的任务划分机制运行,不对该对象进行statistics统计,因此gs_adm_ilmresults视图中的statistics字段显示为空。
- DBE_ILM.STOP_ILM DBE_ILM.STOP_ILM原型为:
DBE_ILM.STOP_ILM ( TASK_ID IN NUMBER DEFAULT -1, P_DROP_RUNNING_JOBS IN BOOLEAN DEFAULT FALSE, P_JOBNAME IN VARCHAR2 DEFAULT NULL);
表3 DBE_ILM.STOP_ILM接口参数说明 参数
描述
TASK_ID
指定待停止ADO task的描述符id。
P_DROP_RUNNING_JOBS
是否停止正在执行中的任务,TRUE为强制停止,FALSE为不停止正在执行的任务。
P_JOBNAME
标识待停止的特定JobName,通过GS_MY_ILMEVALUATIONDETAILS视图可以查询。
当并发量较大时,执行DBE_ILM.STOP_ILM可能会提示资源繁忙,稍后重试即可。提示内容为“Resources are busy, please try again later.”。
示例
gaussdb=# CREATE DATABASE ilmtabledb with dbcompatibility = 'ORA'; gaussdb=# \c ilmtabledb gaussdb=# ALTER DATABASE set ilm = on; gaussdb=# CREATE Schema ILM_DATA; gaussdb=# SET current_schema=ILM_DATA; gaussdb=# CREATE SEQUENCE ILM_DATA.ORDER_TABLE_SE_ORDER_ID MINVALUE 1; gaussdb=# CREATE OR REPLACE PROCEDURE ILM_DATA.ORDER_TABLE_CREATE_DATA(NUM INTEGER) IS BEGIN FOR X IN 1..NUM LOOP INSERT INTO ORDER_TABLE VALUES(ORDER_TABLE_SE_ORDER_ID.nextval, '零食大礼包A', NOW()); END LOOP; COMMIT; END; / gaussdb=# CREATE TABLE ILM_DATA.ORDER_TABLE (ORDER_ID INT, GOODS_NAME TEXT, CREATE_TIME TIMESTAMP) WITH (STORAGE_TYPE=ASTORE) ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 1 DAYS OF NO MODIFICATION; NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'order_id' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. BEGIN ILM_DATA.ORDER_TABLE_CREATE_DATA(100); PERFORM PG_SLEEP(2); END; / DECLARE v_taskid number; BEGIN DBE_ILM.EXECUTE_ILM(OWNER => 'ilm_data', OBJECT_NAME => 'order_table', TASK_ID => v_taskid, SUBOBJECT_NAME => NULL, POLICY_NAME => 'ALL POLICIES', EXECUTION_MODE => 2); RAISE INFO 'Task ID is:%', v_taskid; END; / INFO: Task ID is:1 SELECT * FROM pg_sleep(3); pg_sleep ---------- (1 row) gaussdb=# EXECUTE DIRECT ON DATANODES 'SELECT A.DBNAME, A.JOB_STATUS, A.ENABLE, A.FAILURE_MSG FROM PG_JOB A WHERE A.DBNAME = ''ilmtabledb'' AND A.JOB_NAME LIKE ''ilmjob$_%'' ORDER BY A.JOB_NAME DESC LIMIT 1'; dbname | job_status | enable | failure_msg ----------+------------+--------+------------- dbeilmdb | s | f | dbeilmdb | s | f | dbeilmdb | s | f | dbeilmdb | s | f | dbeilmdb | s | f | dbeilmdb | s | f | (6 rows) gaussdb=# CALL DBE_ILM.STOP_ILM(-1, true, NULL); stop_ilm ---------- (1 row)