diff --git a/doc/docker/docker-compose.yaml b/doc/docker/docker-compose.yaml
index 8ddc67bd..b76cfd94 100644
--- a/doc/docker/docker-compose.yaml
+++ b/doc/docker/docker-compose.yaml
@@ -6,6 +6,7 @@ volumes:
     postgres: { }
     sqlserver: { }
     mariadb: { }
+    dm8: { }
 
 services:
     mysql:
@@ -84,3 +85,26 @@ services:
             - mariadb:/var/lib/mysql/
             # 注入初始化脚本, mysql
             - ../sql/snail_job_mysql.sql:/docker-entrypoint-initdb.d/init.sql:ro
+
+
+    dm8:
+        # wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
+        # docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
+        image: dm8_single:dm8_20230808_rev197096_x86_rh6_64
+        restart: unless-stopped
+        environment:
+            PAGE_SIZE: 16
+            LD_LIBRARY_PATH: /opt/dmdbms/bin
+            EXTENT_SIZE: 32
+            BLANK_PAD_MODE: 1
+            LOG_SIZE: 1024
+            UNICODE_FLAG: 1
+            LENGTH_IN_CHAR: 1
+            INSTANCE_NAME: dm8_test
+        ports:
+            - "5236:5236"
+        volumes:
+            - dm8:/opt/dmdbms/data
+            # docker compose exec dm8 bash -c "exec /opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql"
+            - ../sql/snail_job_dm8.sql:/tmp/schema.sql:ro
+
diff --git a/doc/sql/snail_job_dm8.sql b/doc/sql/snail_job_dm8.sql
new file mode 100644
index 00000000..42498f78
--- /dev/null
+++ b/doc/sql/snail_job_dm8.sql
@@ -0,0 +1,821 @@
+/*
+ SnailJob Database Transfer Tool
+ Source Server Type    : MySQL
+ Target Server Type    : DM8
+ Date: 2024-06-01 00:26:12
+*/
+
+
+-- sj_namespace
+CREATE TABLE sj_namespace
+(
+    id          bigint                                 NOT NULL PRIMARY KEY IDENTITY,
+    name        varchar(64)                            NULL,
+    unique_id   varchar(64)                            NULL,
+    description varchar(256) DEFAULT ''                NULL,
+    deleted     smallint     DEFAULT 0                 NOT NULL,
+    create_dt   datetime     DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    update_dt   datetime     DEFAULT CURRENT_TIMESTAMP NOT NULL
+);
+
+CREATE INDEX idx_sj_namespace_01 ON sj_namespace (name);
+
+COMMENT ON COLUMN sj_namespace.id IS '主键';
+COMMENT ON COLUMN sj_namespace.name IS '名称';
+COMMENT ON COLUMN sj_namespace.unique_id IS '唯一id';
+COMMENT ON COLUMN sj_namespace.description IS '描述';
+COMMENT ON COLUMN sj_namespace.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_namespace.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_namespace.update_dt IS '修改时间';
+COMMENT ON TABLE sj_namespace IS '命名空间';
+
+INSERT INTO sj_namespace (name, unique_id, create_dt, update_dt, deleted)
+VALUES ('Default', '764d604ec6fc45f68cd92514c40e9e1a', sysdate, sysdate, 0);
+
+-- sj_group_config
+CREATE TABLE sj_group_config
+(
+    id                bigint                                                     NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id      varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a'    NULL,
+    group_name        varchar(64)  DEFAULT ''                                    NULL,
+    description       varchar(256) DEFAULT ''                                    NULL,
+    token             varchar(64)  DEFAULT 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT' NULL,
+    group_status      smallint     DEFAULT 0                                     NOT NULL,
+    version           int                                                        NOT NULL,
+    group_partition   int                                                        NOT NULL,
+    id_generator_mode smallint     DEFAULT 1                                     NOT NULL,
+    init_scene        smallint     DEFAULT 0                                     NOT NULL,
+    bucket_index      int          DEFAULT 0                                     NOT NULL,
+    create_dt         datetime     DEFAULT CURRENT_TIMESTAMP                     NOT NULL,
+    update_dt         datetime     DEFAULT CURRENT_TIMESTAMP                     NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_group_config_01 ON sj_group_config (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_group_config.id IS '主键';
+COMMENT ON COLUMN sj_group_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_group_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_group_config.description IS '组描述';
+COMMENT ON COLUMN sj_group_config.token IS 'token';
+COMMENT ON COLUMN sj_group_config.group_status IS '组状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_group_config.version IS '版本号';
+COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
+COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
+COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
+COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_group_config IS '组配置';
+
+-- sj_notify_config
+CREATE TABLE sj_notify_config
+(
+    id                     bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id           varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name             varchar(64)                                             NULL,
+    business_id            varchar(64)                                             NULL,
+    system_task_type       smallint     DEFAULT 3                                  NOT NULL,
+    notify_status          smallint     DEFAULT 0                                  NOT NULL,
+    recipient_ids          varchar(128)                                            NULL,
+    notify_threshold       int          DEFAULT 0                                  NOT NULL,
+    notify_scene           smallint     DEFAULT 0                                  NOT NULL,
+    rate_limiter_status    smallint     DEFAULT 0                                  NOT NULL,
+    rate_limiter_threshold int          DEFAULT 0                                  NOT NULL,
+    description            varchar(256) DEFAULT ''                                 NULL,
+    create_dt              datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt              datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_notify_config_01 ON sj_notify_config (namespace_id, group_name, business_id);
+
+COMMENT ON COLUMN sj_notify_config.id IS '主键';
+COMMENT ON COLUMN sj_notify_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_notify_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_notify_config.business_id IS '业务id  ( job_id或workflow_id或scene_name ) ';
+COMMENT ON COLUMN sj_notify_config.system_task_type IS '任务类型 1. 重试任务 2. 重试回调 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_notify_config.notify_status IS '通知状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_notify_config.recipient_ids IS '接收人id列表';
+COMMENT ON COLUMN sj_notify_config.notify_threshold IS '通知阈值';
+COMMENT ON COLUMN sj_notify_config.notify_scene IS '通知场景';
+COMMENT ON COLUMN sj_notify_config.rate_limiter_status IS '限流状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_notify_config.rate_limiter_threshold IS '每秒限流阈值';
+COMMENT ON COLUMN sj_notify_config.description IS '描述';
+COMMENT ON COLUMN sj_notify_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_notify_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_notify_config IS '通知配置';
+
+-- sj_notify_recipient
+CREATE TABLE sj_notify_recipient
+(
+    id               bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id     varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    recipient_name   varchar(64)                                             NULL,
+    notify_type      smallint     DEFAULT 0                                  NOT NULL,
+    notify_attribute varchar(512)                                            NULL,
+    description      varchar(256) DEFAULT ''                                 NULL,
+    create_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_notify_recipient_01 ON sj_notify_recipient (namespace_id);
+
+COMMENT ON COLUMN sj_notify_recipient.id IS '主键';
+COMMENT ON COLUMN sj_notify_recipient.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_notify_recipient.recipient_name IS '接收人名称';
+COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook';
+COMMENT ON COLUMN sj_notify_recipient.notify_attribute IS '配置属性';
+COMMENT ON COLUMN sj_notify_recipient.description IS '描述';
+COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
+COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
+
+-- sj_retry_dead_letter_0
+CREATE TABLE sj_retry_dead_letter_0
+(
+    id            bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id  varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    unique_id     varchar(64)                                             NULL,
+    group_name    varchar(64)                                             NULL,
+    scene_name    varchar(64)                                             NULL,
+    idempotent_id varchar(64)                                             NULL,
+    biz_no        varchar(64)  DEFAULT ''                                 NULL,
+    executor_name varchar(512) DEFAULT ''                                 NULL,
+    args_str      text                                                    NULL,
+    ext_attrs     text                                                    NULL,
+    task_type     smallint     DEFAULT 1                                  NOT NULL,
+    create_dt     datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
+
+CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
+CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
+CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
+
+COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
+COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
+
+-- sj_retry_task_0
+CREATE TABLE sj_retry_task_0
+(
+    id              bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id    varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    unique_id       varchar(64)                                             NULL,
+    group_name      varchar(64)                                             NULL,
+    scene_name      varchar(64)                                             NULL,
+    idempotent_id   varchar(64)                                             NULL,
+    biz_no          varchar(64)  DEFAULT ''                                 NULL,
+    executor_name   varchar(512) DEFAULT ''                                 NULL,
+    args_str        text                                                    NULL,
+    ext_attrs       text                                                    NULL,
+    next_trigger_at datetime                                                NOT NULL,
+    retry_count     int          DEFAULT 0                                  NOT NULL,
+    retry_status    smallint     DEFAULT 0                                  NOT NULL,
+    task_type       smallint     DEFAULT 1                                  NOT NULL,
+    create_dt       datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt       datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
+
+CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
+CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
+CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
+CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
+CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_0.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
+COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task_0 IS '任务表';
+
+-- sj_retry_task_log
+CREATE TABLE sj_retry_task_log
+(
+    id            bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id  varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    unique_id     varchar(64)                                             NULL,
+    group_name    varchar(64)                                             NULL,
+    scene_name    varchar(64)                                             NULL,
+    idempotent_id varchar(64)                                             NULL,
+    biz_no        varchar(64)  DEFAULT ''                                 NULL,
+    executor_name varchar(512) DEFAULT ''                                 NULL,
+    args_str      text                                                    NULL,
+    ext_attrs     text                                                    NULL,
+    retry_status  smallint     DEFAULT 0                                  NOT NULL,
+    task_type     smallint     DEFAULT 1                                  NOT NULL,
+    create_dt     datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt     datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
+CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
+CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
+CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
+CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
+COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
+
+-- sj_retry_task_log_message
+CREATE TABLE sj_retry_task_log_message
+(
+    id           bigint                                                 NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name   varchar(64)                                            NULL,
+    unique_id    varchar(64)                                            NULL,
+    message      text                                                   NULL,
+    log_num      int         DEFAULT 1                                  NOT NULL,
+    real_time    bigint      DEFAULT 0                                  NOT NULL,
+    create_dt    datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
+CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
+COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
+COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
+COMMENT ON COLUMN sj_retry_task_log_message.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表';
+
+-- sj_retry_scene_config
+CREATE TABLE sj_retry_scene_config
+(
+    id               bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id     varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    scene_name       varchar(64)                                             NULL,
+    group_name       varchar(64)                                             NULL,
+    scene_status     smallint     DEFAULT 0                                  NOT NULL,
+    max_retry_count  int          DEFAULT 5                                  NOT NULL,
+    back_off         smallint     DEFAULT 1                                  NOT NULL,
+    trigger_interval varchar(16)  DEFAULT ''                                 NULL,
+    deadline_request bigint       DEFAULT 60000                              NOT NULL,
+    executor_timeout int          DEFAULT 5                                  NOT NULL,
+    route_key        smallint     DEFAULT 4                                  NOT NULL,
+    description      varchar(256) DEFAULT ''                                 NULL,
+    create_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_scene_config_01 ON sj_retry_scene_config (namespace_id, group_name, scene_name);
+
+COMMENT ON COLUMN sj_retry_scene_config.id IS '主键';
+COMMENT ON COLUMN sj_retry_scene_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_scene_config.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_scene_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_scene_config.scene_status IS '组状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_retry_scene_config.max_retry_count IS '最大重试次数';
+COMMENT ON COLUMN sj_retry_scene_config.back_off IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
+COMMENT ON COLUMN sj_retry_scene_config.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
+COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
+COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
+COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_scene_config IS '场景配置';
+
+-- sj_server_node
+CREATE TABLE sj_server_node
+(
+    id           bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name   varchar(64)                                             NULL,
+    host_id      varchar(64)                                             NULL,
+    host_ip      varchar(64)                                             NULL,
+    host_port    int                                                     NOT NULL,
+    expire_at    datetime                                                NOT NULL,
+    node_type    smallint                                                NOT NULL,
+    ext_attrs    varchar(256) DEFAULT ''                                 NULL,
+    create_dt    datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt    datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_server_node_01 ON sj_server_node (host_id, host_ip);
+
+CREATE INDEX idx_sj_server_node_01 ON sj_server_node (namespace_id, group_name);
+CREATE INDEX idx_sj_server_node_02 ON sj_server_node (expire_at, node_type);
+
+COMMENT ON COLUMN sj_server_node.id IS '主键';
+COMMENT ON COLUMN sj_server_node.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_server_node.group_name IS '组名称';
+COMMENT ON COLUMN sj_server_node.host_id IS '主机id';
+COMMENT ON COLUMN sj_server_node.host_ip IS '机器ip';
+COMMENT ON COLUMN sj_server_node.host_port IS '机器端口';
+COMMENT ON COLUMN sj_server_node.expire_at IS '过期时间';
+COMMENT ON COLUMN sj_server_node.node_type IS '节点类型 1、客户端 2、是服务端';
+COMMENT ON COLUMN sj_server_node.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_server_node.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_server_node.update_dt IS '修改时间';
+COMMENT ON TABLE sj_server_node IS '服务器节点';
+
+-- sj_distributed_lock
+CREATE TABLE sj_distributed_lock
+(
+    id         bigint                                    NOT NULL PRIMARY KEY IDENTITY,
+    name       varchar(64)                               NULL,
+    lock_until timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,
+    locked_at  timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,
+    locked_by  varchar(255)                              NULL,
+    create_dt  datetime     DEFAULT CURRENT_TIMESTAMP    NOT NULL,
+    update_dt  datetime     DEFAULT CURRENT_TIMESTAMP    NOT NULL
+);
+
+COMMENT ON COLUMN sj_distributed_lock.id IS '主键';
+COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称';
+COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长';
+COMMENT ON COLUMN sj_distributed_lock.locked_at IS '锁定时间';
+COMMENT ON COLUMN sj_distributed_lock.locked_by IS '锁定者';
+COMMENT ON COLUMN sj_distributed_lock.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_distributed_lock.update_dt IS '修改时间';
+COMMENT ON TABLE sj_distributed_lock IS '锁定表';
+
+-- sj_system_user
+CREATE TABLE sj_system_user
+(
+    id        bigint                             NOT NULL PRIMARY KEY IDENTITY,
+    username  varchar(64)                        NULL,
+    password  varchar(128)                       NULL,
+    role      smallint DEFAULT 0                 NOT NULL,
+    create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL
+);
+
+COMMENT ON COLUMN sj_system_user.id IS '主键';
+COMMENT ON COLUMN sj_system_user.username IS '账号';
+COMMENT ON COLUMN sj_system_user.password IS '密码';
+COMMENT ON COLUMN sj_system_user.role IS '角色:1-普通用户、2-管理员';
+COMMENT ON COLUMN sj_system_user.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_system_user.update_dt IS '修改时间';
+COMMENT ON TABLE sj_system_user IS '系统用户表';
+
+INSERT INTO sj_system_user (username, password, role)
+VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2);
+
+-- sj_system_user_permission
+CREATE TABLE sj_system_user_permission
+(
+    id             bigint                                                 NOT NULL PRIMARY KEY IDENTITY,
+    group_name     varchar(64)                                            NULL,
+    namespace_id   varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    system_user_id bigint                                                 NOT NULL,
+    create_dt      datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt      datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_system_user_permission_01 ON sj_system_user_permission (namespace_id, group_name, system_user_id);
+
+COMMENT ON COLUMN sj_system_user_permission.id IS '主键';
+COMMENT ON COLUMN sj_system_user_permission.group_name IS '组名称';
+COMMENT ON COLUMN sj_system_user_permission.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_system_user_permission.system_user_id IS '系统用户id';
+COMMENT ON COLUMN sj_system_user_permission.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_system_user_permission.update_dt IS '修改时间';
+COMMENT ON TABLE sj_system_user_permission IS '系统用户权限表';
+
+-- sj_sequence_alloc
+CREATE TABLE sj_sequence_alloc
+(
+    id           bigint                                                 NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name   varchar(64) DEFAULT ''                                 NULL,
+    max_id       bigint      DEFAULT 1                                  NOT NULL,
+    step         int         DEFAULT 100                                NOT NULL,
+    update_dt    datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_sequence_alloc_01 ON sj_sequence_alloc (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_sequence_alloc.id IS '主键';
+COMMENT ON COLUMN sj_sequence_alloc.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_sequence_alloc.group_name IS '组名称';
+COMMENT ON COLUMN sj_sequence_alloc.max_id IS '最大id';
+COMMENT ON COLUMN sj_sequence_alloc.step IS '步长';
+COMMENT ON COLUMN sj_sequence_alloc.update_dt IS '更新时间';
+COMMENT ON TABLE sj_sequence_alloc IS '号段模式序号ID分配表';
+
+-- sj_job
+CREATE TABLE sj_job
+(
+    id               bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id     varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name       varchar(64)                                             NULL,
+    job_name         varchar(64)                                             NULL,
+    args_str         text         DEFAULT NULL                               NULL,
+    args_type        smallint     DEFAULT 1                                  NOT NULL,
+    next_trigger_at  bigint                                                  NOT NULL,
+    job_status       smallint     DEFAULT 1                                  NOT NULL,
+    task_type        smallint     DEFAULT 1                                  NOT NULL,
+    route_key        smallint     DEFAULT 4                                  NOT NULL,
+    executor_type    smallint     DEFAULT 1                                  NOT NULL,
+    executor_info    varchar(255) DEFAULT NULL                               NULL,
+    trigger_type     smallint                                                NOT NULL,
+    trigger_interval varchar(255)                                            NULL,
+    block_strategy   smallint     DEFAULT 1                                  NOT NULL,
+    executor_timeout int          DEFAULT 0                                  NOT NULL,
+    max_retry_times  int          DEFAULT 0                                  NOT NULL,
+    parallel_num     int          DEFAULT 1                                  NOT NULL,
+    retry_interval   int          DEFAULT 0                                  NOT NULL,
+    bucket_index     int          DEFAULT 0                                  NOT NULL,
+    resident         smallint     DEFAULT 0                                  NOT NULL,
+    description      varchar(256) DEFAULT ''                                 NULL,
+    ext_attrs        varchar(256) DEFAULT ''                                 NULL,
+    deleted          smallint     DEFAULT 0                                  NOT NULL,
+    create_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
+CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
+CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
+
+COMMENT ON COLUMN sj_job.id IS '主键';
+COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job.group_name IS '组名称';
+COMMENT ON COLUMN sj_job.job_name IS '名称';
+COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_job.args_type IS '参数类型 ';
+COMMENT ON COLUMN sj_job.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_job.job_status IS '任务状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_job.task_type IS '任务类型 1、集群 2、广播 3、切片';
+COMMENT ON COLUMN sj_job.route_key IS '路由策略';
+COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
+COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
+COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
+COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
+COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
+COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
+COMMENT ON COLUMN sj_job.description IS '描述';
+COMMENT ON COLUMN sj_job.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job IS '任务信息';
+
+-- sj_job_log_message
+CREATE TABLE sj_job_log_message
+(
+    id            bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id  varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name    varchar(64)                                             NULL,
+    job_id        bigint                                                  NOT NULL,
+    task_batch_id bigint                                                  NOT NULL,
+    task_id       bigint                                                  NOT NULL,
+    message       text                                                    NULL,
+    log_num       int          DEFAULT 1                                  NOT NULL,
+    real_time     bigint       DEFAULT 0                                  NOT NULL,
+    ext_attrs     varchar(256) DEFAULT ''                                 NULL,
+    create_dt     datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_job_log_message_01 ON sj_job_log_message (task_batch_id, task_id);
+CREATE INDEX idx_sj_job_log_message_02 ON sj_job_log_message (create_dt);
+CREATE INDEX idx_sj_job_log_message_03 ON sj_job_log_message (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_job_log_message.id IS '主键';
+COMMENT ON COLUMN sj_job_log_message.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_log_message.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_log_message.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_job_log_message.task_batch_id IS '任务批次id';
+COMMENT ON COLUMN sj_job_log_message.task_id IS '调度任务id';
+COMMENT ON COLUMN sj_job_log_message.message IS '调度信息';
+COMMENT ON COLUMN sj_job_log_message.log_num IS '日志数量';
+COMMENT ON COLUMN sj_job_log_message.real_time IS '上报时间';
+COMMENT ON COLUMN sj_job_log_message.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_log_message.create_dt IS '创建时间';
+COMMENT ON TABLE sj_job_log_message IS '调度日志';
+
+-- sj_job_task
+CREATE TABLE sj_job_task
+(
+    id             bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id   varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name     varchar(64)                                             NULL,
+    job_id         bigint                                                  NOT NULL,
+    task_batch_id  bigint                                                  NOT NULL,
+    parent_id      bigint       DEFAULT 0                                  NOT NULL,
+    task_status    smallint     DEFAULT 0                                  NOT NULL,
+    retry_count    int          DEFAULT 0                                  NOT NULL,
+    client_info    varchar(128) DEFAULT NULL                               NULL,
+    result_message text                                                    NULL,
+    args_str       text         DEFAULT NULL                               NULL,
+    args_type      smallint     DEFAULT 1                                  NOT NULL,
+    ext_attrs      varchar(256) DEFAULT ''                                 NULL,
+    create_dt      datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt      datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_job_task_01 ON sj_job_task (task_batch_id, task_status);
+CREATE INDEX idx_sj_job_task_02 ON sj_job_task (create_dt);
+CREATE INDEX idx_sj_job_task_03 ON sj_job_task (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_job_task.id IS '主键';
+COMMENT ON COLUMN sj_job_task.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_task.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_task.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_job_task.task_batch_id IS '调度任务id';
+COMMENT ON COLUMN sj_job_task.parent_id IS '父执行器id';
+COMMENT ON COLUMN sj_job_task.task_status IS '执行的状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_job_task.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_job_task.client_info IS '客户端地址 clientId#ip:port';
+COMMENT ON COLUMN sj_job_task.result_message IS '执行结果';
+COMMENT ON COLUMN sj_job_task.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_job_task.args_type IS '参数类型 ';
+COMMENT ON COLUMN sj_job_task.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_task.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_task.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_task IS '任务实例';
+
+-- sj_job_task_batch
+CREATE TABLE sj_job_task_batch
+(
+    id                      bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id            varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name              varchar(64)                                             NULL,
+    job_id                  bigint                                                  NOT NULL,
+    workflow_node_id        bigint       DEFAULT 0                                  NOT NULL,
+    parent_workflow_node_id bigint       DEFAULT 0                                  NOT NULL,
+    workflow_task_batch_id  bigint       DEFAULT 0                                  NOT NULL,
+    task_batch_status       smallint     DEFAULT 0                                  NOT NULL,
+    operation_reason        smallint     DEFAULT 0                                  NOT NULL,
+    execution_at            bigint       DEFAULT 0                                  NOT NULL,
+    system_task_type        smallint     DEFAULT 3                                  NOT NULL,
+    parent_id               varchar(64)  DEFAULT ''                                 NULL,
+    ext_attrs               varchar(256) DEFAULT ''                                 NULL,
+    deleted                 smallint     DEFAULT 0                                  NOT NULL,
+    create_dt               datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt               datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_job_task_batch_01 ON sj_job_task_batch (job_id, task_batch_status);
+CREATE INDEX idx_sj_job_task_batch_02 ON sj_job_task_batch (create_dt);
+CREATE INDEX idx_sj_job_task_batch_03 ON sj_job_task_batch (namespace_id, group_name);
+CREATE INDEX idx_sj_job_task_batch_04 ON sj_job_task_batch (workflow_task_batch_id, workflow_node_id);
+
+COMMENT ON COLUMN sj_job_task_batch.id IS '主键';
+COMMENT ON COLUMN sj_job_task_batch.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_task_batch.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_task_batch.job_id IS '任务id';
+COMMENT ON COLUMN sj_job_task_batch.workflow_node_id IS '工作流节点id';
+COMMENT ON COLUMN sj_job_task_batch.parent_workflow_node_id IS '工作流任务父批次id';
+COMMENT ON COLUMN sj_job_task_batch.workflow_task_batch_id IS '工作流任务批次id';
+COMMENT ON COLUMN sj_job_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_job_task_batch.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_job_task_batch.execution_at IS '任务执行时间';
+COMMENT ON COLUMN sj_job_task_batch.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_job_task_batch.parent_id IS '父节点';
+COMMENT ON COLUMN sj_job_task_batch.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_task_batch.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_job_task_batch.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_task_batch.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_task_batch IS '任务批次';
+
+-- sj_job_summary
+CREATE TABLE sj_job_summary
+(
+    id               bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id     varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name       varchar(64)  DEFAULT ''                                 NULL,
+    business_id      bigint                                                  NOT NULL,
+    system_task_type smallint     DEFAULT 3                                  NOT NULL,
+    trigger_at       datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    success_num      int          DEFAULT 0                                  NOT NULL,
+    fail_num         int          DEFAULT 0                                  NOT NULL,
+    fail_reason      varchar(512) DEFAULT ''                                 NULL,
+    stop_num         int          DEFAULT 0                                  NOT NULL,
+    stop_reason      varchar(512) DEFAULT ''                                 NULL,
+    cancel_num       int          DEFAULT 0                                  NOT NULL,
+    cancel_reason    varchar(512) DEFAULT ''                                 NULL,
+    create_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_job_summary_01 ON sj_job_summary (trigger_at, system_task_type, business_id);
+
+CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name, business_id);
+
+COMMENT ON COLUMN sj_job_summary.id IS '主键';
+COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id ) ';
+COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
+COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';
+COMMENT ON COLUMN sj_job_summary.fail_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.fail_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.stop_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.stop_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.cancel_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.cancel_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_summary.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_summary IS 'DashBoard_Job';
+
+-- sj_retry_summary
+CREATE TABLE sj_retry_summary
+(
+    id            bigint                                                 NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id  varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name    varchar(64) DEFAULT ''                                 NULL,
+    scene_name    varchar(50) DEFAULT ''                                 NULL,
+    trigger_at    datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    running_num   int         DEFAULT 0                                  NOT NULL,
+    finish_num    int         DEFAULT 0                                  NOT NULL,
+    max_count_num int         DEFAULT 0                                  NOT NULL,
+    suspend_num   int         DEFAULT 0                                  NOT NULL,
+    create_dt     datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt     datetime    DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_summary_01 ON sj_retry_summary (namespace_id, group_name, scene_name, trigger_at);
+
+CREATE INDEX idx_sj_retry_summary_01 ON sj_retry_summary (trigger_at);
+
+COMMENT ON COLUMN sj_retry_summary.id IS '主键';
+COMMENT ON COLUMN sj_retry_summary.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_summary.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_summary.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_summary.trigger_at IS '统计时间';
+COMMENT ON COLUMN sj_retry_summary.running_num IS '重试中-日志数量';
+COMMENT ON COLUMN sj_retry_summary.finish_num IS '重试完成-日志数量';
+COMMENT ON COLUMN sj_retry_summary.max_count_num IS '重试到达最大次数-日志数量';
+COMMENT ON COLUMN sj_retry_summary.suspend_num IS '暂停重试-日志数量';
+COMMENT ON COLUMN sj_retry_summary.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_summary.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_summary IS 'DashBoard_Retry';
+
+-- sj_workflow
+CREATE TABLE sj_workflow
+(
+    id               bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    workflow_name    varchar(64)                                             NULL,
+    namespace_id     varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name       varchar(64)                                             NULL,
+    workflow_status  smallint     DEFAULT 1                                  NOT NULL,
+    trigger_type     smallint                                                NOT NULL,
+    trigger_interval varchar(255)                                            NULL,
+    next_trigger_at  bigint                                                  NOT NULL,
+    block_strategy   smallint     DEFAULT 1                                  NOT NULL,
+    executor_timeout int          DEFAULT 0                                  NOT NULL,
+    description      varchar(256) DEFAULT ''                                 NULL,
+    flow_info        text         DEFAULT NULL                               NULL,
+    bucket_index     int          DEFAULT 0                                  NOT NULL,
+    version          int                                                     NOT NULL,
+    ext_attrs        varchar(256) DEFAULT ''                                 NULL,
+    deleted          smallint     DEFAULT 0                                  NOT NULL,
+    create_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
+CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow.id IS '主键';
+COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
+COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+COMMENT ON COLUMN sj_workflow.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_workflow.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_workflow.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_workflow.description IS '描述';
+COMMENT ON COLUMN sj_workflow.flow_info IS '流程信息';
+COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_workflow.version IS '版本号';
+COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow IS '工作流';
+
+-- sj_workflow_node
+CREATE TABLE sj_workflow_node
+(
+    id                   bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id         varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    node_name            varchar(64)                                             NULL,
+    group_name           varchar(64)                                             NULL,
+    job_id               bigint                                                  NOT NULL,
+    workflow_id          bigint                                                  NOT NULL,
+    node_type            smallint     DEFAULT 1                                  NOT NULL,
+    expression_type      smallint     DEFAULT 0                                  NOT NULL,
+    fail_strategy        smallint     DEFAULT 1                                  NOT NULL,
+    workflow_node_status smallint     DEFAULT 1                                  NOT NULL,
+    priority_level       int          DEFAULT 1                                  NOT NULL,
+    node_info            text         DEFAULT NULL                               NULL,
+    version              int                                                     NOT NULL,
+    ext_attrs            varchar(256) DEFAULT ''                                 NULL,
+    deleted              smallint     DEFAULT 0                                  NOT NULL,
+    create_dt            datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt            datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_workflow_node_01 ON sj_workflow_node (create_dt);
+CREATE INDEX idx_sj_workflow_node_02 ON sj_workflow_node (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow_node.id IS '主键';
+COMMENT ON COLUMN sj_workflow_node.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow_node.node_name IS '节点名称';
+COMMENT ON COLUMN sj_workflow_node.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow_node.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_workflow_node.workflow_id IS '工作流ID';
+COMMENT ON COLUMN sj_workflow_node.node_type IS '1、任务节点 2、条件节点';
+COMMENT ON COLUMN sj_workflow_node.expression_type IS '1、SpEl、2、Aviator 3、QL';
+COMMENT ON COLUMN sj_workflow_node.fail_strategy IS '失败策略 1、跳过 2、阻塞';
+COMMENT ON COLUMN sj_workflow_node.workflow_node_status IS '工作流节点状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_workflow_node.priority_level IS '优先级';
+COMMENT ON COLUMN sj_workflow_node.node_info IS '节点信息 ';
+COMMENT ON COLUMN sj_workflow_node.version IS '版本号';
+COMMENT ON COLUMN sj_workflow_node.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow_node.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow_node.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow_node.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow_node IS '工作流节点';
+
+-- sj_workflow_task_batch
+CREATE TABLE sj_workflow_task_batch
+(
+    id                bigint                                                  NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id      varchar(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name        varchar(64)                                             NULL,
+    workflow_id       bigint                                                  NOT NULL,
+    task_batch_status smallint     DEFAULT 0                                  NOT NULL,
+    operation_reason  smallint     DEFAULT 0                                  NOT NULL,
+    flow_info         text         DEFAULT NULL                               NULL,
+    execution_at      bigint       DEFAULT 0                                  NOT NULL,
+    ext_attrs         varchar(256) DEFAULT ''                                 NULL,
+    deleted           smallint     DEFAULT 0                                  NOT NULL,
+    create_dt         datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt         datetime     DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+);
+
+CREATE INDEX idx_sj_workflow_task_batch_01 ON sj_workflow_task_batch (workflow_id, task_batch_status);
+CREATE INDEX idx_sj_workflow_task_batch_02 ON sj_workflow_task_batch (create_dt);
+CREATE INDEX idx_sj_workflow_task_batch_03 ON sj_workflow_task_batch (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow_task_batch.id IS '主键';
+COMMENT ON COLUMN sj_workflow_task_batch.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow_task_batch.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow_task_batch.workflow_id IS '工作流任务id';
+COMMENT ON COLUMN sj_workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_workflow_task_batch.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_workflow_task_batch.flow_info IS '流程信息';
+COMMENT ON COLUMN sj_workflow_task_batch.execution_at IS '任务执行时间';
+COMMENT ON COLUMN sj_workflow_task_batch.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次';
+
diff --git a/doc/tool/dbsync.py b/doc/tool/dbsync.py
index 7b70be5f..6dd06689 100755
--- a/doc/tool/dbsync.py
+++ b/doc/tool/dbsync.py
@@ -626,13 +626,156 @@ GO
         return script
 
 
+class DM8Convertor(Convertor):
+    def __init__(self, src):
+        super().__init__(src, "DM8")
+
+        # if type == "varchar":
+        #     return f"varchar2({size if size < 4000 else 4000})"
+        # if type in ("int", "int unsigned"):
+        #     return "number"
+        # if type == "bigint" or type == "bigint unsigned":
+        #     return "number"
+        # if type == "datetime":
+        #     return "date"
+        # if type == "timestamp":
+        #     return f"timestamp({size})"
+        # if type == "bit":
+        #     return "number(1,0)"
+        # if type in ("tinyint", "smallint"):
+        #     return "smallint"
+        # if type in ("text", "longtext"):
+        #     return "clob"
+        # if type in ("blob", "mediumblob"):
+        #     return "blob"
+        # if type == "decimal":
+        #     return (
+        #         f"number({','.join(str(s) for s in size)})" if len(size) else "number"
+        #     )
+
+    def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
+        """类型转换"""
+        type = type.lower()
+
+        if type == "varchar":
+            return f"varchar({size})"
+        if type in ("int", "int unsigned"):
+            return "int"
+        if type in ("bigint", "bigint unsigned"):
+            return "bigint"
+        if type == "datetime":
+            return "datetime"
+        if type == "timestamp":
+            return f"timestamp({size})"
+        if type == "bit":
+            return "bit"
+        if type in ("tinyint", "smallint"):
+            return "smallint"
+        if type in ("text", "longtext"):
+            return "text"
+        if type in ("blob", "mediumblob"):
+            return "blob"
+        if type == "decimal":
+            return (
+                f"decimal({','.join(str(s) for s in size)})" if len(size) else "decimal"
+            )
+
+    def gen_create(self, ddl) -> str:
+        """生成 CREATE 语句"""
+
+        def generate_column(col):
+            name = col["name"].lower()
+            if name == "id":
+                return "id bigint NOT NULL PRIMARY KEY IDENTITY"
+
+            type = col["type"].lower()
+            full_type = self.translate_type(type, col["size"])
+            nullable = "NULL" if col["nullable"] else "NOT NULL"
+            # Oracle的 INSERT '' 不能通过NOT NULL校验,因此对文字类型字段覆写为 NULL
+            nullable = "NULL" if type in ("varchar", "text", "longtext") else nullable
+            default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
+            # Oracle 中 size 不能作为字段名
+            field_name = '"size"' if name == "size" else name
+            # Oracle DEFAULT 定义在 NULLABLE 之前
+            return f"{field_name} {full_type} {default} {nullable}"
+
+        table_name = ddl["table_name"].lower()
+        columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]]
+        field_def_list = ",\n    ".join(columns)
+        script = f"""-- {table_name}
+CREATE TABLE {table_name} (
+    {field_def_list}
+);"""
+
+        # oracle INSERT '' 不能通过 NOT NULL 校验
+        # script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL")
+
+        return script
+
+    def gen_index(self, ddl: Dict) -> str:
+        return "\n".join(f"{script};" for script in self.index(ddl))
+
+    def gen_comment(self, table_ddl: Dict) -> str:
+        script = ""
+        for column in table_ddl["columns"]:
+            table_comment = column["comment"]
+            script += (
+                f"COMMENT ON COLUMN {table_ddl['table_name']}.{column['name']} IS '{table_comment}';"
+                + "\n"
+            )
+
+        table_comment = table_ddl["comment"]
+        if table_comment:
+            script += (
+                f"COMMENT ON TABLE {table_ddl['table_name']} IS '{table_comment}';\n"
+            )
+
+        return script
+
+    def gen_pk(self, table_name: str) -> str:
+        """生成主键定义"""
+        return ""
+
+    def gen_uk(self, table_ddl: Dict) -> str:
+        script = ""
+        uk_list = list(Convertor.unique_index(table_ddl))
+        for idx, (table_name, _, uk_columns) in enumerate(uk_list, 1):
+            uk_name = f"uk_{table_name}_{idx:02d}"
+            script += f"CREATE UNIQUE INDEX {uk_name} ON {table_name} ({', '.join(uk_columns)});\n"
+
+        return script
+
+    def gen_index(self, ddl: Dict) -> str:
+        return "\n".join(f"{script};" for script in self.index(ddl))
+
+    def gen_insert(self, table_name: str) -> str:
+        """拷贝 INSERT 语句"""
+        inserts = []
+        for insert_script in Convertor.inserts(table_name, self.content):
+            insert_script = (
+                insert_script.replace("(id,", "(")
+                .replace("VALUES (1,", "VALUES (")
+                .replace("now(),", "sysdate,")
+            )
+            inserts.append(insert_script)
+
+        ## 生成 insert 脚本
+        script = ""
+        if inserts:
+            inserts_lines = "\n".join(inserts)
+            script += f"""\n\n
+{inserts_lines}"""
+
+        return script
+
+
 def main():
     parser = argparse.ArgumentParser(description="Snail Job Database Transfer Tool")
     parser.add_argument(
         "type",
         type=str,
         help="Target database type",
-        choices=["postgre", "oracle", "sqlserver"],
+        choices=["postgre", "oracle", "sqlserver", "dm8"],
     )
     args = parser.parse_args()
 
@@ -644,6 +787,8 @@ def main():
         convertor = OracleConvertor(sql_file)
     elif args.type == "sqlserver":
         convertor = SQLServerConvertor(sql_file)
+    elif args.type ==  "dm8":
+        convertor = DM8Convertor(sql_file)
     else:
         raise NotImplementedError(f"Database type not supported: {args.type}")
 
diff --git a/pom.xml b/pom.xml
index e72ac3da..0503ab95 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,6 +101,11 @@
                 snail-job-sqlserver-datasource
                 ${revision}
             
+            
+                com.aizuda
+                snail-job-dm8-datasource
+                ${revision}
+            
             
                 cn.hutool
                 hutool-http
diff --git a/snail-job-datasource/pom.xml b/snail-job-datasource/pom.xml
index 3566194c..8fdc5c69 100644
--- a/snail-job-datasource/pom.xml
+++ b/snail-job-datasource/pom.xml
@@ -26,6 +26,7 @@
         snail-job-postgres-datasource
         snail-job-oracle-datasource
         snail-job-sqlserver-datasource
+        snail-job-dm8-datasource
         snail-job-datasource-template
     
 
diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java
index b89704d9..078756a9 100644
--- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java
@@ -48,7 +48,8 @@ public abstract class AbstractConfigAccess implements ConfigAccess {
             DbTypeEnum.MARIADB.getDb(),
             DbTypeEnum.POSTGRES.getDb(),
             DbTypeEnum.ORACLE.getDb(),
-            DbTypeEnum.SQLSERVER.getDb());
+            DbTypeEnum.SQLSERVER.getDb(),
+            DbTypeEnum.DM.getDb());
 
     protected DbTypeEnum getDbType() {
         return DbUtils.getDbType();
diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java
index 44f2a798..76389eed 100644
--- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java
@@ -22,7 +22,8 @@ public abstract class AbstractTaskAccess implements TaskAccess {
             DbTypeEnum.MARIADB.getDb(),
             DbTypeEnum.POSTGRES.getDb(),
             DbTypeEnum.ORACLE.getDb(),
-            DbTypeEnum.SQLSERVER.getDb());
+            DbTypeEnum.SQLSERVER.getDb(),
+            DbTypeEnum.DM.getDb());
 
     protected DbTypeEnum getDbType() {
         return DbUtils.getDbType();
diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java
index bbe44ed1..b300c4ae 100644
--- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java
@@ -19,7 +19,8 @@ public enum DbTypeEnum {
     MARIADB("mariadb", "MariaDB数据库", DbType.MARIADB),
     POSTGRES("postgresql", "Postgres数据库", DbType.POSTGRE_SQL),
     ORACLE("oracle", "Oracle数据库", DbType.ORACLE_12C),
-    SQLSERVER("sqlserver", "SQLServer数据库", DbType.SQL_SERVER);
+    SQLSERVER("sqlserver", "SQLServer数据库", DbType.SQL_SERVER),
+    DM("dm", "达梦数据库", DbType.DM);
 
     private final String db;
     private final String desc;
diff --git a/snail-job-datasource/snail-job-dm8-datasource/.gitignore b/snail-job-datasource/snail-job-dm8-datasource/.gitignore
new file mode 100644
index 00000000..a73f4141
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/.gitignore
@@ -0,0 +1,35 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+.flattened-pom.xml
diff --git a/snail-job-datasource/snail-job-dm8-datasource/pom.xml b/snail-job-datasource/snail-job-dm8-datasource/pom.xml
new file mode 100644
index 00000000..c0102cd1
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/pom.xml
@@ -0,0 +1,59 @@
+
+
+    4.0.0
+    
+        com.aizuda
+        snail-job-datasource
+        ${revision}
+        ../pom.xml
+    
+
+    snail-job-dm8-datasource
+    snail-job-dm8-datasource
+    snail-job-dm8-datasource
+    jar
+
+    
+        17
+        8.1.3.62
+    
+
+    
+        
+            org.projectlombok
+            lombok
+            true
+        
+        
+            com.aizuda
+            snail-job-datasource-template
+        
+        
+            com.dameng
+            DmJdbcDriver18
+            ${dameng.version}
+        
+    
+
+    
+        
+            
+                org.springframework.boot
+                spring-boot-maven-plugin
+                
+                    none     
+                    execute    
+                
+                
+                    
+                        
+                            repackage
+                        
+                    
+                
+            
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml
new file mode 100644
index 00000000..a3a0ab59
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+    
+    
+        INSERT INTO sj_job_log_message (namespace_id, group_name, job_id, task_batch_id, task_id,
+                                        log_num, message, create_dt, real_time)
+        VALUES
+        
+            (
+                #{item.namespaceId},
+                #{item.groupName},
+                #{item.jobId},
+                #{item.taskBatchId},
+                #{item.taskId},
+                #{item.logNum},
+                #{item.message},
+                #{item.createDt},
+                #{item.realTime}
+            )
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml
new file mode 100644
index 00000000..17fa63ba
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml
@@ -0,0 +1,13 @@
+
+
+
+
+    
+        
+            UPDATE sj_job
+               SET next_trigger_at = #{item.nextTriggerAt}
+             WHERE id = #{item.id}
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml
new file mode 100644
index 00000000..bb3c94dc
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml
@@ -0,0 +1,94 @@
+
+
+
+
+    
+        INSERT INTO sj_job_summary (namespace_id, group_name, business_id, trigger_at, system_task_type,
+                                    success_num,fail_num,fail_reason,stop_num,stop_reason, cancel_num,cancel_reason)
+        VALUES
+        
+            (
+                #{item.namespaceId},
+                #{item.groupName},
+                #{item.businessId},
+                #{item.triggerAt},
+                #{item.systemTaskType},
+                #{item.successNum},
+                #{item.failNum},
+                #{item.failReason},
+                #{item.stopNum},
+                #{item.stopReason},
+                #{item.cancelNum},
+                #{item.cancelReason}
+            )
+        
+    
+
+    
+        
+            UPDATE sj_job_summary
+               SET success_num = #{item.successNum},
+                   fail_num = #{item.failNum},
+                   fail_reason = #{item.failReason},
+                   stop_num = #{item.stopNum},
+                   stop_reason = #{item.stopReason},
+                   cancel_num = #{item.cancelNum},
+                   cancel_reason = #{item.cancelReason}
+             WHERE system_task_type = #{item.systemTaskType}
+               AND business_id = #{item.businessId}
+               AND trigger_at = #{item.triggerAt}
+        
+    
+
+    
+
+    
+
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml
new file mode 100644
index 00000000..14525c13
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml
@@ -0,0 +1,21 @@
+
+
+
+
+    
+        INSERT INTO sj_retry_dead_letter (namespace_id, unique_id, group_name, scene_name,
+                                          idempotent_id, biz_no, executor_name, args_str,
+                                          ext_attrs, create_dt)
+        VALUES
+        
+            (
+                #{retryDeadLetter.namespaceId,jdbcType=VARCHAR}, #{retryDeadLetter.uniqueId,jdbcType=VARCHAR},
+                #{retryDeadLetter.groupName,jdbcType=VARCHAR}, #{retryDeadLetter.sceneName,jdbcType=VARCHAR},
+                #{retryDeadLetter.idempotentId,jdbcType=VARCHAR}, #{retryDeadLetter.bizNo,jdbcType=VARCHAR},
+                #{retryDeadLetter.executorName,jdbcType=VARCHAR}, #{retryDeadLetter.argsStr,jdbcType=VARCHAR},
+                #{retryDeadLetter.extAttrs,jdbcType=VARCHAR}, #{retryDeadLetter.createDt,jdbcType=TIMESTAMP}
+            )
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml
new file mode 100644
index 00000000..616249e8
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml
@@ -0,0 +1,99 @@
+
+
+
+
+    
+        INSERT INTO sj_retry_summary (namespace_id, group_name, scene_name, trigger_at,
+                                      running_num, finish_num, max_count_num, suspend_num)
+        VALUES
+        
+            (
+                #{item.namespaceId},
+                #{item.groupName},
+                #{item.sceneName},
+                #{item.triggerAt},
+                #{item.runningNum},
+                #{item.finishNum},
+                #{item.maxCountNum},
+                #{item.suspendNum}
+            )
+        
+    
+
+    
+        
+            UPDATE sj_retry_summary
+               SET running_num = #{item.runningNum},
+                   finish_num = #{item.finishNum},
+                   max_count_num = #{item.maxCountNum},
+                   suspend_num = #{item.suspendNum}
+             WHERE trigger_at = #{item.triggerAt}
+               AND group_name = #{item.groupName}
+               AND namespace_id = #{item.namespaceId}
+               AND scene_name = #{item.sceneName}
+        
+    
+
+    
+
+    
+
+    
+
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml
new file mode 100644
index 00000000..879dc186
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml
@@ -0,0 +1,19 @@
+
+
+
+
+    
+    
+        INSERT INTO sj_retry_task_log (unique_id, group_name, scene_name, idempotent_id, biz_no, executor_name,
+                                       args_str, ext_attrs, task_type, create_dt, namespace_id)
+        VALUES
+        
+            (
+                #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId},
+                #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs},
+                #{item.taskType}, #{item.createDt}, #{item.namespaceId}
+            )
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml
new file mode 100644
index 00000000..96ea4c4b
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml
@@ -0,0 +1,30 @@
+
+
+
+
+    
+        INSERT INTO sj_retry_task_log_message (namespace_id, group_name, unique_id, log_num, message,
+                                               create_dt, real_time)
+        VALUES
+        
+            (
+                #{item.namespaceId},
+                #{item.groupName},
+                #{item.uniqueId},
+                #{item.logNum},
+                #{item.message},
+                #{item.createDt},
+                #{item.realTime}
+            )
+        
+    
+
+    
+        
+            UPDATE sj_retry_task_log_message
+               SET message = #{item.message}, log_num = #{item.logNum}
+             WHERE id = #{item.id}
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml
new file mode 100644
index 00000000..f0515fcb
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+    
+    
+        INSERT INTO sj_retry_task (namespace_id, unique_id, group_name, scene_name, idempotent_id, biz_no,
+                                   executor_name, args_str, ext_attrs, next_trigger_at, task_type, retry_status, create_dt)
+        VALUES
+        
+            (
+                #{item.namespaceId}, #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId},
+                #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs}, #{item.nextTriggerAt},
+                #{item.taskType}, #{item.retryStatus}, #{item.createDt}
+            )
+        
+    
+
+    
+        
+            UPDATE sj_retry_task_${partition}
+               SET next_trigger_at = #{item.nextTriggerAt}
+             WHERE id = #{item.id}
+        
+    
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml
new file mode 100644
index 00000000..42157602
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml
@@ -0,0 +1,34 @@
+
+
+
+
+    
+        
+        INSERT INTO sj_server_node (namespace_id, group_name, host_id, host_ip, host_port,
+                                    expire_at, node_type, ext_attrs, create_dt)
+        VALUES
+        
+            (
+                #{item.namespaceId,jdbcType=VARCHAR},
+                #{item.groupName,jdbcType=VARCHAR},
+                #{item.hostId,jdbcType=VARCHAR},
+                #{item.hostIp,jdbcType=VARCHAR},
+                #{item.hostPort,jdbcType=INTEGER},
+                #{item.expireAt,jdbcType=TIMESTAMP},
+                #{item.nodeType,jdbcType=TINYINT},
+                #{item.extAttrs,jdbcType=VARCHAR},
+                #{item.createDt,jdbcType=TIMESTAMP}
+            )
+        
+    
+
+    
+        
+            UPDATE sj_server_node
+               SET expire_at = #{item.expireAt}
+             WHERE host_id = #{item.hostId}
+               AND host_ip = #{item.hostIp}
+        
+    
+
+
diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml
new file mode 100644
index 00000000..54abf2cb
--- /dev/null
+++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+    
+        
+            UPDATE sj_workflow
+               SET next_trigger_at = #{item.nextTriggerAt}
+             WHERE id = #{item.id}
+        
+    
+
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java
index 1956b6ff..52ad272c 100644
--- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java
@@ -63,7 +63,7 @@ public enum DashboardLineEnum {
                 default:
                     return "yyyy-MM-dd";
             }
-        } else { // Oracle, Postgres
+        } else { // Oracle, Postgres, DM
             switch (mode) {
                 case YEAR:
                     return "yyyy-MM";
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java
index 93092b4e..94093091 100644
--- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java
@@ -45,7 +45,8 @@ public class JdbcLockProvider implements LockStorage, Lifecycle {
             DbTypeEnum.MARIADB.getDb(),
             DbTypeEnum.POSTGRES.getDb(),
             DbTypeEnum.ORACLE.getDb(),
-            DbTypeEnum.SQLSERVER.getDb());
+            DbTypeEnum.SQLSERVER.getDb(),
+            DbTypeEnum.DM.getDb());
 
     private final DistributedLockMapper distributedLockMapper;
     private final PlatformTransactionManager platformTransactionManager;
diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
index 650197ea..ed43c6fc 100644
--- a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
+++ b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
@@ -15,26 +15,31 @@ spring:
     url: jdbc:mysql://localhost:3306/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true
     username: root
     password: root
-      ## postgres
-      #    driver-class-name: org.postgresql.Driver
-      #    url: jdbc:postgresql://localhost:5432/snail_job?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
-      #    username: root
-      #    password: root
-      ## Oracle
-      #    driver-class-name: oracle.jdbc.OracleDriver
-      #    url: jdbc:oracle:thin:@//localhost:1521/XEPDB1
-      #    username: snail_job
-      #    password: SnailJob
-      ## SQL Server 注意:由于system_user为SQLServer系统函数,因此SQLServer需要启用前缀配置,请配置mybatis-plus.global-config.db-config.table-prefix: er_
-      #    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
-      #    url: jdbc:sqlserver://localhost:1433;DatabaseName=snail_job;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
-      #    username: SA
-      #    password: SnailJob@24
+    ## postgres
+    #    driver-class-name: org.postgresql.Driver
+    #    url: jdbc:postgresql://localhost:5432/snail_job?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+    #    username: root
+    #    password: root
+    ## Oracle
+    #    driver-class-name: oracle.jdbc.OracleDriver
+    #    url: jdbc:oracle:thin:@//localhost:1521/XEPDB1
+    #    username: snail_job
+    #    password: SnailJob
+    ## SQL Server 注意:由于system_user为SQLServer系统函数,因此SQLServer需要启用前缀配置,请配置mybatis-plus.global-config.db-config.table-prefix: er_
+    #    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    #    url: jdbc:sqlserver://localhost:1433;DatabaseName=snail_job;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
+    #    username: SA
+    #    password: SnailJob@24
     ## mariadb
     #    driver-class-name: org.mariadb.jdbc.Driver
     #    url: jdbc:mariadb://localhost:3308/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true
     #    username: root
     #    password: root
+    ## dm8
+    #    driver-class-name: dm.jdbc.driver.DmDriver
+    #    url: jdbc:dm://127.0.0.1:5236
+    #    username: SYSDBA
+    #    password: SYSDBA001
     type: com.zaxxer.hikari.HikariDataSource
     hikari:
       connection-timeout: 30000
diff --git a/snail-job-server/snail-job-server-web/pom.xml b/snail-job-server/snail-job-server-web/pom.xml
index 48e5eb2b..612eecee 100644
--- a/snail-job-server/snail-job-server-web/pom.xml
+++ b/snail-job-server/snail-job-server-web/pom.xml
@@ -63,6 +63,10 @@
             com.aizuda
             snail-job-sqlserver-datasource
         
+        
+            com.aizuda
+            snail-job-dm8-datasource
+        
         
             org.mapstruct
             mapstruct
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java
index de0a8bbe..7b9ba0a9 100644
--- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java
@@ -359,42 +359,36 @@ public class GroupConfigServiceImpl implements GroupConfigService {
     @Override
     public List getTablePartitionList() {
         DataSource dataSource = jdbcTemplate.getDataSource();
-        Connection connection = null;
-        try {
-            connection = dataSource.getConnection();
+        try (Connection connection = dataSource.getConnection()) {
             String catalog = connection.getCatalog();
             String schema = connection.getSchema();
 
             String tableNamePattern = "sj_retry_task_%";
             DbTypeEnum dbType = DbUtils.getDbType();
-            if (DbTypeEnum.ORACLE.getDb().equals(dbType.getDb())) {
+            // Oracle, DM 查询表名大写
+            if (DbTypeEnum.ORACLE.getDb().equals(dbType.getDb()) || DbTypeEnum.DM.getDb().equals(dbType.getDb())) {
                 tableNamePattern = tableNamePattern.toUpperCase();
             }
 
             DatabaseMetaData metaData = connection.getMetaData();
-            ResultSet tables = metaData.getTables(catalog, schema, tableNamePattern, new String[]{"TABLE"});
+            ResultSet tableRs = metaData.getTables(catalog, schema, tableNamePattern, new String[]{"TABLE"});
 
-            // 输出表名
+            // 获取表名
             List tableList = new ArrayList<>();
-            while (tables.next()) {
-                String tableName = tables.getString("TABLE_NAME");
+            while (tableRs.next()) {
+                String tableName = tableRs.getString("TABLE_NAME");
                 tableList.add(tableName);
             }
 
-            return tableList.stream().map(ReUtil::getFirstNumber).filter(i ->
-                            !Objects.isNull(i)).distinct()
+            return tableList.stream()
+                    .map(ReUtil::getFirstNumber)
+                    .filter(Objects::nonNull)
+                    .distinct()
                     .collect(Collectors.toList());
         } catch (SQLException ignored) {
-        } finally {
-            if (Objects.nonNull(connection)) {
-                try {
-                    connection.close();
-                } catch (SQLException ignored) {
-                }
-            }
         }
 
-        return Lists.newArrayList();
+        return Collections.emptyList();
     }
 
     @Override
@@ -411,7 +405,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
                 .in(GroupConfig::getGroupName, groupSet));
 
         Assert.isTrue(CollUtil.isEmpty(configs),
-                () -> new SnailJobServerException("导入失败. 原因: 组{}已存在",  StreamUtils.toSet(configs, GroupConfig::getGroupName)));
+                () -> new SnailJobServerException("导入失败. 原因: 组{}已存在", StreamUtils.toSet(configs, GroupConfig::getGroupName)));
 
         for (final GroupConfigRequestVO groupConfigRequestVO : requestList) {
 
@@ -432,13 +426,13 @@ public class GroupConfigServiceImpl implements GroupConfigService {
         List allRequestList = Lists.newArrayList();
         PartitionTaskUtils.process((startId -> {
             List groupConfigs = accessTemplate.getGroupConfigAccess().listPage(new PageDTO<>(0, 100),
-                new LambdaQueryWrapper()
-                    .ge(GroupConfig::getId, startId)
-                    .eq(GroupConfig::getNamespaceId, namespaceId)
-                    .eq(Objects.nonNull(exportGroupVO.getGroupStatus()), GroupConfig::getGroupStatus, exportGroupVO.getGroupStatus())
-                    .in(CollUtil.isNotEmpty(exportGroupVO.getGroupIds()), GroupConfig::getId, exportGroupVO.getGroupIds())
-                    .likeRight(StrUtil.isNotBlank(exportGroupVO.getGroupName()), GroupConfig::getGroupName, StrUtil.trim(exportGroupVO.getGroupName()))
-                    .orderByAsc(GroupConfig::getId)
+                    new LambdaQueryWrapper()
+                            .ge(GroupConfig::getId, startId)
+                            .eq(GroupConfig::getNamespaceId, namespaceId)
+                            .eq(Objects.nonNull(exportGroupVO.getGroupStatus()), GroupConfig::getGroupStatus, exportGroupVO.getGroupStatus())
+                            .in(CollUtil.isNotEmpty(exportGroupVO.getGroupIds()), GroupConfig::getId, exportGroupVO.getGroupIds())
+                            .likeRight(StrUtil.isNotBlank(exportGroupVO.getGroupName()), GroupConfig::getGroupName, StrUtil.trim(exportGroupVO.getGroupName()))
+                            .orderByAsc(GroupConfig::getId)
             ).getRecords();
             return groupConfigs.stream().map(GroupConfigPartitionTask::new).toList();
         }), partitionTasks -> {
@@ -455,6 +449,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
     private static class GroupConfigPartitionTask extends PartitionTask {
         // 这里就直接放GroupConfig为了后面若加字段不需要再这里在调整了
         private final GroupConfig config;
+
         public GroupConfigPartitionTask(@NotNull GroupConfig config) {
             this.config = config;
             setId(config.getId());