一则doris数据不一致问题

发布于:2025-05-28 ⋅ 阅读:(20) ⋅ 点赞:(0)

一个客户使用doris做大数据分析平台,工程师对一张表进行insert操作后,doris反馈插入成功,但是再进行select查询的时候却找不到插入的数据:

客户尝试新建一个相同结构表,插入这条数据却能成功查询,从现象上面看就是有问题的表把这条特定的数据给屏蔽了

我们查看创建表的sql语句,发现这个表有一个特殊的属性,就行添加了sequence_col列:

PROPERTIES (
"function_column.sequence_col" = "cdc_datetime"
);

查看一下官方文档说明:

function_column.sequence_col
只适用于 UNIQUE KEYS 模型,相同 Key 列下,保证 Value 列按照
source_sequence 列进行 REPLACE source_sequence 可以是数据源中的列,
也可以是表结构中的一列。
Unique Key 表设置了 Sequence 列时,在相同 Key 列下, Sequence 列的值会作为 REPLACE 聚合函数替换顺序的
依据,较大值可以替换较小值。当对这种表基于 DORIS_DELETE_SIGN 进行删除标记时,需要保证 Key 相同和
Sequence 列值要大于等于当前值
简单的说明:
如果指定了sequence_col列,那么后续所有的dml语句中sequence_col中的值必须比当前的值大,否则不会执行dml语句。
下面是一个测试:
1.创建一个测试表,指定sequence_col列为id3,并插入两条数据,注意id1为1的那条数据的id3也是1
 
MySQL [dsg]> CREATE TABLE test1(
id1 int,
id2 int,
id3 int
) ENGINE=OLAP
UNIQUE KEY(id1)
DISTRIBUTED BY HASH(id1) BUCKETS 10
PROPERTIES (
"function_column.sequence_col" = "id3"
);
Query OK, 0 rows affected (0.02 sec)

MySQL [dsg]> insert into test1 values(1,1,1);
Query OK, 1 row affected (0.08 sec)
{'label':'label_daeda442be904e73_b57b04d45635655b', 'status':'VISIBLE', 'txnId':'89695911'}

MySQL [dsg]> insert into test1 values(10,10,10);
Query OK, 1 row affected (0.04 sec)
{'label':'label_a2b44a5973ea45e6_846ed523f9c96e53', 'status':'VISIBLE', 'txnId':'89695993'}

MySQL [dsg]> select * from test1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|    1 |    1 |    1 |
|   10 |   10 |   10 |
+------+------+------+
2 rows in set (0.02 sec)

2.再插入一条id1为1的数据,其中id3为3,由于3大于原来的1,所以插入成功了,由于表是主键模型,所以自动进行了merge操作,将原来的id1=1的数据进行了更新:


MySQL [dsg]> insert into test1 values(1,2,3);
Query OK, 1 row affected (0.04 sec)
{'label':'label_a093042f5aeb4178_9737ebea388e46fb', 'status':'VISIBLE', 'txnId':'89696333'}

MySQL [dsg]> select * from test1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|   10 |   10 |   10 |
|    1 |    2 |    3 |
+------+------+------+
2 rows in set (0.01 sec)

3.我们再插入一条id1为1的数据,但是设置id3为2,由于2小于原来的3,所以虽然显示插入成功了,但是其实内部并没有执行:


MySQL [dsg]> insert into test1 values(1,2,2);
Query OK, 1 row affected (0.08 sec)
{'label':'label_95526ec3f68b42e3_a0b494fcb2f85077', 'status':'VISIBLE', 'txnId':'89696448'}

MySQL [dsg]> select * from test1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|   10 |   10 |   10 |
|    1 |    2 |    3 |
+------+------+------+
2 rows in set (0.01 sec)

4.我们尝试删除这条id1为1的数据,然后再插入上面的数据,可以看到,虽然数据被删了,但是依然没有成功插入:

MySQL [dsg]> delete from test1 where id1=1;
Query OK, 1 row affected (0.05 sec)
{'label':'label_be5ae127f6d34fb3_9ed8e05017099387', 'status':'VISIBLE', 'txnId':'89851113'}

MySQL [dsg]> select * from test1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|   10 |   10 |   10 |
+------+------+------+
1 row in set (0.01 sec)

MySQL [dsg]> insert into test1 values(1,2,2);
Query OK, 1 row affected (0.07 sec)
{'label':'label_1593e3617ccf460f_94586473d5cee593', 'status':'VISIBLE', 'txnId':'89851253'}

MySQL [dsg]> select * from test1;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|   10 |   10 |   10 |
+------+------+------+
1 row in set (0.01 sec)

这是因为虽然你删除了,但是表内部其实只是打了标记,那么后续只要再插入id1为1的数据,依然受删除的这条数据sequence_col列的影响,可以设置set show_hidden_columns=true;来查看被删除的数据:


set show_hidden_columns = true;
变量设置后再查询


MySQL [dsg]> set show_hidden_columns = true;
Query OK, 0 rows affected (0.00 sec)

MySQL [dsg]> select * from  test1;
+------+------+------+-----------------------+-----------------------+------------------------+
| id1  | id2  | id3  | __DORIS_DELETE_SIGN__ | __DORIS_VERSION_COL__ | __DORIS_SEQUENCE_COL__ |
+------+------+------+-----------------------+-----------------------+------------------------+
|   10 |   10 |   10 |                     0 |                     3 |                     10 |
|    1 |    2 |    3 |                     1 |                     6 |                      3 |
+------+------+------+-----------------------+-----------------------+------------------------+
2 rows in set (0.01 sec)

可以看到id1=1的列被标记为删除,他的sequence_col为3

后续如果要dml这条数据,那么id3的值必须要大于3才能成功。

 


网站公告

今日签到

点亮在社区的每一天
去签到