|
| 1 | +-- XXL-JOB PostgreSQL Script |
| 2 | +-- Copyright (c) 2015-present, xuxueli. |
| 3 | + |
| 4 | +-- 创建数据库(需要在外部执行,或者使用 psql 命令行) |
| 5 | +-- CREATE DATABASE xxl_job |
| 6 | +-- ENCODING 'UTF8' |
| 7 | +-- LC_COLLATE 'en_US.utf8' |
| 8 | +-- LC_CTYPE 'en_US.utf8'; |
| 9 | + |
| 10 | +-- \c xxl_job; |
| 11 | + |
| 12 | +-- 设置客户端编码 |
| 13 | +SET client_encoding = 'UTF8'; |
| 14 | + |
| 15 | +-- 如果有数据库,先转移所有权或删除数据库 |
| 16 | +--REASSIGN OWNED BY xxl_job TO postgres; -- 将所有权转移给postgres |
| 17 | +--DROP DATABASE IF EXISTS xxl_job; -- 删除用户拥有的所有对象 |
| 18 | +-- 最后删除用户 |
| 19 | +--DROP USER IF EXISTS xxl_job; |
| 20 | + |
| 21 | +-- 授予所有必要的权限 |
| 22 | +GRANT ALL PRIVILEGES ON DATABASE xxl_job TO xxl_job; |
| 23 | +GRANT ALL PRIVILEGES ON SCHEMA public TO xxl_job; |
| 24 | +GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO xxl_job; |
| 25 | +GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO xxl_job; |
| 26 | + |
| 27 | +-- 为将来创建的对象设置默认权限 |
| 28 | +ALTER DEFAULT PRIVILEGES IN SCHEMA public |
| 29 | +GRANT ALL PRIVILEGES ON TABLES TO xxl_job; |
| 30 | + |
| 31 | +ALTER DEFAULT PRIVILEGES IN SCHEMA public |
| 32 | +GRANT ALL PRIVILEGES ON SEQUENCES TO xxl_job; |
| 33 | + |
| 34 | +-- 如果用户需要创建表 |
| 35 | +GRANT CREATE ON SCHEMA public TO xxl_job; |
| 36 | + |
| 37 | +-- —————————————————————— job group and registry —————————————————— |
| 38 | + |
| 39 | +CREATE TABLE xxl_job_group |
| 40 | +( |
| 41 | + id SERIAL PRIMARY KEY, |
| 42 | + app_name VARCHAR(64) NOT NULL, |
| 43 | + title VARCHAR(12) NOT NULL, |
| 44 | + address_type SMALLINT NOT NULL DEFAULT 0, |
| 45 | + address_list TEXT, |
| 46 | + update_time TIMESTAMP |
| 47 | +); |
| 48 | + |
| 49 | +COMMENT ON TABLE xxl_job_group IS '执行器信息表'; |
| 50 | +COMMENT ON COLUMN xxl_job_group.id IS '主键ID'; |
| 51 | +COMMENT ON COLUMN xxl_job_group.app_name IS '执行器AppName'; |
| 52 | +COMMENT ON COLUMN xxl_job_group.title IS '执行器名称'; |
| 53 | +COMMENT ON COLUMN xxl_job_group.address_type IS '执行器地址类型:0=自动注册、1=手动录入'; |
| 54 | +COMMENT ON COLUMN xxl_job_group.address_list IS '执行器地址列表,多地址逗号分隔'; |
| 55 | +COMMENT ON COLUMN xxl_job_group.update_time IS '更新时间'; |
| 56 | + |
| 57 | +CREATE TABLE xxl_job_registry |
| 58 | +( |
| 59 | + id SERIAL PRIMARY KEY, |
| 60 | + registry_group VARCHAR(50) NOT NULL, |
| 61 | + registry_key VARCHAR(255) NOT NULL, |
| 62 | + registry_value VARCHAR(255) NOT NULL, |
| 63 | + update_time TIMESTAMP |
| 64 | +); |
| 65 | + |
| 66 | +CREATE UNIQUE INDEX idx_registry_group_key_value ON xxl_job_registry (registry_group, registry_key, registry_value); |
| 67 | + |
| 68 | +COMMENT ON TABLE xxl_job_registry IS '执行器注册表'; |
| 69 | +COMMENT ON COLUMN xxl_job_registry.id IS '主键ID'; |
| 70 | +COMMENT ON COLUMN xxl_job_registry.registry_group IS '注册组'; |
| 71 | +COMMENT ON COLUMN xxl_job_registry.registry_key IS '注册键'; |
| 72 | +COMMENT ON COLUMN xxl_job_registry.registry_value IS '注册值'; |
| 73 | +COMMENT ON COLUMN xxl_job_registry.update_time IS '更新时间'; |
| 74 | + |
| 75 | +-- —————————————————————— job info —————————————————— |
| 76 | + |
| 77 | +CREATE TABLE xxl_job_info |
| 78 | +( |
| 79 | + id SERIAL PRIMARY KEY, |
| 80 | + job_group INTEGER NOT NULL, |
| 81 | + job_desc VARCHAR(255) NOT NULL, |
| 82 | + add_time TIMESTAMP, |
| 83 | + update_time TIMESTAMP, |
| 84 | + author VARCHAR(64), |
| 85 | + alarm_email VARCHAR(255), |
| 86 | + schedule_type VARCHAR(50) NOT NULL DEFAULT 'NONE', |
| 87 | + schedule_conf VARCHAR(128), |
| 88 | + misfire_strategy VARCHAR(50) NOT NULL DEFAULT 'DO_NOTHING', |
| 89 | + executor_route_strategy VARCHAR(50), |
| 90 | + executor_handler VARCHAR(255), |
| 91 | + executor_param VARCHAR(512), |
| 92 | + executor_block_strategy VARCHAR(50), |
| 93 | + executor_timeout INTEGER NOT NULL DEFAULT 0, |
| 94 | + executor_fail_retry_count INTEGER NOT NULL DEFAULT 0, |
| 95 | + glue_type VARCHAR(50) NOT NULL, |
| 96 | + glue_source TEXT, |
| 97 | + glue_remark VARCHAR(128), |
| 98 | + glue_updatetime TIMESTAMP, |
| 99 | + child_jobid VARCHAR(255), |
| 100 | + trigger_status SMALLINT NOT NULL DEFAULT 0, |
| 101 | + trigger_last_time BIGINT NOT NULL DEFAULT 0, |
| 102 | + trigger_next_time BIGINT NOT NULL DEFAULT 0 |
| 103 | +); |
| 104 | + |
| 105 | +COMMENT ON TABLE xxl_job_info IS '任务信息表'; |
| 106 | +COMMENT ON COLUMN xxl_job_info.id IS '主键ID'; |
| 107 | +COMMENT ON COLUMN xxl_job_info.job_group IS '执行器主键ID'; |
| 108 | +COMMENT ON COLUMN xxl_job_info.job_desc IS '任务描述'; |
| 109 | +COMMENT ON COLUMN xxl_job_info.add_time IS '添加时间'; |
| 110 | +COMMENT ON COLUMN xxl_job_info.update_time IS '更新时间'; |
| 111 | +COMMENT ON COLUMN xxl_job_info.author IS '作者'; |
| 112 | +COMMENT ON COLUMN xxl_job_info.alarm_email IS '报警邮件'; |
| 113 | +COMMENT ON COLUMN xxl_job_info.schedule_type IS '调度类型'; |
| 114 | +COMMENT ON COLUMN xxl_job_info.schedule_conf IS '调度配置,值含义取决于调度类型'; |
| 115 | +COMMENT ON COLUMN xxl_job_info.misfire_strategy IS '调度过期策略'; |
| 116 | +COMMENT ON COLUMN xxl_job_info.executor_route_strategy IS '执行器路由策略'; |
| 117 | +COMMENT ON COLUMN xxl_job_info.executor_handler IS '执行器任务handler'; |
| 118 | +COMMENT ON COLUMN xxl_job_info.executor_param IS '执行器任务参数'; |
| 119 | +COMMENT ON COLUMN xxl_job_info.executor_block_strategy IS '阻塞处理策略'; |
| 120 | +COMMENT ON COLUMN xxl_job_info.executor_timeout IS '任务执行超时时间,单位秒'; |
| 121 | +COMMENT ON COLUMN xxl_job_info.executor_fail_retry_count IS '失败重试次数'; |
| 122 | +COMMENT ON COLUMN xxl_job_info.glue_type IS 'GLUE类型'; |
| 123 | +COMMENT ON COLUMN xxl_job_info.glue_source IS 'GLUE源代码'; |
| 124 | +COMMENT ON COLUMN xxl_job_info.glue_remark IS 'GLUE备注'; |
| 125 | +COMMENT ON COLUMN xxl_job_info.glue_updatetime IS 'GLUE更新时间'; |
| 126 | +COMMENT ON COLUMN xxl_job_info.child_jobid IS '子任务ID,多个逗号分隔'; |
| 127 | +COMMENT ON COLUMN xxl_job_info.trigger_status IS '调度状态:0-停止,1-运行'; |
| 128 | +COMMENT ON COLUMN xxl_job_info.trigger_last_time IS '上次调度时间'; |
| 129 | +COMMENT ON COLUMN xxl_job_info.trigger_next_time IS '下次调度时间'; |
| 130 | + |
| 131 | +CREATE TABLE xxl_job_logglue |
| 132 | +( |
| 133 | + id SERIAL PRIMARY KEY, |
| 134 | + job_id INTEGER NOT NULL, |
| 135 | + glue_type VARCHAR(50), |
| 136 | + glue_source TEXT, |
| 137 | + glue_remark VARCHAR(128) NOT NULL, |
| 138 | + add_time TIMESTAMP, |
| 139 | + update_time TIMESTAMP |
| 140 | +); |
| 141 | + |
| 142 | +COMMENT ON TABLE xxl_job_logglue IS '任务GLUE日志表'; |
| 143 | +COMMENT ON COLUMN xxl_job_logglue.id IS '主键ID'; |
| 144 | +COMMENT ON COLUMN xxl_job_logglue.job_id IS '任务,主键ID'; |
| 145 | +COMMENT ON COLUMN xxl_job_logglue.glue_type IS 'GLUE类型'; |
| 146 | +COMMENT ON COLUMN xxl_job_logglue.glue_source IS 'GLUE源代码'; |
| 147 | +COMMENT ON COLUMN xxl_job_logglue.glue_remark IS 'GLUE备注'; |
| 148 | +COMMENT ON COLUMN xxl_job_logglue.add_time IS '添加时间'; |
| 149 | +COMMENT ON COLUMN xxl_job_logglue.update_time IS '更新时间'; |
| 150 | + |
| 151 | +-- —————————————————————— job log and report —————————————————— |
| 152 | + |
| 153 | +CREATE TABLE xxl_job_log |
| 154 | +( |
| 155 | + id BIGSERIAL PRIMARY KEY, |
| 156 | + job_group INTEGER NOT NULL, |
| 157 | + job_id INTEGER NOT NULL, |
| 158 | + executor_address VARCHAR(255), |
| 159 | + executor_handler VARCHAR(255), |
| 160 | + executor_param VARCHAR(512), |
| 161 | + executor_sharding_param VARCHAR(20), |
| 162 | + executor_fail_retry_count INTEGER NOT NULL DEFAULT 0, |
| 163 | + trigger_time TIMESTAMP, |
| 164 | + trigger_code INTEGER NOT NULL, |
| 165 | + trigger_msg TEXT, |
| 166 | + handle_time TIMESTAMP, |
| 167 | + handle_code INTEGER NOT NULL, |
| 168 | + handle_msg TEXT, |
| 169 | + alarm_status SMALLINT NOT NULL DEFAULT 0 |
| 170 | +); |
| 171 | + |
| 172 | +CREATE INDEX idx_job_log_trigger_time ON xxl_job_log (trigger_time); |
| 173 | +CREATE INDEX idx_job_log_handle_code ON xxl_job_log (handle_code); |
| 174 | +CREATE INDEX idx_job_log_job_id_group ON xxl_job_log (job_id, job_group); |
| 175 | +CREATE INDEX idx_job_log_job_id ON xxl_job_log (job_id); |
| 176 | + |
| 177 | +COMMENT ON TABLE xxl_job_log IS '任务日志表'; |
| 178 | +COMMENT ON COLUMN xxl_job_log.id IS '主键ID'; |
| 179 | +COMMENT ON COLUMN xxl_job_log.job_group IS '执行器主键ID'; |
| 180 | +COMMENT ON COLUMN xxl_job_log.job_id IS '任务,主键ID'; |
| 181 | +COMMENT ON COLUMN xxl_job_log.executor_address IS '执行器地址,本次执行的地址'; |
| 182 | +COMMENT ON COLUMN xxl_job_log.executor_handler IS '执行器任务handler'; |
| 183 | +COMMENT ON COLUMN xxl_job_log.executor_param IS '执行器任务参数'; |
| 184 | +COMMENT ON COLUMN xxl_job_log.executor_sharding_param IS '执行器任务分片参数,格式如 1/2'; |
| 185 | +COMMENT ON COLUMN xxl_job_log.executor_fail_retry_count IS '失败重试次数'; |
| 186 | +COMMENT ON COLUMN xxl_job_log.trigger_time IS '调度-时间'; |
| 187 | +COMMENT ON COLUMN xxl_job_log.trigger_code IS '调度-结果'; |
| 188 | +COMMENT ON COLUMN xxl_job_log.trigger_msg IS '调度-日志'; |
| 189 | +COMMENT ON COLUMN xxl_job_log.handle_time IS '执行-时间'; |
| 190 | +COMMENT ON COLUMN xxl_job_log.handle_code IS '执行-状态'; |
| 191 | +COMMENT ON COLUMN xxl_job_log.handle_msg IS '执行-日志'; |
| 192 | +COMMENT ON COLUMN xxl_job_log.alarm_status IS '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败'; |
| 193 | + |
| 194 | +CREATE TABLE xxl_job_log_report |
| 195 | +( |
| 196 | + id SERIAL PRIMARY KEY, |
| 197 | + trigger_day TIMESTAMP, |
| 198 | + running_count INTEGER NOT NULL DEFAULT 0, |
| 199 | + suc_count INTEGER NOT NULL DEFAULT 0, |
| 200 | + fail_count INTEGER NOT NULL DEFAULT 0, |
| 201 | + update_time TIMESTAMP |
| 202 | +); |
| 203 | + |
| 204 | +CREATE UNIQUE INDEX idx_log_report_trigger_day ON xxl_job_log_report (trigger_day); |
| 205 | + |
| 206 | +COMMENT ON TABLE xxl_job_log_report IS '日志报告表'; |
| 207 | +COMMENT ON COLUMN xxl_job_log_report.id IS '主键ID'; |
| 208 | +COMMENT ON COLUMN xxl_job_log_report.trigger_day IS '调度-时间'; |
| 209 | +COMMENT ON COLUMN xxl_job_log_report.running_count IS '运行中-日志数量'; |
| 210 | +COMMENT ON COLUMN xxl_job_log_report.suc_count IS '执行成功-日志数量'; |
| 211 | +COMMENT ON COLUMN xxl_job_log_report.fail_count IS '执行失败-日志数量'; |
| 212 | +COMMENT ON COLUMN xxl_job_log_report.update_time IS '更新时间'; |
| 213 | + |
| 214 | +-- —————————————————————— lock —————————————————— |
| 215 | + |
| 216 | +CREATE TABLE xxl_job_lock |
| 217 | +( |
| 218 | + lock_name VARCHAR(50) PRIMARY KEY |
| 219 | +); |
| 220 | + |
| 221 | +COMMENT ON TABLE xxl_job_lock IS '分布式锁表'; |
| 222 | +COMMENT ON COLUMN xxl_job_lock.lock_name IS '锁名称'; |
| 223 | + |
| 224 | +-- —————————————————————— user —————————————————— |
| 225 | + |
| 226 | +CREATE TABLE xxl_job_user |
| 227 | +( |
| 228 | + id SERIAL PRIMARY KEY, |
| 229 | + username VARCHAR(50) NOT NULL, |
| 230 | + password VARCHAR(100) NOT NULL, |
| 231 | + token VARCHAR(100), |
| 232 | + role SMALLINT NOT NULL, |
| 233 | + permission VARCHAR(255) |
| 234 | +); |
| 235 | + |
| 236 | +CREATE UNIQUE INDEX idx_user_username ON xxl_job_user (username); |
| 237 | + |
| 238 | +COMMENT ON TABLE xxl_job_user IS '用户表'; |
| 239 | +COMMENT ON COLUMN xxl_job_user.id IS '主键ID'; |
| 240 | +COMMENT ON COLUMN xxl_job_user.username IS '账号'; |
| 241 | +COMMENT ON COLUMN xxl_job_user.password IS '密码加密信息'; |
| 242 | +COMMENT ON COLUMN xxl_job_user.token IS '登录token'; |
| 243 | +COMMENT ON COLUMN xxl_job_user.role IS '角色:0-普通用户、1-管理员'; |
| 244 | +COMMENT ON COLUMN xxl_job_user.permission IS '权限:执行器ID列表,多个逗号分割'; |
| 245 | + |
| 246 | +-- —————————————————————— for default data —————————————————— |
| 247 | + |
| 248 | +INSERT INTO xxl_job_group (id, app_name, title, address_type, address_list, update_time) |
| 249 | +VALUES (1, 'xxl-job-executor-sample', '通用执行器Sample', 0, NULL, NOW()), |
| 250 | + (2, 'xxl-job-executor-sample-ai', 'AI执行器Sample', 0, NULL, NOW()); |
| 251 | + |
| 252 | +-- 设置序列的起始值 |
| 253 | +SELECT setval('xxl_job_group_id_seq', (SELECT MAX(id) FROM xxl_job_group)); |
| 254 | + |
| 255 | +INSERT INTO xxl_job_info (id, job_group, job_desc, add_time, update_time, author, alarm_email, |
| 256 | + schedule_type, schedule_conf, misfire_strategy, executor_route_strategy, |
| 257 | + executor_handler, executor_param, executor_block_strategy, executor_timeout, |
| 258 | + executor_fail_retry_count, glue_type, glue_source, glue_remark, glue_updatetime, |
| 259 | + child_jobid) |
| 260 | +VALUES (1, 1, '示例任务01', NOW(), NOW(), 'XXL', '', 'CRON', '0 0 0 * * ? *', |
| 261 | + 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', |
| 262 | + NOW(), ''), |
| 263 | + (2, 2, 'Ollama示例任务01', NOW(), NOW(), 'XXL', '', 'NONE', '', |
| 264 | + 'DO_NOTHING', 'FIRST', 'ollamaJobHandler', '{ |
| 265 | + "input": "慢SQL问题分析思路", |
| 266 | + "prompt": "你是一个研发工程师,擅长解决技术类问题。", |
| 267 | + "model": "qwen3:0.6b" |
| 268 | +}', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', |
| 269 | + NOW(), ''), |
| 270 | + (3, 2, 'Dify示例任务', NOW(), NOW(), 'XXL', '', 'NONE', '', |
| 271 | + 'DO_NOTHING', 'FIRST', 'difyWorkflowJobHandler', '{ |
| 272 | + "inputs":{ |
| 273 | + "input":"查询班级各学科前三名" |
| 274 | + }, |
| 275 | + "user": "xxl-job", |
| 276 | + "baseUrl": "http://localhost/v1", |
| 277 | + "apiKey": "app-OUVgNUOQRIMokfmuJvBJoUTN" |
| 278 | +}', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', |
| 279 | + NOW(), ''); |
| 280 | + |
| 281 | +-- 设置序列的起始值 |
| 282 | +SELECT setval('xxl_job_info_id_seq', (SELECT MAX(id) FROM xxl_job_info)); |
| 283 | + |
| 284 | +INSERT INTO xxl_job_user (id, username, password, role, permission) |
| 285 | +VALUES (1, 'admin', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 1, NULL); |
| 286 | + |
| 287 | +-- 设置序列的起始值 |
| 288 | +SELECT setval('xxl_job_user_id_seq', (SELECT MAX(id) FROM xxl_job_user)); |
| 289 | + |
| 290 | +INSERT INTO xxl_job_lock (lock_name) |
| 291 | +VALUES ('schedule_lock'); |
| 292 | + |
| 293 | + |
0 commit comments