首页 > 其他分享 >ClickHouse关于插入重复数据丢失问题

ClickHouse关于插入重复数据丢失问题

时间:2022-11-22 11:13:45浏览次数:67  
标签:count insert ceb zkm dev 插入 select 丢失 ClickHouse

 

ClickHouse关于插入重复数据丢失问题

 

对复制表多次写入重复数据无效。

如下:

dev-app76 :) select count(*) from zkm;

SELECT count(*)
FROM zkm

Query id: 8e2bbf61-8adf-4fcc-a6d8-5601e258347d

┌─count()─┐
│       0 │
└─────────┘

1 rows in set. Elapsed: 0.010 sec. 


--为减少篇幅,过程略
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;


dev-app76 :) select count(*) from zkm;

SELECT count(*)
FROM zkm

Query id: a465d57a-d868-4c3e-b572-a571e9541aa5

┌─count()─┐
│       1 │
└─────────┘

1 rows in set. Elapsed: 0.010 sec. 

 

 

这会导致另外个问题,中途将数据删除成功后,无法再次插入。

dev-app76 :) alter table zkm_local on cluster ceb_cluster delete where 1;

ALTER TABLE zkm_local ON CLUSTER ceb_cluster
    DELETE WHERE 1

Query id: 71b895fa-6b5a-447e-98ad-cf98e9d7d6d2

┌─host──────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ dev-app76 │ 9000 │      0 │       │                   3 │                0 │
│ dev-app78 │ 9000 │      0 │       │                   2 │                0 │
│ dev-app77 │ 9000 │      0 │       │                   1 │                0 │
│ dev-app79 │ 9000 │      0 │       │                   0 │                0 │
└───────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.135 sec. 

dev-app76 :) select count(*) from zkm;

SELECT count(*)
FROM zkm

Query id: 6cd25adc-f580-4c33-b284-e683b469c541

┌─count()─┐
│       0 │
└─────────┘

1 rows in set. Elapsed: 0.011 sec. 

dev-app76 :) insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;

INSERT INTO default.zkm SELECT *
FROM ceb_dev.T_E_RETURN_INFO
LIMIT 1

Query id: 8c235601-8aeb-4e40-8562-bf5de83d22d1

Ok.

0 rows in set. Elapsed: 0.033 sec. 

dev-app76 :) select count(*) from zkm;

SELECT count(*)
FROM zkm

Query id: bbe2f00a-12db-47a2-bbea-132bbbd42e45

┌─count()─┐
│       0 │
└─────────┘

1 rows in set. Elapsed: 0.009 sec. 

 

 

实际上这个是ClickHouse默认的预期行为,点击查看官档

数据块会去重。对于被多次写的相同数据块(大小相同且具有相同顺序的相同行的数据块),该块仅会写入一次。这样设计的原因是万一在网络故障时客户端应用程序不知道数据是否成功写入DB,此时可以简单地重复 INSERT 。把相同的数据发送给多个副本 INSERT 并不会有问题。因为这些 INSERT 是完全相同的(会被去重)。去重参数参看服务器设置 merge_tree 。(注意:Replicated*MergeTree 才会去重,不需要 zookeeper 的不带 MergeTree 不会去重)

这里涉及几个新的概念:

数据块

数据块写入的原子性

max_insert_block_size

资料较少,《ClickHouse原理解析与应用实践》有提到Block和Block流,并不确定与这里的数据块是不是一样的东西。

以及如何测试数据块写入的原子性,因为参数max_insert_block_size对于客户端clickhouse-client和insert select无效。

 

扯远了。

对于重复数据插入无效问题,由参数insert_deduplicate控制。

默认是启用的。

ev-app76 :) show settings like 'insert_deduplicate';

SHOW SETTINGS LIKE 'insert_deduplicate'

Query id: b8b78d6e-cdf8-4527-a942-ecdabcd20090

┌─name───────────────┬─type─┬─value─┐
│ insert_deduplicate │ Bool │ 1     │
└────────────────────┴──────┴───────┘

1 rows in set. Elapsed: 0.003 sec. 

 

 

临时设置为禁用后,就可以插入重复数据了。

dev-app76 :) set insert_deduplicate=0;

SET insert_deduplicate = 0

Query id: 457f9f18-2508-47a2-b352-26421b73802d

Ok.

0 rows in set. Elapsed: 0.001 sec. 

insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;
insert into default.zkm select * from ceb_dev.T_E_RETURN_INFO limit 1;

dev-app76 :) select count(*) from zkm;

SELECT count(*)
FROM zkm

Query id: eae41929-bb63-4b0b-9d67-b66affeb9c7d

┌─count()─┐
│       5 │
└─────────┘

1 rows in set. Elapsed: 0.010 sec. 

 

标签:count,insert,ceb,zkm,dev,插入,select,丢失,ClickHouse
From: https://www.cnblogs.com/PiscesCanon/p/16914472.html

相关文章

  • ClickHouse 语法优化细节(二)
    5、聚合计算外推聚合函数内的计算,会外推,例如:EXPLAINSYNTAXSELECTsum(UserID*2)FROMdatasets.visits_v1;//优化后效果SELECTsum(UserID)*2FROMdatasets.v......
  • 在博客园随笔中插入3D分子模型
    技术背景博主对前端技术不甚了解,只是想在博客中直接展示一些已有的分子结构,而且需要是可以交互的。而我们了解到通过3Dmol这样的前端工具可以实现,通过在博客园随笔中直接......
  • MFC插入对话框
    方法一:  方法二:         添加后的对话框:         ......
  • vue组件中插入二维码的操作
    vue组件中插入二维码的操作 引入在public/index.html的head标签中引入:<scriptsrc="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>......
  • 使用SQL快速插入100000条数据
    DELIMITER//#使用delimiter关键字//createproceduretest()#创建存储过程begindeclareiintdefault0;#声明一个默认值为0的局部变量iwhilei<100000do#......
  • Vim实用技巧(3)——插入模式
    插入模式插入模式技巧13在插入模式中即可即时更正错误技巧14返回普通模式技巧15不离开插入模式,粘贴寄存器中的文本技巧16随时随地做运算技巧13在插入模式......
  • 代码随想录刷题营day1|704.二分查找 34. 有序数组找首位末位 35.搜索插入的位置 27.移
    一、数组理论基础数组下标都是从0开始的数组内存空间的地址是连续的数组的元素是不能删的,只能覆盖二、刷题第一题704.二分查找题目链接:https://leetcode.com/prob......
  • C语言———链表的创建、循环删除和循环插入系统
    参考主要是谭向强的那本《C程序设计》和B站上的小甲鱼的视频,视频的话B站上搜就有,就不把链接放上了。背景:     前两天在学习C语言的过程中又重新学习了一......
  • 解决Mysql 5.7 不能插入中文的问题
    问题的解决方案问题描述:在学习DML插入中文数据时,发现出现了以下问题insertintotea(id,name)values(2,'徐凤年');ERROR1366(HY000):Incorrectstringv......
  • [排序算法] 2路插入排序 (C++)
    前言本文章是建立在插入排序的基础上写的,如果还有不懂插入排序的童鞋先停下脚步,可以先看看这里~❤❤❤直接/折半插入排序2路插入排序解释在插入排序中,当待插入......