TDengine多客户端查询结果不一致问题:是否存在数据丢失?
问题分析与解答
这个现象的核心原因是TDengine客户端的元数据缓存机制,具体细节和结论如下:
1. 为什么不同客户端查询结果不一致?
TDengine为了提升操作性能,客户端会在首次访问表时缓存表的schema(结构)信息,后续操作默认使用本地缓存,不会每次都从服务端拉取元数据。
在你的场景中:
- 客户端1执行了
alter table stb drop column c2和alter table stb add column c2 double,这两个操作直接修改了超级表stb的schema,客户端1的本地缓存会立即同步更新为最新结构(此时c2是double类型,对应新的列标识)。 - 客户端2在schema修改前已经获取并缓存了
stb的旧结构(c2是float类型,对应旧的列标识),后续没有重新连接或触发schema刷新,一直沿用旧缓存执行操作。
当客户端2执行insert into t1 values(now, 2, 2.2)时,是按照旧schema(float类型的c2)将数据写入到旧列的存储位置;而客户端1查询时,是按照新schema(double类型的c2)读取新列的存储位置,自然看不到旧数据和客户端2新插入的内容,所以显示NULL。反过来,客户端2用旧schema查询时,读取的是旧列位置的数据,因此能看到最初的1.2和新插入的2.2。
2. 是否存在数据丢失问题?
不存在数据丢失。所有数据都完整保存在TDengine的存储引擎中,只是不同客户端因为schema缓存不一致,读取的是不同的列存储位置而已。
解决方法
让客户端2重新建立与TDengine的连接,或者执行flush schema命令(客户端支持的情况下),客户端2会从服务端拉取最新的schema,之后两个客户端的查询结果就会完全一致。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

