pbl_runtime_ext/sql/m11b_partitions.sql
2026-09-19 12:22:21 +08:00

73 lines
5.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- pbl_runtime_ext / M11bpbl_runtime_event 按月 RANGE 分区mariadb 方言)
-- 与 sql/pbl_runtime_ext.sql由 tables.py 单一真源生成)配套使用:
-- 新建环境直接执行本文件的「A. 建表期分区」段
-- 已有环境M11a 非分区表执行「B. 一次性改造」段
-- 运行期:由模块 partitions.ensure_forward_partitions() 自动预建当月+未来 2 个月,
-- 本文件仅提供等价 SQL 供 DBA 核对 / 应急手工执行pmax 是最后兜底)。
-- 约束RANGE 分区键必须进入主键与所有唯一键 → PK(id, created_at)、
-- uk_tenant_idem(tenant_id, idem_key, created_at)。
-- ============================================================================
-- ---------------------------------------------------------------- A. 建表期分区
-- 事件表 append-only业务侧只 INSERT本文件不提供任何 UPDATE/DELETE 语句。
CREATE TABLE IF NOT EXISTS `pbl_runtime_event` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID多租户强制打头',
`event_code` VARCHAR(64) NOT NULL COMMENT '事件编码',
`idem_key` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '幂等键(同键重复投递只落一条)',
`world_id` BIGINT NOT NULL DEFAULT 0 COMMENT '世界ID引用 world 基表,只读)',
`session_id` BIGINT NOT NULL DEFAULT 0 COMMENT '游戏会话ID引用 scense 基表,只读)',
`entity_id` BIGINT NOT NULL DEFAULT 0 COMMENT '实体ID引用 entity 基表,只读)',
`event_type` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事件类型',
`payload` TEXT COMMENT '事件负载 JSON',
`seq_no` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(轮询游标)',
`source` VARCHAR(32) NOT NULL DEFAULT 'runtime' COMMENT '来源runtime/agent/script/client_intent',
`state` VARCHAR(16) NOT NULL DEFAULT 'applied' COMMENT 'applied/rejected/rolled_back',
`tx_group` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事务组(同组同事务)',
`broadcast` TINYINT NOT NULL DEFAULT 1 COMMENT '是否参与广播 0/1',
`state_version` BIGINT NOT NULL DEFAULT 0 COMMENT '本事件推进到的服务端权威版本',
`created_by` BIGINT NOT NULL DEFAULT 0 COMMENT '创建人',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(分区键)',
PRIMARY KEY (`id`, `created_at`),
UNIQUE KEY `uk_tenant_idem` (`tenant_id`, `idem_key`, `created_at`),
KEY `ix_tenant_session_seq` (`tenant_id`, `session_id`, `seq_no`),
KEY `ix_tenant_world` (`tenant_id`, `world_id`),
KEY `ix_tenant_type` (`tenant_id`, `event_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COMMENT='运行时事件流append-only按月 RANGE 分区,保留 14 个月)'
PARTITION BY RANGE (TO_DAYS(`created_at`)) (
PARTITION `pbl_runtime_event_202609` VALUES LESS THAN (TO_DAYS('2026-10-01')),
PARTITION `pbl_runtime_event_202610` VALUES LESS THAN (TO_DAYS('2026-11-01')),
PARTITION `pbl_runtime_event_202611` VALUES LESS THAN (TO_DAYS('2026-12-01')),
PARTITION `pbl_runtime_event_202612` VALUES LESS THAN (TO_DAYS('2027-01-01')),
PARTITION `pbl_runtime_event_pmax` VALUES LESS THAN MAXVALUE
);
-- ---------------------------------------------------------------- B. 一次性改造M11a 非分区表 → 分区表)
-- 顺序不可调换:先扩主键/唯一键,再 PARTITION BY。执行前请备份。
-- ALTER TABLE `pbl_runtime_event` DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `created_at`);
-- ALTER TABLE `pbl_runtime_event` DROP INDEX `uk_tenant_idem`,
-- ADD UNIQUE KEY `uk_tenant_idem` (`tenant_id`, `idem_key`, `created_at`);
-- ALTER TABLE `pbl_runtime_event` PARTITION BY RANGE (TO_DAYS(`created_at`)) (
-- PARTITION `pbl_runtime_event_202609` VALUES LESS THAN (TO_DAYS('2026-10-01')),
-- PARTITION `pbl_runtime_event_pmax` VALUES LESS THAN MAXVALUE
-- );
-- ---------------------------------------------------------------- C. 月度维护(每月 1 日定时任务)
-- 模块写入前会自动预建ensure_forward_partitions进程内 TTL 6h下面是等价手工语句
-- ALTER TABLE `pbl_runtime_event` ADD PARTITION (PARTITION `pbl_runtime_event_202701` VALUES LESS THAN (TO_DAYS('2027-02-01')));
-- 查询当前分区:
-- SELECT PARTITION_NAME, PARTITION_DESCRIPTION FROM information_schema.PARTITIONS
-- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_runtime_event';
-- 过期清理(保留 14 个月DROP PARTITION 是元数据操作,不产生 DELETE 洪峰):
-- 由 partitions.drop_expired_partitions(retain=14, dry_run=True) 先出清单,
-- 人工确认后再 dry_run=False 执行,等价:
-- ALTER TABLE `pbl_runtime_event` DROP PARTITION `pbl_runtime_event_202507`;
-- ---------------------------------------------------------------- D. 实体状态 / 快照M11a 定义不变)
-- pbl_entity_state服务端权威state_version 由 apply_runtime_event 单调分配,
-- 客户端提交值一律忽略uk(tenant_id, session_id, entity_id, state_key) 支撑 UPSERT。
-- pbl_world_state_snapshot掉线补齐/离线兜底基线,与事件同事务写入。
-- 见 sql/pbl_runtime_ext.sql单一真源生成本文件不重复定义避免两处漂移。