美文网首页
clickhouse删除过期partition

clickhouse删除过期partition

作者: 站在海边看远方 | 来源:发表于2023-05-21 20:22 被阅读0次

clickhouse中有时候过期partition不能自动删除,需要人工干预,手动删除过期的partition,以释放磁盘。
由于partition不支持条件范围删除,所以写了一个shell脚本,循环删除clickhouse集群中的所有分片的过期partition。

注意事项

删除partition的操作不可逆,即执行之后数据删除之后不可恢,执行脚本之前一定要验证好,不要误删数据以免造成故障。

脚本

脚本内容如下

#clickHouse 集群连接参数
password="ck_pwd"
cluster="ck_cluster"

# 数据库和表名称
database="your_db"
table="your_table"

# 要删除的分区的日期范围
end_date="20230423"


# 获取所有的host
hosts=$(clickhouse-client --password="$password" --query="SELECT host_name FROM system.clusters WHERE cluster ='$cluster'")

# 循环遍历 ClickHouse 集群中的所有分片,并执行 SQL 语句
while read -r host; do
  echo "Executing SQL on host: $host"
  #clickhouse-client --host="$host" --password="$password" --query="$sql"
  partitions=$(clickhouse-client --host="$host" --password="$password" --query "SELECT DISTINCT partition FROM system.parts WHERE database='$database' AND table='$table' AND partition < '$end_date'")
  while read -r partition; do
    drop_sql="ALTER TABLE $database.$table DROP PARTITION '$partition'"
    echo "executing drop, host:$host, partition:$partition, drop_sql:$drop_sql"
    if [[ -z "$partition" ]]; then
       echo "partitopn null, continue"
       continue
    fi
    clickhouse-client --host="$host" --password="$password" --query="$drop_sql"
  done <<< "$partitions"

done <<< "$hosts"
echo "done."

如上的脚本是删除指定数据库的指定表的过期partition,shell中的一些字段解释如下

  • passsword: ck节点的密码,我的ck集群的所有分片/副本的密码是一致的
  • cluster: ck集群的名称,通过集群名称查询集群下的所有分片和副本的host
  • database: 要删除的数据库
  • table: 要删除的具体的表
  • end_date: 删除end_date之前的partition,我的表的partition格式是yyyyMMdd

首先查询system.clusters表,获得集群里的所有节点的host
然后遍历所有的host,挨个删除本地表上的过期的partition,小于end_date的partition全部删除

相关文章

网友评论

      本文标题:clickhouse删除过期partition

      本文链接:https://www.haomeiwen.com/subject/opczsdtx.html