OceanBase 4.2.5.1 查询视图INFORMATION_SCHEMA.COLUMNS 报错

【 使用环境 】生产环境
【 OB or 其他组件 】OceanBase4.2.5.1 OceanBase4.2.5.2
【 使用版本 】社区版
【问题描述】同一个SQL在4.2.5.2版本执行成功,在4.2.5.1执行失败,目前怀疑是4.2.5.1版本的BUG
【复现路径】
【附件及日志】SQL文本如下
select

TABLE_SCHEMA,

null,

TABLE_NAME,

COLUMN_NAME,

case

	when UPPER(DATA_TYPE)= 'DECIMAL' then 3

	when UPPER(DATA_TYPE)= 'DECIMAL UNSIGNED' then 3

	when UPPER(DATA_TYPE)= 'TINYINT' then

	case

		when LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0

		and LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0

		and LOCATE('(1)', COLUMN_TYPE) != 0 then -7

		else -6

	end

	when UPPER(DATA_TYPE)= 'TINYINT UNSIGNED' then

	case

		when LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0

		and LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0

		and LOCATE('(1)', COLUMN_TYPE) != 0 then -7

		else -6

	end

	when UPPER(DATA_TYPE)= 'BOOLEAN' then 16

	when UPPER(DATA_TYPE)= 'SMALLINT' then 5

	when UPPER(DATA_TYPE)= 'SMALLINT UNSIGNED' then 5

	when UPPER(DATA_TYPE)= 'INT' then 4

	when UPPER(DATA_TYPE)= 'INT UNSIGNED' then 4

	when UPPER(DATA_TYPE)= 'FLOAT' then 7

	when UPPER(DATA_TYPE)= 'FLOAT UNSIGNED' then 7

	when UPPER(DATA_TYPE)= 'DOUBLE' then 8

	when UPPER(DATA_TYPE)= 'DOUBLE UNSIGNED' then 8

	when UPPER(DATA_TYPE)= 'NULL' then 0

	when UPPER(DATA_TYPE)= 'TIMESTAMP' then 93

	when UPPER(DATA_TYPE)= 'BIGINT' then -5

	when UPPER(DATA_TYPE)= 'BIGINT UNSIGNED' then -5

	when UPPER(DATA_TYPE)= 'MEDIUMINT' then 4

	when UPPER(DATA_TYPE)= 'MEDIUMINT UNSIGNED' then 4

	when UPPER(DATA_TYPE)= 'DATE' then 91

	when UPPER(DATA_TYPE)= 'TIME' then 92

	when UPPER(DATA_TYPE)= 'DATETIME' then 93

	when UPPER(DATA_TYPE)= 'YEAR' then 91

	when UPPER(DATA_TYPE)= 'VARCHAR' then 12

	when UPPER(DATA_TYPE)= 'VARBINARY' then -3

	when UPPER(DATA_TYPE)= 'BIT' then -7

	when UPPER(DATA_TYPE)= 'JSON' then -1

	when UPPER(DATA_TYPE)= 'ENUM' then 1

	when UPPER(DATA_TYPE)= 'SET' then 1

	when UPPER(DATA_TYPE)= 'TINYBLOB' then -3

	when UPPER(DATA_TYPE)= 'TINYTEXT' then 12

	when UPPER(DATA_TYPE)= 'MEDIUMBLOB' then -4

	when UPPER(DATA_TYPE)= 'MEDIUMTEXT' then -1

	when UPPER(DATA_TYPE)= 'LONGBLOB' then -4

	when UPPER(DATA_TYPE)= 'LONGTEXT' then -1

	when UPPER(DATA_TYPE)= 'BLOB' then -4

	when UPPER(DATA_TYPE)= 'TEXT' then -1

	when UPPER(DATA_TYPE)= 'CHAR' then 1

	when UPPER(DATA_TYPE)= 'BINARY' then -2

	when UPPER(DATA_TYPE)= 'GEOMETRY' then -2

	when UPPER(DATA_TYPE)= 'UNKNOWN' then 1111

	when UPPER(DATA_TYPE)= 'POINT' then -2

	when UPPER(DATA_TYPE)= 'LINESTRING' then -2

	when UPPER(DATA_TYPE)= 'POLYGON' then -2

	when UPPER(DATA_TYPE)= 'MULTIPOINT' then -2

	when UPPER(DATA_TYPE)= 'MULTILINESTRING' then -2

	when UPPER(DATA_TYPE)= 'MULTIPOLYGON' then -2

	when UPPER(DATA_TYPE)= 'GEOMETRYCOLLECTION' then -2

	when UPPER(DATA_TYPE)= 'GEOMCOLLECTION' then -2

	else 1111

