Files
Universal-IoT-Java/docs/log_meta.sql
T

340 lines
20 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.
-- =============================================
-- 步骤1:删除所有现有相关旧表(⚠️ 彻底清理,避免残留)
-- =============================================
-- 1.1 删除 iot_device_log_0~23 所有分表
DROP TABLE IF EXISTS
`iot_device_log_0`, `iot_device_log_1`, `iot_device_log_2`, `iot_device_log_3`,
`iot_device_log_4`, `iot_device_log_5`, `iot_device_log_6`, `iot_device_log_7`,
`iot_device_log_8`, `iot_device_log_9`, `iot_device_log_10`, `iot_device_log_11`,
`iot_device_log_12`, `iot_device_log_13`, `iot_device_log_14`, `iot_device_log_15`,
`iot_device_log_16`, `iot_device_log_17`, `iot_device_log_18`, `iot_device_log_19`,
`iot_device_log_20`, `iot_device_log_21`, `iot_device_log_22`, `iot_device_log_23`;
-- 1.2 删除 iot_device_log_metadata_0~23 所有分表
DROP TABLE IF EXISTS
`iot_device_log_metadata_0`, `iot_device_log_metadata_1`, `iot_device_log_metadata_2`,
`iot_device_log_metadata_3`, `iot_device_log_metadata_4`, `iot_device_log_metadata_5`,
`iot_device_log_metadata_6`, `iot_device_log_metadata_7`, `iot_device_log_metadata_8`,
`iot_device_log_metadata_9`, `iot_device_log_metadata_10`, `iot_device_log_metadata_11`,
`iot_device_log_metadata_12`, `iot_device_log_metadata_13`, `iot_device_log_metadata_14`,
`iot_device_log_metadata_15`, `iot_device_log_metadata_16`, `iot_device_log_metadata_17`,
`iot_device_log_metadata_18`, `iot_device_log_metadata_19`, `iot_device_log_metadata_20`,
`iot_device_log_metadata_21`, `iot_device_log_metadata_22`, `iot_device_log_metadata_23`;
-- =============================================
-- 步骤2:创建第一种类型分表:iot_device_log_0~23(共24个,每个分表内按时间分区)
-- =============================================
-- 2.1 创建 iot_device_log_0(分表示例,0~23结构完全一致,仅表名不同)
CREATE TABLE `iot_device_log_0`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`iot_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备唯一编码',
`device_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备自身序号',
`ext_device_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '第三方设备ID',
`product_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '产品ID',
`device_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备名称',
`message_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '消息类型(EVENT/PROPERTIES/FUNCTIONS',
`command_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '指令ID',
`command_status` tinyint DEFAULT '0' COMMENT '指令状态(0未执行/1成功/2失败)',
`event` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '事件名称(如online/offline',
`company_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '公司编号',
`protocol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '通信协议(MQTT/TCP',
`device_node` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '节点类型',
`classified_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备分类ID',
`org_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '所属机构ID',
`create_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作人ID',
`instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '实例名称',
`point` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '经纬度(经度,纬度)',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '日志详情(JSON格式)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(无0值)',
PRIMARY KEY (`id`, `create_time`) USING BTREE, -- 主键含分区键,确保分区生效
KEY `idx_iot_id` (`iot_id`) USING BTREE, -- 按设备编码查询
KEY `idx_product_device` (`product_key`, `device_id`) USING BTREE, -- 按产品+设备ID查询
KEY `idx_event_time` (`event`, `create_time`) USING BTREE -- 按事件+时间查询
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT '设备日志分表0(按iotId哈希,内部分区)'
-- 分表内按时间分区(2025-09起,预留pmax兜底)
PARTITION BY RANGE (TO_DAYS(`create_time`)) (
PARTITION `p202509` VALUES LESS THAN (TO_DAYS('2025-10-01')), -- 2025年9月数据
PARTITION `p202510` VALUES LESS THAN (TO_DAYS('2025-11-01')), -- 2025年10月数据
PARTITION `p202511` VALUES LESS THAN (TO_DAYS('2025-12-01')), -- 2025年11月数据
PARTITION `pmax` VALUES LESS THAN MAXVALUE -- 兜底分区(未创建月份数据临时存入)
);
-- 2.2 创建 iot_device_log_1~23(复制log_0结构,仅表名不同)
CREATE TABLE `iot_device_log_1` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_1` COMMENT '设备日志分表1(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_2` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_2` COMMENT '设备日志分表2(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_3` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_3` COMMENT '设备日志分表3(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_4` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_4` COMMENT '设备日志分表4(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_5` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_5` COMMENT '设备日志分表5(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_6` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_6` COMMENT '设备日志分表6(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_7` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_7` COMMENT '设备日志分表7(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_8` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_8` COMMENT '设备日志分表8(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_9` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_9` COMMENT '设备日志分表9(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_10` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_10` COMMENT '设备日志分表10(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_11` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_11` COMMENT '设备日志分表11(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_12` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_12` COMMENT '设备日志分表12(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_13` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_13` COMMENT '设备日志分表13(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_14` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_14` COMMENT '设备日志分表14(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_15` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_15` COMMENT '设备日志分表15(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_16` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_16` COMMENT '设备日志分表16(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_17` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_17` COMMENT '设备日志分表17(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_18` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_18` COMMENT '设备日志分表18(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_19` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_19` COMMENT '设备日志分表19(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_20` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_20` COMMENT '设备日志分表20(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_21` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_21` COMMENT '设备日志分表21(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_22` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_22` COMMENT '设备日志分表22(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_23` LIKE `iot_device_log_0`;
ALTER TABLE `iot_device_log_23` COMMENT '设备日志分表23(按iotId哈希,内部分区)';
-- =============================================
-- 步骤3:创建第二种类型分表:iot_device_log_metadata_0~23(共24个,内部分区)
-- =============================================
-- 3.1 创建 iot_device_log_metadata_0(分表示例,0~23结构一致)
CREATE TABLE `iot_device_log_metadata_0`
(
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`iot_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '设备唯一编码',
`product_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '产品ID',
`device_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '设备名称',
`device_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备自身序号',
`message_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '消息类型',
`event` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '事件名称',
`property` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '设备属性(如battery/csq',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '元数据详情',
`ext1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '扩展字段1',
`ext2` varchar(655) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '扩展字段2(长文本)',
`ext3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '扩展字段3',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(无0值)',
PRIMARY KEY (`id`, `create_time`) USING BTREE, -- 主键含分区键
KEY `idx_iot_id` (`iot_id`) USING BTREE,
KEY `idx_product_device` (`product_key`, `device_id`) USING BTREE,
KEY `idx_time_property` (`create_time`, `property`) USING BTREE -- 按时间+属性查询
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT '设备日志元数据分表0(按iotId哈希,内部分区)'
-- 分表内按时间分区(与log分表对齐)
PARTITION BY RANGE (TO_DAYS(`create_time`)) (
PARTITION `p202509` VALUES LESS THAN (TO_DAYS('2025-10-01')),
PARTITION `p202510` VALUES LESS THAN (TO_DAYS('2025-11-01')),
PARTITION `p202511` VALUES LESS THAN (TO_DAYS('2025-12-01')),
PARTITION `pmax` VALUES LESS THAN MAXVALUE
);
-- 3.2 创建 iot_device_log_metadata_1~23(复制metadata_0结构)
CREATE TABLE `iot_device_log_metadata_1` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_1` COMMENT '设备日志元数据分表1(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_2` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_2` COMMENT '设备日志元数据分表2(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_3` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_3` COMMENT '设备日志元数据分表3(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_4` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_4` COMMENT '设备日志元数据分表4(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_5` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_5` COMMENT '设备日志元数据分表5(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_6` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_6` COMMENT '设备日志元数据分表6(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_7` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_7` COMMENT '设备日志元数据分表7(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_8` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_8` COMMENT '设备日志元数据分表8(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_9` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_9` COMMENT '设备日志元数据分表9(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_10` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_10` COMMENT '设备日志元数据分表10(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_11` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_11` COMMENT '设备日志元数据分表11(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_12` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_12` COMMENT '设备日志元数据分表12(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_13` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_13` COMMENT '设备日志元数据分表13(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_14` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_14` COMMENT '设备日志元数据分表14(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_15` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_15` COMMENT '设备日志元数据分表15(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_16` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_16` COMMENT '设备日志元数据分表16(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_17` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_17` COMMENT '设备日志元数据分表17(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_18` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_18` COMMENT '设备日志元数据分表18(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_19` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_19` COMMENT '设备日志元数据分表19(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_20` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_20` COMMENT '设备日志元数据分表20(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_21` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_21` COMMENT '设备日志元数据分表21(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_22` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_22` COMMENT '设备日志元数据分表22(按iotId哈希,内部分区)';
CREATE TABLE `iot_device_log_metadata_23` LIKE `iot_device_log_metadata_0`;
ALTER TABLE `iot_device_log_metadata_23` COMMENT '设备日志元数据分表23(按iotId哈希,内部分区)';
-- =============================================
-- 步骤4:创建自动分区存储过程(批量为所有分表新增下月分区)
-- 功能:1次执行,为 log_0~23 和 metadata_0~23 共48个分表同步新增分区
-- =============================================
DELIMITER
//
-- 先删除旧存储过程(避免重复创建报错)
DROP PROCEDURE IF EXISTS `auto_add_partition_for_all_shards`;
//
CREATE PROCEDURE `auto_add_partition_for_all_shards`()
BEGIN
-- 变量定义:分表索引(0~23)、时间、分区名、表名
DECLARE
`shard_idx` INT DEFAULT 0;
DECLARE
`next_month` DATE;
DECLARE
`next_next_month` DATE;
DECLARE
`partition_name` VARCHAR(20);
DECLARE
`log_table_name` VARCHAR(50); -- log分表名(如iot_device_log_0
DECLARE
`metadata_table_name` VARCHAR(50); -- metadata分表名(如iot_device_log_metadata_0
-- 1. 计算分区时间:下月1号(分区名)、下下月1号(分区边界)
SET
`next_month` = DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-01');
SET
`next_next_month` = DATE_FORMAT(CURDATE() + INTERVAL 2 MONTH, '%Y-%m-01');
SET
`partition_name` = CONCAT('p', DATE_FORMAT(`next_month`, '%Y%m')); -- 分区名:p202512
-- 2. 循环处理0~23所有分表(同时处理log和metadata分表)
WHILE
`shard_idx` < 24 DO
-- 2.1 拼接当前分表名
SET `log_table_name` = CONCAT('iot_device_log_', `shard_idx`);
SET
`metadata_table_name` = CONCAT('iot_device_log_metadata_', `shard_idx`);
-- 2.2 为 log分表 新增分区
SET
@sql_log = CONCAT(
'ALTER TABLE ', `log_table_name`, ' ADD PARTITION (',
'PARTITION ', `partition_name`, ' VALUES LESS THAN (TO_DAYS(\'', `next_next_month`, '
\'))',
');'
);
PREPARE stmt_log FROM @sql_log;
EXECUTE stmt_log;
DEALLOCATE PREPARE stmt_log;
-- 2.3 为 metadata分表 新增分区(与log分表对齐)
SET
@sql_metadata = CONCAT(
'ALTER TABLE ', `metadata_table_name`, ' ADD PARTITION (',
'PARTITION ', `partition_name`, ' VALUES LESS THAN (TO_DAYS(\'', `next_next_month`, '
\'))',
');'
);
PREPARE stmt_metadata FROM @sql_metadata;
EXECUTE stmt_metadata;
DEALLOCATE PREPARE stmt_metadata;
-- 2.4 打印执行结果(便于验证)
SELECT CONCAT('✅ 已为分表 [', `log_table_name`, '] 和 [', `metadata_table_name`, '] 新增分区:',
`partition_name`) AS `result`;
-- 分表索引+1,继续下一张
SET
`shard_idx` = `shard_idx` + 1;
END WHILE;
-- 3. 最终提示
SELECT CONCAT('🎉 所有分表分区新增完成!本次新增分区:', `partition_name`, ',时间范围:', `next_month`,
' ~ ',
DATE_SUB(`next_next_month`, INTERVAL 1 DAY)) AS `final_result`;
END
//
DELIMITER ;
-- =============================================
-- 步骤5:验证脚本执行结果(确认分表和存储过程创建成功)
-- =============================================
-- 5.1 确认 log分表 已创建(共24个)
SELECT TABLE_NAME, TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'univ'
AND TABLE_NAME LIKE 'iot_device_log_%'
AND TABLE_NAME NOT IN ('iot_device_log');
-- 排除非分表
-- 5.2 确认 metadata分表 已创建(共24个)
SELECT TABLE_NAME, TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'univ'
AND TABLE_NAME LIKE 'iot_device_log_metadata_%'
AND TABLE_NAME NOT IN ('iot_device_log_metadata');
-- 排除非分表
-- 5.3 确认自动分区存储过程已创建
SELECT ROUTINE_NAME, ROUTINE_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'univ'
AND ROUTINE_NAME = 'auto_add_partition_for_all_shards';