gv$ob_sql_audit为什么存在sql_id为空的数据

@论坛小助手 实际不影响业务,了解一下问题存在原因。

1 个赞

根据文档库中的信息,GV$OB_SQL_AUDIT 视图中记录了 SQL 的执行审计信息。关于 sql_id 为空的数据,虽然在提供的文档片段中没有直接提到原因,但可以结合以下信息进行分析:

  1. 视图定义与字段含义

    • GV$OB_SQL_AUDIT 是 OceanBase 数据库的动态性能视图,用于显示整个集群的运行状态和性能指标信息(参考文档:OceanBase 自有视图 → 视图区分 → 根据使用场景区分 → 动态性能视图)。
    • 其中 sql_id 字段通常用于唯一标识一条 SQL 语句。
  2. 可能的原因

    • 空查询或无效 SQL:如果某些 SQL 语句是空查询(例如仅包含注释或空白字符),OceanBase 可能不会为其分配 sql_id,而是直接记录为 NULL。这与错误码 ERROR 1065 (42000) 相关,表示查询为空(参考文档:ERROR 1065 (42000) : Query was empty)。
    • 内部操作或系统维护:某些系统级别的操作(如内部统计、健康检查等)可能不会生成正式的 SQL 执行计划,因此也不会有 sql_id
    • SQL 被优化掉:对于一些被优化器优化掉的 SQL(例如常量表达式计算结果),可能不会生成实际的执行计划,导致 sql_id 为空。
  3. 影响分析

    • 如果这些数据不影响业务逻辑,并且仅出现在审计日志中,通常无需担心。它们可能是由于上述原因产生的正常现象。
  4. 建议排查步骤

    • 检查 GV$OB_SQL_AUDIT 中其他相关字段(如 query_sqltrace_id),确认这些 sql_id 为空的记录是否对应空查询或系统操作。
    • 如果需要进一步确认,可以联系 OceanBase 技术支持团队获取更详细的解释。

总结:sql_id 为空的数据可能是由于空查询、系统内部操作或优化器优化导致的正常现象。如果这些数据未对业务造成影响,则无需特别处理。

详情请参考:

  1. 启用和关闭并行查询
  2. 0001 ~ 3999
  3. 并行查询的执行
  4. 表存储
  5. 4000 ~ 4499
  6. OceanBase 自有视图
  7. 7000 ~ 7999
2 个赞

麻烦取一条 GV$OB_SQL_AUDIT中sql_id为空的数据看下

5 个赞

不是什么SQL都能正常存入sqlaudit中的,要满足一些条件才会记录。有些字段为空,一样的道理。

5 个赞

观察有够细致,哈。sqlid是优化器参数化后对sql md5生成的。

2 个赞

有了结果记得跟大家分享一下哈

2 个赞

不同的数据库,应该有不同的生成方式吧?

1 个赞

根据文档库中的信息,不同的数据库确实有不同的生成方式和设计特点。以下是关于 OceanBase 数据库与其他传统数据库在生成方式和设计上的差异分析:

1. 存储引擎设计

  • OceanBase 数据库:采用读写分离的架构,将数据分为基线数据(SSTable)和增量数据(MemTable)。增量数据存储在内存中,基线数据存储在 SSD 盘上。这种设计使得 DML 操作完全在内存中完成,性能非常高(参考文档:集群管理 FAQ → 存储 FAQ → OceanBase 数据库的存储引擎和传统数据库有什么不一样的地方?)。
  • 传统数据库:通常采用直接写入磁盘的方式,所有数据更新都需要同步到磁盘,导致写操作性能较低。

2. 索引生成方式

  • OceanBase 数据库:支持本地索引和全局索引。默认情况下,MySQL 模式创建的是本地索引,而 Oracle 模式创建的是全局索引。本地索引与分区数据共用分区,全局索引则为单独分区(参考文档:索引设计 → 索引简介)。
    -- 创建本地索引
    CREATE INDEX idx_t1_name1 ON t1(name1);
    
    -- 创建全局索引
    CREATE INDEX idx_t1_name2 ON t1(name2) GLOBAL;
    
  • 传统数据库:通常只支持单一类型的索引(如 B+ 树索引),并且索引生成方式较为固定,无法灵活选择本地或全局索引。

3. 字符集和字符序

  • OceanBase 数据库:允许在创建数据库时指定字符集和字符序,并且可以在同一 OBServer 上创建具有不同字符集和字符序的数据库(参考文档:数据库级字符集和字符序 → 指定数据库的字符集和字符序)。
    -- 创建指定字符集的数据库
    CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
  • 传统数据库:通常在实例级别设置字符集和字符序,灵活性较低。

4. 外表设计

  • OceanBase 数据库:支持外表(External Table),数据存储在外部存储服务中,外表可以像普通表一样进行查询、链接、聚合等操作,但不支持 DML 操作和索引(参考文档:关于外表)。
  • 传统数据库:部分数据库也支持外表,但功能可能较为有限,且实现方式不同。

5. 权限模型

  • OceanBase 数据库
    • 在 MySQL 模式下,数据没有 Owner 概念,访问数据时通常需要授权。
    • 在 Oracle 模式下,用户自动成为同名 Schema 中对象的所有者,无需额外授权即可访问自己 Schema 中的对象(参考文档:DCL → 默认权限模型)。
  • 传统数据库:权限模型因数据库类型而异,例如 MySQL 和 PostgreSQL 的权限模型相对简单,而 Oracle 的权限模型更为复杂。

总结

不同的数据库在存储引擎、索引生成方式、字符集支持、外表设计以及权限模型等方面确实存在显著差异。OceanBase 数据库通过分布式架构和灵活的设计,在高可用性、高性能和高扩展性方面表现出色,同时提供了丰富的功能以满足不同场景的需求。

更多信息请查看:

  1. 集群管理 FAQ
  2. 存储过程
  3. 数据库级字符集和字符序
  4. 关于外表
  5. 索引设计
  6. 使用 MySQL 租户做常见数据库开发
  7. SQL 基础操作(MySQL 模式)
  8. 创建数据库
  9. DCL

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

1 个赞

不可能吧。。就算发个变量过来的SQL也会有SQL_ID

2 个赞

不同数据库是不一样的,我以为只是讨论ob呢哈哈

1 个赞

image
能提供一下截图么 这边测试未复现

2 个赞

image

2 个赞

ob版本是多少 执行select * from gv$ob_sql_audit where sql_id=’’ limit 2\G
发一下看看都是啥sql

3 个赞

这么多都是sql_id为空?我以为个别的呢。有具体的sql文本吗?

2 个赞

这个回答专业,我也学习一下

2 个赞

observer版本是4.3.5.0,数据不好贴出来。

1 个赞