end as DATA_TYPE,

UPPER(case when UPPER(DATA_TYPE)= 'TINYINT' then case when LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0 and LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0 and LOCATE('(1)', COLUMN_TYPE) != 0 then 'BIT' when LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 and LOCATE('UNSIGNED', UPPER(DATA_TYPE)) = 0 then 'TINYINT UNSIGNED' else DATA_TYPE end when LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 and LOCATE('UNSIGNED', UPPER(DATA_TYPE)) = 0 and LOCATE('SET', UPPER(DATA_TYPE)) <> 1 and LOCATE('ENUM', UPPER(DATA_TYPE)) <> 1 then CONCAT(DATA_TYPE, ' UNSIGNED') when UPPER(DATA_TYPE)= 'POINT' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'LINESTRING' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'POLYGON' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'MULTIPOINT' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'MULTILINESTRING' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'MULTIPOLYGON' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'GEOMETRYCOLLECTION' then 'GEOMETRY' when UPPER(DATA_TYPE)= 'GEOMCOLLECTION' then 'GEOMETRY' else UPPER(DATA_TYPE) end) as TYPE_NAME,

UPPER(case when UPPER(DATA_TYPE)= 'DATE' then 10 when UPPER(DATA_TYPE)= 'TIME' then 8 +(case when DATETIME_PRECISION>0 then DATETIME_PRECISION + 1 else DATETIME_PRECISION end) when UPPER(DATA_TYPE)= 'DATETIME' or UPPER(DATA_TYPE)= 'TIMESTAMP' then 19 +(case when DATETIME_PRECISION>0 then DATETIME_PRECISION + 1 else DATETIME_PRECISION end) when UPPER(DATA_TYPE)= 'YEAR' then 4 when UPPER(DATA_TYPE)= 'TINYINT' and LOCATE('ZEROFILL', UPPER(COLUMN_TYPE)) = 0 and LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) = 0 and LOCATE('(1)', COLUMN_TYPE) != 0 then 1 when UPPER(DATA_TYPE)= 'MEDIUMINT' and LOCATE('UNSIGNED', UPPER(COLUMN_TYPE)) != 0 then 8 when UPPER(DATA_TYPE)= 'JSON' then 1073741824 when UPPER(DATA_TYPE)= 'GEOMETRY' then 65535 when UPPER(DATA_TYPE)= 'POINT' then 65535 when UPPER(DATA_TYPE)= 'LINESTRING' then 65535 when UPPER(DATA_TYPE)= 'POLYGON' then 65535 when UPPER(DATA_TYPE)= 'MULTIPOINT' then 65535 when UPPER(DATA_TYPE)= 'MULTILINESTRING' then 65535 when UPPER(DATA_TYPE)= 'MULTIPOLYGON' then 65535 when UPPER(DATA_TYPE)= 'GEOMETRYCOLLECTION' then 65535 when UPPER(DATA_TYPE)= 'GEOMCOLLECTION' then 65535 when CHARACTER_MAXIMUM_LENGTH is null then NUMERIC_PRECISION when CHARACTER_MAXIMUM_LENGTH > 2147483647 then 2147483647 else CHARACTER_MAXIMUM_LENGTH end) as COLUMN_SIZE,

65535 as BUFFER_LENGTH,

UPPER(case when UPPER(DATA_TYPE)= 'DECIMAL' then NUMERIC_SCALE when UPPER(DATA_TYPE)= 'FLOAT' or UPPER(DATA_TYPE)= 'DOUBLE' then case when NUMERIC_SCALE is null then 0 else NUMERIC_SCALE end else null end) as DECIMAL_DIGITS,

10 as NUM_PREC_RADIX,

case

	when IS_NULLABLE = 'NO' then 0

	else

	case

		when IS_NULLABLE = 'YES' then 1

		else 2

	end

