如何查询OB数据库中所有的日志呢

我有如下问题,需要查询OB数据库中对指定的业务库的insert 、update、delete操作的所有审计sql,我下面写了一个查询insert的sql,我理解这个量应该很大,但是查询结果只有102条数据,我如果需要查询所有的审计sql应该怎么做呢,需要大佬们帮我确认下日志表是不是查询我发的内容,或者审计结果是日志文件?我想要OB的SQL执行日志信息

SELECT
FROM_UNIXTIME(t.REQUEST_TIME / 1000000) AS request_timestamp,
t.query_sql AS query_text,
‘ob_kf’ AS database_name,
t.db_name AS schema_name,
t.tenant_name,
t.user_name,
t.elapsed_time / 1000000 AS elapsed_seconds,
t.affected_rows,
t.ret_code
FROM
oceanbase.gv$ob_sql_audit t
WHERE
t.query_sql LIKE ‘%insert ignore jck%’ or t.query_sql LIKE ‘%insert ignore into jck%’
AND t.db_name = ‘qxk’
ORDER BY
t.REQUEST_TIME DESC
LIMIT 1000;

3 个赞

11

2 个赞

666

1 个赞

用虚表的stmt_type过滤试试

1 个赞

学到了

没有用过呢,老师能发一个参考例子吗,另外我刚刚试了下,通过gv$ob_sql_audit 视图能查询到的最早审计日志的时间为2025-11-27 06:58:37.9152,感觉这个视图查不到所有的日志

#总记录数:1990618
SELECT
count(1)
FROM
oceanbase.gv$ob_sql_audit t;

#最新日志时间:2025-11-27 09:25:32.0459
SELECT
max(FROM_UNIXTIME(t.REQUEST_TIME / 1000000))
FROM
oceanbase.gv$ob_sql_audit t;

#最早日志时间:2025-11-27 06:58:37.9152
SELECT
min(FROM_UNIXTIME(t.REQUEST_TIME / 1000000))
FROM
oceanbase.gv$ob_sql_audit t;

虚表oceanbase.__all_virtual_sql_audit

stmt_type字段表示SQL语句的类型,比如insert,select,delete等等,或者你根据自己的需求,自己写SQL查一下

1 个赞

sql_audit表是一个固定大小循环写的表,如果表配置内存太小,数据库负载高,SQL会被覆盖,可能查询不到完整的SQL执行SQL。 一般我们做法是创建一个临时表,表结构和sql_audit一样或者只构建需要的字段,按REQUEST_TIME时间做增量抽取到这张临时表,理论上计算好sql_audit表的min(REQUEST_TIME)和max(REQUEST_TIME)的时间范围,每次抽取数据到临时表的频率低于这个时间范围,基本能抽到完整的审计数据。

好的老师,我试一下

老师好,我昨晚在官网上还看到了一个OB社区版不支持审计功能,但是我们sql_audit确实能查询出数据,这个我应该如何理解呢,我现在有点不确定sql_audit是否记录的是我们的日志。

另外一个问题,您说的这个增量抽取审计日志到临时表方案我感觉还蛮好的,这个需要自己写代码来实现吗,我们能自己调整这张表的配置内存大小吗

sql_audit是OB记录SQL执行信息的表,严格意义来说确实不是专门用于做审计用的,审计日志是有信息要求,只是一般我们是用这张表的信息作为基础审计信息采集。

需要自己写代码实现,还是比较简单的,信息整理好,AI快速生成一个

参数是有,默认3%内存比率

obclient [oceanbase]> show variables like 'ob_sql_audit_percentage';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| ob_sql_audit_percentage | 3     |
+-------------------------+-------+
1 row in set (0.041 sec)
1 个赞

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003976930
可以看看 审计的功能 是企业版支持

老师你好,我昨天看到您这个链接了,但是我在社区版,下面两个查询都能查询出数据,我应该怎么理解社区版的审计功能呢,但是这个查询结果我能明确验证,没有记录所有的审计日志

#查询1
SELECT distinct t.db_name as ‘schema_name’
FROM oceanbase.gv$ob_sql_audit t
where t.query_sql regexp ‘insert’
and t.db_name in (‘qxk’)
LIMIT 1000;

#查询2
select FROM_UNIXTIME(t.REQUEST_TIME / 1000000),t.* from oceanbase.__all_virtual_sql_audit t order by REQUEST_TIME desc limit 1000;

老师,麻烦看一下我上面的问题哈~

老师你好,我昨天看到您这个链接了,但是我在社区版,下面两个查询都能查询出数据,我应该怎么理解社区版的审计功能呢,但是这个查询结果我能明确验证,没有记录所有的审计日志

#查询1
SELECT distinct t.db_name as ‘schema_name’
FROM oceanbase.gv$ob_sql_audit t
where t.query_sql regexp ‘insert’
and t.db_name in (‘qxk’)
LIMIT 1000;

#查询2
select FROM_UNIXTIME(t.REQUEST_TIME / 1000000),t.* from oceanbase.__all_virtual_sql_audit t order by REQUEST_TIME desc limit 1000;

zhenxing 已经解释过了 你看看这个语句的意思

好的,多谢哦~

多谢老师!哦,已采纳