USE baiyue_audit; DROP PROCEDURE IF EXISTS add_audit_event_id; DELIMITER $$ CREATE PROCEDURE add_audit_event_id() BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='baiyue_audit' AND TABLE_NAME='sys_audit_log' AND COLUMN_NAME='event_id' ) THEN ALTER TABLE sys_audit_log ADD COLUMN event_id VARCHAR(64) NULL COMMENT '审计事件全局唯一ID' AFTER id; END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.STATISTICS WHERE TABLE_SCHEMA='baiyue_audit' AND TABLE_NAME='sys_audit_log' AND INDEX_NAME='uk_audit_event_id' ) THEN ALTER TABLE sys_audit_log ADD UNIQUE KEY uk_audit_event_id (event_id); END IF; END$$ DELIMITER ; CALL add_audit_event_id(); DROP PROCEDURE IF EXISTS add_audit_event_id; CREATE TABLE IF NOT EXISTS sys_audit_dead_letter ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '死信记录自增ID', event_id VARCHAR(64) NOT NULL COMMENT '审计事件全局唯一ID', payload_text LONGTEXT NOT NULL COMMENT 'RocketMQ死信原始载荷', status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING待补偿、PROCESSING处理中、PROCESSED已处理、DEAD永久失败', retry_count INT NOT NULL DEFAULT 0 COMMENT '死信重试次数', next_retry_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '下次允许补偿时间', lease_owner VARCHAR(128) NULL COMMENT '当前补偿租约持有实例', lease_until DATETIME(3) NULL COMMENT '当前补偿租约截止时间', last_error VARCHAR(1000) NULL COMMENT '最近一次补偿错误', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '死信记录创建时间', processed_at DATETIME(3) NULL COMMENT '补偿处理完成时间', PRIMARY KEY (id), UNIQUE KEY uk_audit_dead_event (event_id), KEY idx_audit_dead_retry (status, next_retry_at, lease_until) ) ENGINE=InnoDB COMMENT='审计消息死信补偿表';