end as NULLABLE,

COLUMN_COMMENT as REMARKS,

COLUMN_DEFAULT as COLUMN_DEF,

0 as SQL_DATA_TYPE,

0 as SQL_DATETIME_SUB,

case

	when CHARACTER_OCTET_LENGTH > 2147483647 then 2147483647

	else CHARACTER_OCTET_LENGTH

end as CHAR_OCTET_LENGTH,

ORDINAL_POSITION,

IS_NULLABLE,

null as SCOPE_CATALOG,

null as SCOPE_SCHEMA,

null as SCOPE_TABLE,

null as SOURCE_DATA_TYPE,

if (EXTRA like '%auto_increment%',

'YES',

'NO') as IS_AUTOINCREMENT,

if (EXTRA like '%GENERATED%',

'YES',

'NO') as IS_GENERATEDCOLUMN

from

INFORMATION_SCHEMA.COLUMNS

where

TABLE_SCHEMA = 'shenbi_uabc'

 and TABLE_NAME like 'form_entity'

order by

TABLE_SCHEMA,

TABLE_NAME,

ORDINAL_POSITION

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

用户问题: “在 OceanBase 4.2.5.1 版本中查询视图 INFORMATION_SCHEMA.COLUMNS 报错,而在 4.2.5.2 版本中执行成功,具体 SQL 如下,如何解决此问题?”

推荐使用 obdiag 工具进行日志采集,并且将采集到的日志提供给我们以便确认问题所在。

日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

为了更好地定位问题,请您按照以下步骤操作:

  1. 将上述命令中的 db_connect 参数替换为实际的数据库连接信息(包括正确的主机、端口、用户名、密码和数据库名)。
  2. 执行该 SQL 时,请确保获取到对应的 trace_id,并将 trace_id='Yxx' 替换为实际值。
  3. 执行完命令后,将生成的日志压缩包提供给我们以进一步分析。

另外,为了确定具体的问题,在此需要您提供一些信息:

  1. 查询视图 INFORMATION_SCHEMA.COLUMNS 时的具体报错信息是什么?
  2. 您是否可以提供执行该 SQL 的完整语句?
  3. 是否可以在 4.2.5.1 和 4.2.5.2 版本中分别重现该问题?如果可以,请描述具体的测试步骤。
  4. 您是否有自定义的租户或系统参数配置?如果有,请列出可能相关的配置项。

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

麻烦在425bp1上执行时候
1)设置trace信息
SET ob_enable_show_trace=‘ON’;

2)执行sql。

3)获取上个命令的trace
select last_trace_id();

4)获取trace对应的节点
select query_sql,svr_ip from gv$ob_sql_audit where trace_id=‘第三步获取的trace信息’;

5)取对应的svr_ip节点 过滤日志
grep “第三步获取的trace信息” observer.log*
grep “第三步获取的trace信息” rootservice.log*

6)提供日志信息即可。

1 个赞

SQL可以在4.2.5.1和4.2.5.2版本试一下,这一定是BUG,where后第二个字段条件换成 = 就能执行成功,换成 like 就执行失败。

2 个赞

根据您的描述以及提供的信息,问题可能与 SQL 执行计划或视图 INFORMATION_SCHEMA.COLUMNS 的实现差异有关。以下是具体分析和解决建议:


1. 问题分析

  • SQL 差异表现
    在 OceanBase 4.2.5.1 版本中,使用 LIKE 条件查询 INFORMATION_SCHEMA.COLUMNS 报错,而将条件改为 = 则可以正常执行。这表明问题可能与 LIKE 操作符的实现或优化器处理方式有关。

  • 版本差异
    您提到在 4.2.5.2 版本中该 SQL 可以正常执行,而在 4.2.5.1 中报错。这种行为可能是由于两个版本之间对 INFORMATION_SCHEMA.COLUMNS 视图的实现或优化器逻辑存在差异。

  • OCR 提取内容
    根据 OCR 提取的内容,图片中显示了一些日志信息,但无法直接提取到具体的错误码或错误消息。为了进一步定位问题,请提供完整的错误信息(包括错误码、SQLSTATE 和错误消息)。


2. 解决建议

(1) 确认错误信息

