执行sql时,报列不存在或者表不存在怎么办 #2837
-
在执行sql的过程中,有时候会出现下面的报错:
或者 执行的查询语句中的字段在mysql库表里面真实存在,但是在dble中查询这个列有时候可以执行,有时候报列不存在
但是
遇到这样的问题怎么排查? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 1 reply
-
上述的问题其实都是和dble的表元数据相关,首先得搞明白dble中表元数据的相关概念。
直接下推对于此类语句,dble仅仅将sql下推到mysql节点上执行,并且转发mysql的结果 需要dble解析处理对于此类语句,dble会对sql进行解析,检查sql中涉及表的列是否存在,此时会用到dble中的表元数据信息 如何区分两种类型通过dble提供的explain来区分 下面的例子是直接下推的sql示例:
这样就很容易解释: 问题:dble中的表元数据是从mysql中获取的,因此会存在不一致的情形,问题中的两种情况就比较典型
如何解决元数据不同步
理论上,reload @@config 也会有同步元数据的功能,但是,reload @@config更加智能,在配置没有变更的情况下,不会同步元数据,因此可以直接使用reload @@metadata |
Beta Was this translation helpful? Give feedback.
上述的问题其实都是和dble的表元数据相关,首先得搞明白dble中表元数据的相关概念。
这里我将dble中语句简单的分为两种类型:
直接下推
对于此类语句,dble仅仅将sql下推到mysql节点上执行,并且转发mysql的结果
需要dble解析处理
对于此类语句,dble会对sql进行解析,检查sql中涉及表的列是否存在,此时会用到dble中的表元数据信息
对于mysql返回的结果,dble不仅仅是简单的转发,会进行排序,去重等复杂的操作。
如何区分两种类型
通过dble提供的explain来区分
下面的例子是直接下推的sql示例: