[20241230]21c HIST_HEAD$ UNIFIED AUDIT.txt

[20241230]21c HIST_HEAD$ UNIFIED AUDIT.txt

–//看标题有点奇怪,生产系统19c遇到的问题,在我的测试环境21c也存在,就是访问ALL_TAB_COLS,ALL_TAB_COLUMNS视图时会访问

–//HIST_HEAD$表,会触发审计记录相关信息,有点奇怪,做一个记录并分析。

1.环境:

SYS@book01p> @ ver2

==============================

PORT_STRING                   : x86_64/Linux 2.4.xx

VERSION                       : 21.0.0.0.0

BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production

BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production

Version 21.3.0.0.0

BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production

CON_ID                        : 0

PL/SQL procedure successfully completed.

2.问题提出:

–//首先问题的发现有点偶然,我检查生产系统发现sys.aud$存在大量记录,文件已经达到342M。按照道理12c开始使用UNIFIED AUDIT,

–//sys.aud$就算有记录,应该也很少信息。

SYS@book01p> SELECT * FROM V$OPTION WHERE PARAMETER = ‘Unified Auditing’;

PARAMETER        VALUE CON_ID

—————- —– ——

Unified Auditing FALSE      0

–//难道没有启用吗?但是确实有记录在AUDSYS.AUD$UNIFIED在表中.先不管这个问题.问题先集中在sys.aud$.

–//我看了生产环境与19c的情况一样。

SYS@book01p>  select obj$name,count(*) from sys.aud$ group by obj$name ;

OBJ$NAME                         COUNT(*)

—————————— ———-

SCOTT                                  12

HIST_HEAD$                             79

–//注:我的测试环境使用较少,出现HIST_HEAD$的次数也很少(生产系统大部分都是该信息)。

–//我看了生产系统的AUDSYS.AUD$UNIFIED,我发现出现问题集中在1台机器,应该是开发使用的,program执行的是DBeaver的相关程序。

–//网上检索发现DBeaver,软件简介如下:

–//DBeaver 是一个通用的数据库管理工具和 SQL 客户端,支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB,

–//Derby, 以及其他兼容 JDBC 的数据库。

–//DBeaver 提供一个图形界面用来查看数据库结构、执行 SQL 查询和脚本,浏览和导出数据,处理 BLOB/CLOB 数据,修改数据库结构

–//等等。

–//使用它大量的涉及ALL_TAB_COLS视图的访问,导致审计记录许多信息。

SYS@book01p> select sql_text ,sql_binds c30 from  AUDSYS.AUD$UNIFIED  where obj_name=’HIST_HEAD$’ and rownum=1;

SQL_TEXT                                                     C30

———————————————————— ——————————

SELECT COLUMN_NAME, DATA_TYPE, NUM_DISTINCT, DENSITY, NUM_NU  #1(4):DEPT #2(5):SCOTT

LLS, NUM_BUCKETS, LAST_ANALYZED, AVG_COL_LEN, RAWTOHEX(LOW_V

ALUE) LOW, RAWTOHEX(HIGH_VALUE) FROM ALL_TAB_COLUMNS WHERE T

ABLE_NAME = :B2 AND OWNER = :B1

–//基本都是类似的语句。也就是如果开发访问ALL_TAB_COLUMNS,ALL_TAB_COLS视图涉及HIST_HEAD$表就会触发审计记录相关信息。

–//在我的测试环境也是类似的情况,例子:

–//在cdb层面查询:

SYS@book> select * from CDB_OBJ_AUDIT_OPTS where object_name=’HIST_HEAD$’;

no rows selected

–//并没有审计HIST_HEAD$表,为什么出现这样的情况。

SYS@book01p> select * from hist_head$ where rownum=1;

select * from hist_head$ where rownum=1

              *

ERROR at line 1:

ORA-01031: insufficient privileges

–//以前遇到类似问题。

SYS@book01p> select obj# from hist_head$ where rownum=1;

      OBJ#

———-

         4

SYS@book01p> select sessionid,sysdate,event_timestamp,sql_text from  AUDSYS.AUD$UNIFIED  where event_timestamp>=trunc(sysdate);

     SESSIONID SYSDATE             EVENT_TIMESTAMP               SQL_TEXT                               

————– ——————- —————————– —————————————

    4039442264 2024-12-30 17:59:14 2024-12-30 09:41:47.801199    select * from hist_head$ where rownum=1

    4039442264 2024-12-30 17:59:14 2024-12-30 09:41:58.583453    select * from hist_head$ where rownum=1

–//EVENT_TIMESTAMP记录的UTC时钟。

–//视乎很奇怪该session仅仅记录2次,改写成select count(*) from hist_head$;并没有记录,到这里突然反应过来,执行报错审计才

–//有记录。

–//参考[20240826]奇怪ORA-01031 insufficient privileges报错.txt,当时的测试如下:

select

OBJ#

,COL#

,BUCKET_CNT

,ROW_CNT

,CACHE_CNT

,NULL_CNT

,TIMESTAMP#

,SAMPLE_SIZE

–,MINIMUM

–,MAXIMUM

,DISTCNT

–,LOWVAL

–,HIVAL

,DENSITY

,INTCOL#

,SPARE1

,SPARE2

,AVGCLN

,SPARE3

,SPARE4

,MINIMUM_ENC

,MAXIMUM_ENC

from hist_head$ ;

–//当时的测试确定只要不包括这4个字段,查询不存在问题,涉及MINIMUM,MAXIMUM,LOWVAL,HIVAL就会报错。

SELECT COLUMN_NAME

      ,DATA_TYPE

      ,NUM_DISTINCT

      ,DENSITY

      ,NUM_NULLS

      ,NUM_BUCKETS

      ,LAST_ANALYZED

      ,AVG_COL_LEN

      ,RAWTOHEX (LOW_VALUE) LOW

      ,RAWTOHEX (HIGH_VALUE)

  FROM ALL_TAB_COLUMNS

 WHERE TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’;

–//执行成功,输出略。

SELECT COLUMN_NAME,LOW_VALUE from ALL_TAB_COLUMNS  WHERE  TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’;

SYS@book01p> SELECT COLUMN_NAME,LOW_VALUE c30 from ALL_TAB_COLUMNS  WHERE  TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’;

COLUMN_NAME                    C30

—————————— ——————————

DEPTNO                         C10B

DNAME                          4143434F554E54494E47

LOC                            424F53544F4E

–//执行是成功的,但是实际上在访问hist_head$有问题,显示不出来!!

SELECT COLUMN_NAME from ALL_TAB_COLUMNS  WHERE  TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’

~~~~~~~~~~

SYS@book01p> select sessionid,sysdate,event_timestamp,sql_text from  AUDSYS.AUD$UNIFIED  where event_timestamp>=trunc(sysdate)-8/24;

     SESSIONID SYSDATE             EVENT_TIMESTAMP               SQL_TEXT

————– ——————- —————————– ————————————————————

    4039442264 2024-12-30 18:33:35 2024-12-30 09:41:47.801199    select * from hist_head$ where rownum=1

    4039442264 2024-12-30 18:33:35 2024-12-30 09:41:58.583453    select * from hist_head$ where rownum=1

    1494506491 2024-12-30 18:33:35 2024-12-30 10:12:37.135743    select * from hist_head$ where rownum=1

    1622741797 2024-12-30 18:33:35 2024-12-30 10:23:26.431348    SELECT COLUMN_NAME

                                                                       ,DATA_TYPE

                                                                       ,NUM_DISTINCT

                                                                       ,DENSITY

                                                                       ,NUM_NULLS

                                                                       ,NUM_BUCKETS

                                                                       ,LAST_ANALYZED

                                                                       ,AVG_COL_LEN

                                                                       ,RAWTOHEX (LOW_VALUE) LOW

                                                                       ,RAWTOHEX (HIGH_VALUE)

                                                                   FROM ALL_TAB_COLUMNS

                                                                  WHERE TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’

    4143611800 2024-12-30 18:33:35 2024-12-30 10:33:18.828871    SELECT COLUMN_NAME,LOW_VALUE from ALL_TAB_COLUMNS  WHERE TAB

                                                                 LE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’

    4143611800 2024-12-30 18:33:35 2024-12-30 10:33:31.099445    SELECT COLUMN_NAME,LOW_VALUE c30 from ALL_TAB_COLUMNS  WHERE

                                                                  TABLE_NAME = ‘DEPT’ AND OWNER = ‘SCOTT’

–//下划线的语句没有记录,没有访问涉及的相关4个字段。

–//hist_head$只要涉及MINIMUM,MAXIMUM,LOWVAL,HIVAL4个字段,审计就会有记录。

–//相关视图最终访问的是视图all_tab_cols_v$,该视图存在如下内容:



,CASE WHEN SYS_OP_DV_CHECK ( o.name ,o.owner#) = 1 THEN h.lowval ELSE NULL END

,CASE WHEN SYS_OP_DV_CHECK ( o.name ,o.owner#) = 1 THEN h.hival ELSE NULL END

–//继续昨天的测试:

SYS@book01p> select LOW_VALUE,HIGH_VALUE from all_tab_cols_v$ where rownum<=1;

LOW_VALUE  HIGH_VALUE

———- ———-

C105       C3084527

–//执行并不报错,但是审计有记录:

SYS@book01p> select sessionid,sysdate,event_timestamp,sql_text from  AUDSYS.AUD$UNIFIED  where event_timestamp>=trunc(sysdate)-8/24;

     SESSIONID SYSDATE             EVENT_TIMESTAMP               SQL_TEXT

————– ——————- —————————– ————————————————————

     296253975 2024-12-31 08:48:54 2024-12-31 00:47:56.708845    select LOW_VALUE,HIGH_VALUE from all_tab_cols_v$ where rownum<=1

SYS@book01p> select owner,table_name,COLUMN_NAME,DENSITY from all_tab_cols_v$ where rownum<=1;

OWNER                          TABLE_NAME                     COLUMN_NAME                       DENSITY

—————————— —————————— —————————— ———-

SYS                            TAB$                           TAB#                           .058823529

SYS@book01p> select sessionid,sysdate,event_timestamp,sql_text from  AUDSYS.AUD$UNIFIED  where event_timestamp>=trunc(sysdate)-8/24;

     SESSIONID SYSDATE             EVENT_TIMESTAMP               SQL_TEXT

————– ——————- —————————– ————————————————————

     296253975 2024-12-31 08:48:54 2024-12-31 00:47:56.708845    select LOW_VALUE,HIGH_VALUE from all_tab_cols_v$ where rownum<=1

–//只要不涉及hist_head$基表的LOWVAL,HIVAL字段的相关视图,查询审计没有记录。

SYS@book01p> select user# from user$ where name=’SYS’;

     USER#

———-

         0

–//执行如下:

select

h.obj#

,CASE WHEN SYS_OP_DV_CHECK ( ‘TAB$’ ,0) = 1 THEN h.obj# else null end  n10

–,CASE WHEN SYS_OP_DV_CHECK ( ‘TAB$’ ,0) = 1 THEN h.lowval ELSE NULL END low

–,CASE WHEN SYS_OP_DV_CHECK ( ‘TAB$’ ,0) = 1 THEN h.hival ELSE NULL END high

from hist_head$ h where rownum=1;

–//只要打开注解就报ORA-01031: insufficient privileges错,结果不再贴出。

3.小结:

–//总之找到问题的出处,但是不知道如何产生,为什么出现这样的现象。实际上只要19c,21c的版本,查询审计都应该发现我遇到的情况。

–//也就是审计会记录OBJ$NAME=hist_head$的相关信息,除非不访问相关hist_head$的相关视图.

来源链接:https://www.cnblogs.com/lfree/p/18644769

© 版权声明
THE END
支持一下吧
点赞13 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容