根据文档片段 4 和 6 的描述,您可以使用以下方法获取详细的错误信息:

  • Java 应用程序
    如果您使用的是 JDBC 驱动库,可以通过捕获 SQLException 异常并调用以下方法获取错误信息:

    try {
        // 执行 SQL
    } catch (SQLException e) {
        int errorCode = e.getErrorCode(); // 获取错误码
        String sqlState = e.getSQLState(); // 获取 SQLSTATE
        String errorMessage = e.getMessage(); // 获取错误消息
        System.out.println("Error Code: " + errorCode);
        System.out.println("SQL State: " + sqlState);
        System.out.println("Error Message: " + errorMessage);
    }
    
  • C 应用程序
    如果您使用的是 libmysql C 驱动库,可以通过以下方法获取错误信息:

    unsigned int errorCode = mysql_errno(mysql); // 获取错误码
    const char *sqlState = mysql_sqlstate(mysql); // 获取 SQLSTATE
    const char *errorMessage = mysql_error(mysql); // 获取错误消息
    printf("Error Code: %u\n", errorCode);
    printf("SQL State: %s\n", sqlState);
    printf("Error Message: %s\n", errorMessage);
    

请提供完整的错误信息以便进一步分析。


(2) 检查 SQL 执行计划

根据文档片段 1 的描述,您可以检查 SQL 的执行状态以确认是否存在重试或其他异常情况。执行以下查询以获取相关信息:

-- MySQL 模式
SELECT TENANT, INFO, TRACE_ID, STATE, TIME, TOTAL_TIME, RETRY_CNT, RETRY_INFO
FROM oceanbase.GV$OB_PROCESSLIST;

-- Oracle 模式
SELECT TENANT, INFO, TRACE_ID, STATE, TIME, TOTAL_TIME, RETRY_CNT, RETRY_INFO
FROM sys.GV$OB_PROCESSLIST;

重点关注以下字段:

  • RETRY_CNT:如果值大于 0,说明 SQL 存在重试。
  • RETRY_INFO:查看最后一次重试的原因。
  • TOTAL_TIME:累计执行时间是否异常。

(3) 尝试简化 SQL

为了排除复杂 SQL 对问题的影响,您可以尝试简化查询语句。例如,仅查询 TABLE_NAMECOLUMN_NAME 字段,并逐步添加其他字段以定位问题:

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'shenbi_uabc'
  AND TABLE_NAME LIKE 'form_entity%';

(4) 升级或回退版本

如果问题确实是由版本差异引起的,您可以考虑以下两种方案:

  • 升级到 4.2.5.2
    如果条件允许,建议将环境升级到 4.2.5.2 版本,以验证问题是否解决。

  • 回退到兼容模式
    如果暂时无法升级,可以尝试在 4.2.5.1 中使用 = 替代 LIKE,或者通过调整 SQL 写法规避问题。


3. 可能的内在原因

根据您的描述,问题可能与以下因素有关:

  • 优化器行为差异
    不同版本的优化器可能对 LIKE 操作符的处理方式不同,导致执行计划发生变化。

  • 视图实现差异
    INFORMATION_SCHEMA.COLUMNS 是一个虚拟视图,其底层实现可能在不同版本之间有所调整。


4. 总结

目前尚无法完全确定问题的具体原因,建议您按照以下步骤操作:

  1. 提供完整的错误信息(错误码、SQLSTATE 和错误消息)。
  2. 使用上述方法检查 SQL 执行计划和状态。
  3. 尝试简化 SQL 或升级版本以验证问题。

如果以上方法仍无法解决问题,请联系 OceanBase 官方技术支持团队以获取进一步帮助。

详情请参考:

  1. 并行执行问题诊断
  2. SQL 规范
  3. 日志级别
  4. MySQL 兼容应用错误处理规范
  5. case 编写常用命令
  6. SQL 调优常见问题
  7. REGEXP_LIKE
  8. 单表查询

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

:facepunch: :facepunch: :facepunch: :facepunch:

可能是个已知bug在bp2进行修复了。
不过建议查询选择ob的系统表和视图,INFORMATION_SCHEMA.中的表很多是为了兼容mysql而创建存在部分问题

这个是查询也会报错吗

这边也测试下