-- 周期计划、固定范围作业和领取租约;不使用数据库外键,不删除历史源记录。 CREATE TABLE orbit_archive_plans ( namespace_id BINARY(16) NOT NULL COMMENT '所属命名空间,由事务核验', kind VARCHAR(16) NOT NULL COMMENT '固定历史类别,同一命名空间每类一个计划', revision BIGINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '配置版本,后台触发不修改此版本', enabled BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否触发新作业,不中断已有作业', policy_revision BIGINT UNSIGNED NOT NULL COMMENT '管理员确认的保留策略版本', storage_id BINARY(16) NOT NULL COMMENT '固定归档卷身份,接管节点必须挂载同一物理卷', interval_seconds INT UNSIGNED NOT NULL COMMENT '周期秒数,3600至2592000,错过多次合并一次', batch_size INT UNSIGNED NOT NULL COMMENT '每批根记录上限,1至100', max_bytes BIGINT UNSIGNED NOT NULL COMMENT '新作业累计文件字节预算,1MiB至1GiB', next_run_at DATETIME(6) NOT NULL COMMENT '下次触发UTC时间,首次启用立即到期', active_job_id BINARY(16) NULL COMMENT '未完成或失败待处理作业,成功或关闭后为空', created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '首次保存UTC时间', updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '配置最后修改UTC时间', PRIMARY KEY(namespace_id,kind), KEY ix_archive_plan_due(storage_id,enabled,next_run_at), CONSTRAINT ck_archive_plan_kind CHECK(kind IN ('tasks','workflows','events','audit','deliveries','inbox','idempotency')), CONSTRAINT ck_archive_plan_config CHECK(revision>0 AND policy_revision>0 AND interval_seconds BETWEEN 3600 AND 2592000 AND batch_size BETWEEN 1 AND 100 AND max_bytes BETWEEN 1048576 AND 1073741824) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs COMMENT='按命名空间和类别配置的周期归档计划,无外键'; CREATE TABLE orbit_archive_jobs ( namespace_id BINARY(16) NOT NULL COMMENT '所属命名空间,由事务核验', id BINARY(16) NOT NULL COMMENT '作业及目录及文件清单的固定标识', kind VARCHAR(16) NOT NULL COMMENT '创建时固定的历史类别', plan_revision BIGINT UNSIGNED NOT NULL COMMENT '创建时固定的计划版本', policy_revision BIGINT UNSIGNED NOT NULL COMMENT '创建时固定的保留策略版本', storage_id BINARY(16) NOT NULL COMMENT '固定归档卷身份,不允许跨独立磁盘接管', batch_size INT UNSIGNED NOT NULL COMMENT '创建时固定的单批根记录上限', max_bytes BIGINT UNSIGNED NOT NULL COMMENT '累计文件字节预算,人工重试仅可提高', state VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING待领取RUNNING执行中SUCCEEDED完成FAILED待处理ABANDONED已关闭', revision BIGINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态并发版本,领取确认和人工操作递增', attempts INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '累计领取次数,包含分批继续和崩溃接管', batches INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已验证并入库的连续文件批次数', roots BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已确认根记录总数', bytes BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已确认清单及批次总字节数', last_sha256 CHAR(64) NOT NULL DEFAULT '' COMMENT '已确认文件链尾摘要,恢复必须验证此前缀', error_code VARCHAR(32) NOT NULL DEFAULT '' COMMENT '固定失败分类,不记录原始异常或业务内容', lease_id BINARY(16) NULL COMMENT '领取随机代次,非执行中为空', lease_until DATETIME(6) NULL COMMENT 'UTC租约截止,过期可接管,非执行中为空', created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '作业创建UTC时间', updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '状态最后变更UTC时间', PRIMARY KEY(namespace_id,id), KEY ix_archive_job_claim(storage_id,state,lease_until,updated_at), KEY ix_archive_job_list(namespace_id,created_at,id), CONSTRAINT ck_archive_job_state CHECK(state IN ('PENDING','RUNNING','SUCCEEDED','FAILED','ABANDONED')), CONSTRAINT ck_archive_job_config CHECK(revision>0 AND plan_revision>0 AND policy_revision>0 AND batch_size BETWEEN 1 AND 100 AND max_bytes BETWEEN 1048576 AND 1073741824), CONSTRAINT ck_archive_job_lease CHECK((state='RUNNING' AND lease_id IS NOT NULL AND lease_until IS NOT NULL) OR (state<>'RUNNING' AND lease_id IS NULL AND lease_until IS NULL)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs COMMENT='持久归档作业及租约,只读源数据,无外键';