ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”

Posted

技术标签:

【中文标题】ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”【英文标题】:ClickHouse failed with the error "DirectoryMonitor: Checksum of extra info doesn't match: corrupted data" 【发布时间】:2020-10-15 11:46:02 【问题描述】:

我的二进制文件在数据中带有曲线(我的错)。 ClickHouse 无法将其插入表中并停止处理其他数据。我刚刚打开二进制文件进行编辑并修复了错误的字段。之后,ClickHouse 获取了该文件并给出了关于无效校验和的错误。

default.affiliate_program.DirectoryMonitor: Code: 40, e.displayText() = 
DB::Exception: Checksum of extra info doesn't match: corrupted data. Reference: cb322c17e14d6816abfcdc16842e7bdd. Actual: f4afe41e77b9a92bfa4048648a3aebbb.,

之后,ClickHouse 将文件传输到损坏的文件夹并继续。 是否可以更改校验和或其他任何内容以处理我重写的文件?

【问题讨论】:

【参考方案1】:

https://github.com/ClickHouse/ClickHouse/issues/16005

无法更改分布式表的 .bin 文件。它具有内置校验和,因此需要重新计算它,但这很麻烦。

但还有另一种方式。可以手动选择和插入未损坏的 .bin 文件select * from file('/path/to/file.bin', 'Distributed')

更多详情:https://github.com/ClickHouse/ClickHouse/pull/9653

【讨论】:

【参考方案2】:

我只是扩展了@Denny Crane 的原始问题和答案。


由于错误的配置default-profile,我收到了类似的错误 - 它被标记为readonly。结果后续数据插入到分布式表会导致如下错误:

database.table.DirectoryMonitor: Code: 164, e.displayText() = 
DB::Exception: Received from **:9000. 
DB::Exception: default: Cannot execute query in readonly mode. Stack trace:

0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x10519be0 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8f5072d in /usr/bin/clickhouse
..

插入分布式表时:

.. 数据块刚刚写入 本地文件系统。 ..您应该检查是否发送了数据 通过检查文件列表成功(等待发送的数据) 在表目录:/var/lib/clickhouse/data/database/table/."

(详情见Distributed Table Engine)

让我们查看 /var/lib/clickhouse/data/database/table/ 文件夹内部并检查 'hanging' bin-file 以找出问题的原因:

sudo vim /var/lib/clickhouse/data/database/table/default@../3757.bin

bin 文件的顶部是原始的 sql-query 和查询设置。在我的情况下,readonly 设置为 1(见最后一行)是不允许执行插入的问题根源(格式 bin 文件将来可以更改,输出会不同):

εû×^L<88>^H¡©^Cõ^FINSERT INTO database.table(column_list) VALUES^V
use_uncompressed_cache^@^A0^N
load_balancing^@^F
random^Q
force_primary_key^@^A1^K
log_queries^@^A1^H
readonly^@^A1^P
..

要修复它需要:

    修复根本原因(在我的情况下需要正确定义 default-profile)并检查测试插入是否正常工作

    在集群的每个节点上做

将“挂起”的 bin 文件从 /var/lib/clickhouse/data/database/table/default@../ 移动(而不是复制)到 /var/lib/clickhouse/user_files/

从 CH 打开文件并重新插入

# check data availability
SELECT count()
FROM file('*.bin', 'Distributed')

# re-insert data
INSERT INTO database.table
SELECT *
FROM file('*.bin', 'Distributed')
# FROM file('3757.bin', 'Distributed')
从原始文件夹/var/lib/clickhouse/user_files/ 中删除已处理的“挂起”文件

【讨论】:

以上是关于ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”的主要内容,如果未能解决你的问题,请参考以下文章

Google 支付交易失败并出现 409 错误

创建 Direct3D12 设备失败并出现 E_NoInterface

Clickhouse 开始出现错误:无法获取管道容量

从具有 O_DIRECT 的 HDD 读取()失败并显示 22(EINVAL,无效参数)

遵循官方 direct2d 示例,但出现访问冲突错误 [重复]

Clickhouse Alter操作造成zk连接丢失的问题分析