在 gv$sql_audit 中查询发现存在 CONSISTENCY_LEVEL 字段为 -1 的情况,本文介绍出现该情况的原因以及处理方法。
影响版本
OceanBase 数据库 V2.X 版本。
问题现象
在 gv$sql_audit 中查询发现查询 SEELCT * FROM __all_table WHERE not_exist_column=1 的 CONSISTENCY_LEVEL 字段为 -1。
查询语句如下:
obclient> SELECT query_sql, ret_code, consistency_level FROM gv$sql_audit WHERE query_sql LIKE '%not_exist_column%'\G
错误信息如下:
*************************** 1. row ***************************
query_sql: select * from __all_table where not_exist_column=1
ret_code: -5217
consistency_level: -1
说明
该行记录的 ret_code 为该 SQL 返回的值,如果该查询执行失败,则 ret_code 会记录错误码。
背景信息
OceanBase 数据库提供了两种一致性级别:STRONG 和 WEAK。一致性级别会影响路由策略的选择。
CONSISTENCY_LEVEL 的取值含义如下表所示:
| 字段值 | 一致性级别 | 说明 |
|---|---|---|
| -1 | INVALID | 不可用 |
| 1 | FROZEN | 冻结 |
| 2 | WEAK | 弱一致性级别 |
| 3 | STRONG | 强一致性级别 |
INVALID:表示该 SQL 不具有一致性级别或执行错误。
STRONG:读取最新数据(Read After Write),要求一致性快照,路由策略优先路由到 Leader 副本。
WEAK:不要求读取最新数据,读取结果不要求快照,路由策略优先路由到 Follower 副本。
FROZEN:只有副本处于转储或合并时会设置为该级别,但考虑到手动合并的场景,因此可以手动配置
ob_read_consistency变量为 FROZEN。此时,ob_read_consistency变量的设置无效,路由策略优先路由到未冻结的副本有关
ob_read_consistency变量的更多信息,请参见《OceanBase 数据库 参考指南》中的 系统变量 章节。
问题原因
导致一致性级别为 INVALID 主要有两种可能原因。
会话级变量的
SET命令会出现CONSISTENCY_LEVEL=-1的情况。例如:obclient> SET SESSION autocommit = 1; Query OK, 0 rows affected (0.00 sec) obclient> SELECT SVR_IP,QUERY_SQL,CONSISTENCY_LEVEL FROM gv$sql_audit WHERE QUERY_SQL LIKE '%autocommit%'; +----------------+-------------------------------+-------------------+ | SVR_IP | QUERY_SQL | CONSISTENCY_LEVEL | +----------------+-------------------------------+-------------------+ | xxx.xx.xxx.xxx | SET SESSION autocommit = true | -1 | +----------------+-------------------------------+-------------------+ 2 rows in set (0.01 sec)执行的 SQL 因为各种原因失败也将导致
CONSISTENCY_LEVEL= -1。例如:obclient> SELECT * FROM foobar; ERROR 1146 (42S02): Table 'test.foobar' doesn't exist obclient> SELECT SVR_IP,QUERY_SQL,CONSISTENCY_LEVEL FROM gv$sql_audit WHERE QUERY_SQL LIKE '%foobar%'; +-----------------+----------------------+-------------------+ | SVR_IP | QUERY_SQL | CONSISTENCY_LEVEL | +-----------------+----------------------+-------------------+ | xxx.xxx.xxx.xxx | SELECT * FROM foobar | -1 | +-----------------+----------------------+-------------------+ 1 row in set (0.00 sec)
解决方式
会话级变量设置命令的
CONSISTENCY_LEVEL=-1不会影响 OceanBase 数据库的使用。如果是 SQL 语法错误,请参见《 OceanBase 数据库 SQL 参考(MySQL 模式)》或 《 OceanBase 数据库 SQL 参考(Oracle 模式)》 手册检查您的 SQL 语句。