环境配置:
clickhouse 集群,
集群有三个主节点
集群有三个slave节点
建表语句:
CREATE TABLE IF NOT EXISTS schematest.test_lq ON CLUSTER clustername
( id UInt64, column1 String)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}','{replica}')
ORDER BY id;
create table schematest.test_lq_all on cluster clustername
( id UInt64, column1 String)
engine = Distributed(clustername ,schematest, test_lq,hiveHash(id))
SETTINGS fsync_after_insert=1,fsync_directories=1;
insert into schematest.test_lq_all values(1,'xsssssss')(2,'xxxxxx')(3,'yyyxxx');
insert into schematest.test_lq_all values(4,'xsssssss')(5,'xxxxxx')(6,'yyyxxx');
insert into schematest.test_lq_all values(7,'xsssssss')(8,'xxxxxx')(9,'yyyxxx');
删除语句,删除物理表:
ALTER TABLE test_lq ON CLUSTER clustername DELETE WHERE id='dd'
在master1 插入数据后,在master1和master2 都能在test_lq_all 中查询到数据。但是在master2的test_lq 表中查看不到。这种现象我觉得是正常的。
然而在master2 删除数据,在master1 中查询不到数据了,这个是为什么,按照我的理解不会删除master1中的数据,但是实际情况缺删除了。
使用分布式任务了,
ALTER TABLE test_lq ON CLUSTER clustername DELETE WHERE id='dd'
在整个集群中的所有节点上都会执行删除操作的
在ClickHouse集群中,删除操作会更新所有副本节点上的数据。在你的表定义中,你使用了ReplicatedMergeTree
引擎,这种引擎会将数据副本复制到不同的节点上,以提高数据的可靠性和可用性。当你在一个主节点上进行删除操作时,该操作会在所有副本节点上执行,以确保数据的一致性。
如果你希望在ClickHouse集群中只删除单个节点上的数据,而不影响其他节点的数据,可以使用以下两种方法之一:
方法一:调整表定义 - 创建一个新的分布式表,并将数据从原始表复制到新表。 - 删除原始表。 - 将新表重命名为原始表的名称。
-- 创建新的分布式表
CREATE TABLE IF NOT EXISTS schematest.test_lq_new
ON CLUSTER clustername
(
id UInt64,
column1 String
)
ENGINE = Distributed(clustername, schematest, test_lq, rand())
SETTINGS fsync_after_insert=1, fsync_directories=1;
-- 复制数据到新表
INSERT INTO schematest.test_lq_new SELECT * FROM schematest.test_lq_all;
-- 删除原始表
DROP TABLE schematest.test_lq_all;
-- 重命名新表
RENAME TABLE schematest.test_lq_new TO schematest.test_lq_all;
方法二:使用WHERE条件过滤 - 在删除语句中使用WHERE条件,只删除特定节点的数据。
ALTER TABLE test_lq ON CLUSTER clustername DELETE WHERE id='dd' AND replica = 'node2';
请注意,如果你希望在ClickHouse集群中执行删除操作,请确保注意备份和数据可靠性的问题,这里只提供了在不影响其他节点数据的前提下删除单个节点数据的方法。
以上是两种解决方案,根据你的具体需求选择其中一种即可。如有更多疑问,请随时追问。