更新时间:2026-08-06 GMT+08:00
分享

自动调度

以下为后台自动调度压缩的测试步骤,过程中的表可替换为自己的表数据进行测试,注意提前做好备份。

  1. 执行如下命令,打开GUC参数enable_ilm,命令如下。

    gs_guc reload -Z datanode  -I all -N all -c 'enable_ilm=on'

  1. 使用初始用户gsql登录数据库,创建维护窗口。

    gaussdb=# \c template1
    template1=# DECLARE
        V_HOUR INT := 22;
        V_MINUTE INT := 0;
        V_SECOND INT := 0;
        C_ADO_WINDOW_SCHEDULE_NAME TEXT := 'ado_window_schedule';
        C_ADO_WINDOW_PROGRAM_NAME TEXT := 'ado_window_program';
        C_MAINTENANCE_WINDOW_JOB_NAME TEXT := 'maintenance_window_job';
        V_MAINTENANCE_WINDOW_REPEAT TEXT;
        V_MAINTENANCE_WINDOW_START TIMESTAMPTZ;
        V_BE_SCHEDULE_ENABLE BOOL;
        V_MAINTENANCE_WINDOW_EXIST INT;
    BEGIN
        SELECT COUNT(*) INTO V_MAINTENANCE_WINDOW_EXIST FROM PG_CATALOG.PG_JOB WHERE JOB_NAME = 'maintenance_window_job' AND DBNAME = 'template1';
        IF CURRENT_DATABASE() != 'template1' THEN
            RAISE EXCEPTION 'Create maintenance_window FAILED, current database is not template1';
        END IF;
        IF V_MAINTENANCE_WINDOW_EXIST = 0 AND CURRENT_DATABASE() = 'template1' THEN
            SELECT
                CASE
                    WHEN NOW() < CURRENT_DATE + INTERVAL '22 HOUR' THEN CURRENT_DATE + INTERVAL '22 HOUR'
                    ELSE CURRENT_DATE + INTERVAL '1 DAY 22 HOUR'
                END INTO V_MAINTENANCE_WINDOW_START;
     
            --1. prepare for maintenance window schedule
            SELECT 'freq=daily;interval=1;byhour='||V_HOUR||';byminute='||V_MINUTE||';bysecond='||V_SECOND INTO V_MAINTENANCE_WINDOW_REPEAT;
            BEGIN
                SELECT
                    CASE
                        WHEN VALUE = 1 THEN TRUE -- DBE_ILM_ADMIN.ILM_ENABLED
                        ELSE FALSE
                    END INTO V_BE_SCHEDULE_ENABLE
                    FROM PG_CATALOG.GS_ILM_PARAM WHERE IDX = 7; -- DBE_ILM_ADMIN.ENABLED
            EXCEPTION
                WHEN OTHERS THEN
                    V_BE_SCHEDULE_ENABLE := FALSE;
            END;
     
            --2. Create ado window schedule
            DBE_SCHEDULER.CREATE_SCHEDULE(
                SCHEDULE_NAME => C_ADO_WINDOW_SCHEDULE_NAME,
                START_DATE => '9999-01-01 00:00:01',
                REPEAT_INTERVAL => NULL,
                END_DATE => NULL,
                COMMENTS => 'ado window schedule');
     
            --3. Create ado window program
            DBE_SCHEDULER.CREATE_PROGRAM(
                PROGRAM_NAME => C_ADO_WINDOW_PROGRAM_NAME,
                PROGRAM_TYPE => 'plsql_block',
                PROGRAM_ACTION => 'call prvt_ilm.be_execute_ilm();',
                NUMBER_OF_ARGUMENTS => 0,
                ENABLED => TRUE,
                COMMENTS => NULL);
     
            --4. Create maintenance window master job
            DBE_SCHEDULER.CREATE_JOB(
                JOB_NAME => C_MAINTENANCE_WINDOW_JOB_NAME,
                START_DATE => V_MAINTENANCE_WINDOW_START,
                REPEAT_INTERVAL => V_MAINTENANCE_WINDOW_REPEAT,
                END_DATE => NULL,
                JOB_TYPE => 'STORED_PROCEDURE'::TEXT,
                JOB_ACTION => 'prvt_ilm.be_active_ado_window'::TEXT,
                NUMBER_OF_ARGUMENTS => 0,
                ENABLED => V_BE_SCHEDULE_ENABLE,
                AUTO_DROP => FALSE,
                COMMENTS => 'maintenance window job'
    );
        END IF;
    END;
    /

    执行结果示例如下:

  2. 切换普通用户gsql登录数据库,创建带ILM策略的表,并插入数据(此步可替换为自己的表数据,添加ILM策略进行压缩测试)。

    template1=# CREATE DATABASE adb;
    template1=# \c adb
    adb=# ALTER DATABASE SET ILM = on;
    adb=# CREATE TABLE t1 (id int) WITH (orientation=row, compression=no, storage_type=astore) ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;
    adb=# INSERT INTO t1 SELECT * FROM generate_series(1, 10000000);

    执行结果示例如下:

    或者在已有表基础上,直接添加ILM策略。

    adb=# ALTER TABLE xxx ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;

    不支持系统表、全局临时表、本地临时表和序列表,不支持Ustore段页式表,不支持unlogged表,不支持IMCV表,不支持压缩toast数据。

  3. 配置ilm自动调度系统参数(该操作只在测试场景下建议修改,正常使用时不建议修改)。

    调用DBE_ILM_ADMIN.CUSTOMIZE_ILM接口来修改调度相关的系统参数,分别传入参数对应的id以及value。这里修改了三条数据,分别是将自动调度执行频率修改为1分钟1次、将数据变冷行的时间单位修改成秒、将每个压缩job每次压缩的数据量大小设置为10M。其他参数可以不用修改,使用默认配置即可。gs_ilm_param表参数说明请参见《参考》中“存储过程 > 高级包 > 二次封装接口(推荐) > DBE_ILM_ADMIN”章节中“DBE_ILM_ADMIN.CUSTOMIZE_ILM接口参数范围”表。
    adb=# \c adb
    adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(1, 1);
    adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 1);
    adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 10);

    执行结果示例如下:

  1. 等待3秒让数据变冷行之后,开启自动调度。

    adb=# \c adb
    adb=# SELECT pg_sleep(3);
    adb=# CALL DBE_ILM_ADMIN.DISABLE_ILM();
    adb=# CALL DBE_ILM_ADMIN.ENABLE_ILM();
    adb=# \c template1
    template1=# CALL DBE_SCHEDULER.set_attribute('maintenance_window_job','start_date',NOW());

    执行结果示例如下:

  1. 查询调度任务的压缩结果。

    template1=# \c adb
    adb=# SELECT * FROM gs_adm_ilmresults ORDER BY task_id DESC;

    执行结果示例如下:

    调度任务一分钟执行一次,所以每隔一分钟才会生成一个新的压缩job。SpaceSaving为压缩收益大小,值越大表示压缩收益越大。

    如果想让表尽快地压缩完成,可以将每个压缩job每次压缩的数据量大小设置得更大一些,比如1024MB,然后重新启动调度任务,并隔一分钟再次查看压缩结果。
    adb=# \c adb
    adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 1024);
    adb=# SELECT pg_sleep(3);
    adb=# CALL DBE_ILM_ADMIN.DISABLE_ILM();
    adb=# CALL DBE_ILM_ADMIN.ENABLE_ILM();
    adb=# \c template1
    template1=# CALL DBE_SCHEDULER.set_attribute('maintenance_window_job','start_date',NOW());
    template1=# \c adb
    adb=# SELECT * FROM gs_adm_ilmresults ORDER BY task_id DESC;

    执行结果示例如下:

  2. 测试完成后,建议恢复gs_ilm_param参数为初始值。

    adb=# BEGIN
      DBE_ILM_ADMIN.CUSTOMIZE_ILM(1, 15);
      DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 0);
      DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 1024);
      DBE_ILM_ADMIN.DISABLE_ILM();  --关闭自动调度
    END;
    /

相关文档