DB::Exception: Too many parts (300)解决方法


前言

clickhouse频繁插入数据时出现DB::Exception: Too many parts (300)
通常是因为ClickHouse在插入数据时生成了太多的parts文件,而这些文件合并的速度跟不上插入的速度,导致超过了默认的parts_to_throw_insert值,即300个parts。

1、报错问题

DB::Exception: Too many parts (300)
在这里插入图片描述

2、解决方法

2.1、方法1

  • 修改clickhouse中的config.xml文件,添加以下配置参数(尝试增加可合并的分区数,修改ClickHouse配置文件中的<merge_tree>标签)
<merge_tree>
	<parts_to_delay_insert>600</parts_to_delay_insert>
	<parts_to_throw_insert>600</parts_to_throw_insert>
	<max_delay_to_insert>5</max_delay_to_insert>
	<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>
  • 修改后,重启clickhouse

2.2、方法2

减少并发数:降低写入ClickHouse的并发数,增加每批处理的数据量。例如,将200并发调整到50并发,每批数据量从1万条调整到5万条,这样可以减少生成的parts文件数量,避免超过默认值。

2.3、方法3

优化Merge线程池大小:通过设置background_pool_size参数来优化,这个参数通常设置为CPU核心数的两倍。如果修改后仍然出现问题,可能需要临时调整其他参数,例如number_of_free_entries_in_pool_to_lower_max_size_of_merge,以允许表正常进行merge操作

2.4、方法4

存储方式优化:对于数据量较小的情况,可以选择Compact存储方式,以减少merge的压力和时间。对于数据量大的情况,使用Wide存储方式

2.5、方法5

合理设置分区:如果每次插入涉及的分区太多,可能会导致异常和插入耗时。合理设置分区字段,避免每次插入请求涉及过多分区

2.6、方法6

设置数据过期时间:如果单表存储的数据量过大,建议设置数据的过期时间,或者采用其他数据库存储过大数据量的表

总结

以上方案,仅供参考

拓展

我遇到的问题及解决根本方法

1、查看分区数

SELECT 
    database, 
    table, 
    count() AS parts_count
FROM system.parts
WHERE active = 1
GROUP BY database, table
ORDER BY parts_count DESC;

在这里插入图片描述

2、问题分析

我们发现,ssa_connector_change_detail_local表的parts_count数量非常大,由于我的表ssa_connector_change_detail_local是一个同步数据的表,三方一直在推数据,并且这张表存入的每一条数据都要反复查询当前条数据是否存在,存在就删除在插入,不存在直接插入。一直在进行删除和插入的处理,这样的写法即使将parts_to_delay_insert增加到6000甚至更大都没有用,时间久了,治标不治本。

3、解决方案

优化ssa_connector_change_detail_local的数据插入方案,批量新增或者批量删除。但是我的处理方案是,直接将这张表的业务停掉,这样就解决根本问题了

这个错误信息表示数据库同时处理的非插入性查询过多。非插入查询是指除了插入数据以外的查询操作,比如更新、删除、查询等。 这个错误通常发生在数据库同时处理的查询请求超过其能力范围时。造成这个问题的原因可能是数据库服务器的资源不足,例如处理器、内存或存储空间不足,也可能是数据库配置不当,没有正确调整相关参数。 要解决这个问题,我们可以采取以下措施: 1. 增加数据库服务器的资源:可以增加处理器、内存、磁盘等硬件资源来提升数据库性能。 2. 优化数据库查询:可以通过对查询语句进行优化、创建合适的索引、调整查询条件等方法来提高查询效率。 3. 调整数据库配置参数:可以根据数据库的具体情况,适当调整相关配置参数,如最大连接数、最大并发查询数等。 4. 使用缓存技术:可以在应用层面使用缓存技术,减少直接访问数据库的次数,从而降低数据库的负载。 5. 考虑升级数据库版本:如果数据库版本较低,可以考虑升级到最新版本,由于每个新版本通常都会做一些性能优化和bug修复,可能能够解决相关问题。 综上所述,要解决"message: received from db::exception: too many simultaneous non-insert queries"错误,需要采取一系列措施来增加数据库服务器的性能、优化查询操作以及调整数据库配置参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月林城

如果受益了,请作者喝杯咖啡哟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值