TDengine 在子表创建流式计算式会导致数据重复

【TDengine 使用环境】测试环境

【TDengine 版本】3.4.1

【操作系统以及版本】centos-7

【部署方式】容器

【集群节点数】1

【集群副本数】1

【描述业务影响】创建的流, 在插入数据时会重复插入多条数据.

【问题复现路径/shan】

【遇到的问题:问题现象及影响】

s1_5w 是超级表, 我希望实现的流创建子表上, 每次写入数据的时候,将数据写入一张普通表alarm_s1_5w_sub_0_v1。现在在我创建流, 插入数据流在执行的时候都会有错误发生. 最终的结果时结果表中的数据会重复的插入.

在创建流的时候报错:

05/06 17:27:58.912138 00000126 C MND WARN  stream:1.test.notify_stream_s1_5w_0_v2 not exist, ignore not exist is set, drop stream exec done with success
05/06 17:27:58.913538 00000419 C QRY ERROR vgId:14, get table alarm_s1_5w_sub_0_v2 meta with 0 failed cause of Table does not exist
05/06 17:27:58.913545 00000419 C QRY WARN  vnodeGetBatchMeta failed, msgType:523

执行流的时候:

05/06 17:28:27.418397 00000479 C STM ERROR TYPE: Runner, NODE:1, STREAM:5d5d8b63fa8b8412, TASK:f8,SID:1778059679695658873, SESSION:1 submitRes err:Insert table info not found, code:80007004 lino:2389
05/06 17:28:27.418399 00000477 C STM ERROR TYPE: Runner, NODE:1, STREAM:aae970f4b5c5970d, TASK:198,SID:1778059680201893418, SESSION:1 submitRes err:Insert table info not found, code:80007004 lino:2389
05/06 17:28:27.418401 00000479 C STM ERROR TYPE: Runner, NODE:1, STREAM:5d5d8b63fa8b8412, TASK:f8,SID:1778059679695658873, SESSION:1 [runner calc]faild gid:0, lino:1035 code:Insert table info not found
05/06 17:28:27.418403 00000477 C STM ERROR TYPE: Runner, NODE:1, STREAM:aae970f4b5c5970d, TASK:198,SID:1778059680201893418, SESSION:1 [runner calc]faild gid:0, lino:1035 code:Insert table info not found

创建表的语句:

CREATE STABLE IF NOT EXISTS s1_5w (
    ts TIMESTAMP,
    v1 FLOAT,
    v2 FLOAT,
    v3 FLOAT,
    v4 FLOAT
) TAGS (
    id INT
);
CREATE TABLE IF NOT EXISTS s1_5w_sub_0 USING s1_5w TAGS (0);

创建流的语句:

CREATE STREAM notify_stream_s1_5w_0_v1 
COUNT_WINDOW(1) 
FROM s1_5w_sub_0 
STREAM_OPTIONS(PRE_FILTER(v1 >= 110 OR v1 < 90)) 
INTO alarm_s1_5w_sub_0_v1 NODELAY_CREATE_SUBTABLE AS 
SELECT 
    cast(_tlocaltime / 1000 AS TIMESTAMP) AS ts, 
    TBNAME AS device_name, 
    'v1' AS field_name, 
    v1 AS val, 
    CASE 
        WHEN v1 < 80 THEN -2 
        WHEN v1 >= 80 AND v1 < 90 THEN -1 
        WHEN v1 >= 90 AND v1 < 110 THEN 0 
        WHEN v1 >= 110 AND v1 < 120 THEN 1 
        WHEN v1 >= 120 THEN 2 
        ELSE NULL 
    END AS alarm_level 
FROM %%trows;

测试数据:

INSERT INTO s1_5w (tbname, ts, v1, v2, v3, v4) VALUES ('s1_5w_sub_0', 1778046808726000, 130.00, 90.00, 90.00, 90.00);

我测试了一下没有问题。

INSERT INTO s1_5w (tbname, ts, v1, v2, v3, v4) … 这插入语句你写入了几条记录?

请将写入记录贴上来,然后将 alarm_s1_5w_sub_0_v1 结果中记录也贴上来看看。

这是我的测试情况,应该是没有问题。

补充一些配置

创建容器的 compose 文件

services:
  tdengine-tsdb:
    image: tdengine/tsdb:3.4.1.0
    container_name: tdengine-tsdb
    restart: unless-stopped
    volumes:
      - ./data:/var/lib/taos
    ports:
      - "6030:6030"
      - "6041:6041"
      - "6043:6043"
      - "6044-6049:6044-6049"
      - "6044-6045:6044-6045/udp"
      - "6060:6060"
      - "6083:6083"

创建表

CREATE DATABASE test WAL_FSYNC_PERIOD 0 PRECISION 'us' VGROUPS 1;

创建的时候日志出现

创建流计算日志出现

插入数据时日志出现

执行插入的 sql

INSERT INTO s1_5w (tbname, ts, v1, v2, v3, v4) VALUES 
('s1_5w_sub_0', now, 130.00, 90.00, 90.00, 90.00),
('s1_5w_sub_0', now, 140.00, 90.00, 90.00, 90.00),
('s1_5w_sub_0', now, 150.00, 90.00, 90.00, 90.00),
('s1_5w_sub_0', now, 160.00, 90.00, 90.00, 90.00);

实际插入 160 记录一条 告警表却出现了 3 条, 且随着时间推移(间隔几分钟后)数据重复数据越来越多.

关于创建库以及流式计算时的日志异常能不能请您一并解答一下

感谢

INSERT INTO s1_5w (tbname, ts, v1, v2, v3, v4) VALUES
(‘s1_5w_sub_0’, now, 130.00, 90.00, 90.00, 90.00),
(‘s1_5w_sub_0’, now, 140.00, 90.00, 90.00, 90.00),
(‘s1_5w_sub_0’, now, 150.00, 90.00, 90.00, 90.00),
(‘s1_5w_sub_0’, now, 160.00, 90.00, 90.00, 90.00);

实际业务中,不建议使用 now 对同一个子表在一条sql 中写入多条数据。因为在将now解析成 实际时间的时候,有概率会解析成相同的时间,这样会覆盖掉。
执行完成这个数据写入后,再执行 select * from s1_5w_sub_0; 确认一下实际写入了几条。

@TDuser_OEzS_1621 明白您的意思, 可是现在的结果表中出现了三条相同的数据,再插入的时候值为 160 的数据只有一条.

需要远程分析才行了。加我微信吧:13611161621