误删除AUD$所在的表空间,无法切换用户

问题故障:数据库Open,无法切换普通用户:
---递归SQL无法执行
 
SQL> conn hr/hr
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 2
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 2
 
[oracle@hukou ~]$ tail -50f /picclife/app/oracle/diag/rdbms/hukou/hukou/trace/alert_hukou.log
 
ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-00554: error encountered while parsing access parameters
KUP-01005: syntax error: found "identifier": expecting one of: "field"
KUP-01008: the bad identifier was: dield
KUP-01007: at line 1 column 95
 
10046--无法生成详细文档
追踪操作:本次需要追踪的是conn hr/hr,数据内部执行了什么操作,但只要执行操作,就断开了连接,无法结束追踪,因此10046工具无法使用此场景:
 
SQL> alter session set events '10046 trace name context forever';
Session altered.
SQL> alter session set events '10046 trace name context forever,level 8';
 
 
如下:排除问题:因素
--查询用户密码,角色:排除操作问题
SQL> alter user yang identified by yang;
SQL> select grantee,granted_role from dba_role_privs where grantee='YANG';
GRANTEE                        GRANTED_ROLE
------------------------------ ------------------------------
YANG                           RESOURCE
YANG                           CONNECT
SQL> conn yang/yang;
ERROR:
 
 
###进入误区,误以为是存储空间问题:
--查询表空间使用的对象> 20m的对象信息:
select segment_name,sum(bytes)/1024/1024 from dba_segments having(sum(bytes)/1024/1024)>20 group by segment_name
SEGMENT_NA SUM(BYTES)/1024/1024
---------- --------------------
IDL_UB1$             45.1328125
SOURCE$               42.984375
 
 
 
##开启SQL追踪
SQL> alter system set sql_trace=true;
SQL> conn hr/hr
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-02002: error while writing to audit trail
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
 
--查询用户的dump文件:
--查询参数路径:
SQL> show parameter user_dump   
--根据时间排序,按修改时间排列;
more分页查看:Q结束分页 =>  选择最靠前的  ora_xxx.trc文件查询
[oracle@hostuzi trace]$ ls -lt|more
-rw-r----- 1 oracle oinstall 304287 12-24 18:48 alert_PROD.log
-rw-r----- 1 oracle oinstall     70 12-24 18:43 PROD_lgwr_23734.trm
-rw-r----- 1 oracle oinstall   2627 12-24 18:43 PROD_ora_23773.trc
 
--------用户的DUMP文件---
PARSE ERROR #140124260648808:len=597 dep=1 uid=0 oct=2 lid=0 t
im=1511612960366612 err=942
insert into sys.aud$( sessionid,entryid,statement,ntimestamp#,
userid,userhost,terminal,action#,returncode, obj$creator,obj$
name,auth$privileges,auth$grantee, new$owner,new$name,ses$acti
ons,ses$tid,logoff$pread, logoff$lwrite,logoff$dead,comment$te
xt,spare1,spare2,  priv$used,clientid,sessioncpu,proxy$sid,use
r$guid, instance#,process#,xid,scn,auditid,  sqlbind,sqltext,o
bj$edition,dbid)  values(:1,:2,:3,SYS_EXTRACT_UTC(SYSTIMESTAMP
),     :4,:5,:6,:7,:8,     :9,:10,:11,:12,     :13,:14,:15,:16
,:17,     :18,:19,:20,:21,:22,     :23,:24,:25,:26,:27,     :2
8,:29,:30,:31,:32,     :33,:34,:35,:36)
*** 2017-11-25 20:29:21.366
CLOSE #140124260648808:c=0,e=5,dep=1,type=0,tim=15116129613669
40
 
###AUD$的表:
审计参数开启后:AUD$基表存储:
 
查询dba_audit_trail  视图查询:
SQL> show parameter audit
audit_trail                          string      DB_EXTENDED 【数据库开启审计模式,审计信息会记录在aud$基表中】
 
SQL> select owner,table_name,tablespace_name,max_extents from dba_tables where table_name='AUD$';
no rows selected
 
SQL>  select owner,table_name,tablespace_name,max_extents from dba_tables where table_name='FAG_LOG$';
no rows selected
-----------------对象不存在------------
 
 
####此时问题可以判定:缘由在于:之前将AUD$,FGA_LOG$迁移的另一个表空间被删除:
 
问题原因找到:两种解决方案:
一、等待找到建表语句,重建表
二、关闭审计参数:先对外提供服务运行:需要重启库操作:
alter system set audit_trail=none scope=spfile;
 
 
一、
#另一个库--查询与基表AUD$管理的索引
SQL> select index_name,table_name from dba_indexes where table_name='AUD$';
INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
SYS_IL0000000407C00040$$       AUD$
SYS_IL0000000407C00041$$       AUD$
 
SQL> select index_name,table_name from dba_indexes where table_name='FGA_LOG$';
INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
SYS_IL0000000417C00013$$       FGA_LOG$
SYS_IL0000000417C00028$$       FGA_LOG$
 
#查询两个表的触发器
SQL> select TRIGGER_NAME,TABLE_NAME from user_triggers where table_name='AUD$';
no rows selected
SQL> select TRIGGER_NAME,TABLE_NAME from user_triggers where table_name='FGA_LOG$';
no rows selected
 
 
####通过GETDDL调出建表语句:
SQL> set line 200 pages 50000 wrap on long 999999 serveroutput on
SQL> select dbms_metadata.get_ddl('TABLE','AUD$','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','AUD$','SYS')
--------------------------------------------------------------------------------
  CREATE TABLE "SYS"."AUD$"
   (    "SESSIONID" NUMBER NOT NULL ENABLE,
        "ENTRYID" NUMBER NOT NULL ENABLE,
        "STATEMENT" NUMBER NOT NULL ENABLE,
        "TIMESTAMP#" DATE,
        "USERID" VARCHAR2(30),
        "USERHOST" VARCHAR2(128),
        "TERMINAL" VARCHAR2(255),
        "ACTION#" NUMBER NOT NULL ENABLE,
        "RETURNCODE" NUMBER NOT NULL ENABLE,
        "OBJ$CREATOR" VARCHAR2(30),
        "OBJ$NAME" VARCHAR2(128),
        "AUTH$PRIVILEGES" VARCHAR2(16),
        "AUTH$GRANTEE" VARCHAR2(30),
        "NEW$OWNER" VARCHAR2(30),
        "NEW$NAME" VARCHAR2(128),
        "SES$ACTIONS" VARCHAR2(19),
        "SES$TID" NUMBER,
        "LOGOFF$LREAD" NUMBER,
        "LOGOFF$PREAD" NUMBER,
        "LOGOFF$LWRITE" NUMBER,
        "LOGOFF$DEAD" NUMBER,
        "LOGOFF$TIME" DATE,
        "COMMENT$TEXT" VARCHAR2(4000),
        "CLIENTID" VARCHAR2(64),
        "SPARE1" VARCHAR2(255),
        "SPARE2" NUMBER,
        "OBJ$LABEL" RAW(255),
        "SES$LABEL" RAW(255),
        "PRIV$USED" NUMBER,
        "SESSIONCPU" NUMBER,
        "NTIMESTAMP#" TIMESTAMP (6),
        "PROXY$SID" NUMBER,
        "USER$GUID" VARCHAR2(32),
        "INSTANCE#" NUMBER,
        "PROCESS#" VARCHAR2(16),
        "XID" RAW(8),
        "AUDITID" VARCHAR2(64),
        "SCN" NUMBER,
        "DBID" NUMBER,
        "SQLBIND" CLOB,
        "SQLTEXT" CLOB,
        "OBJ$EDITION" VARCHAR2(30)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
  STORAGE(INITIAL 16384 NEXT 40960 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"
LOB ("SQLBIND") STORE AS BASICFILE (
  TABLESPACE "SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
  NOCACHE LOGGING
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("SQLTEXT") STORE AS BASICFILE (
  TABLESPACE "SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
  NOCACHE LOGGING
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT));
 
SQL> select dbms_metadata.get_ddl('TABLE','FGA_LOG$','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','FGA_LOG$','SYS')
--------------------------------------------------------------------------------
  CREATE TABLE "SYS"."FGA_LOG$"
   (    "SESSIONID" NUMBER NOT NULL ENABLE,
        "TIMESTAMP#" DATE,
        "DBUID" VARCHAR2(30),
        "OSUID" VARCHAR2(255),
        "OSHST" VARCHAR2(128),
        "CLIENTID" VARCHAR2(64),
        "EXTID" VARCHAR2(4000),
        "OBJ$SCHEMA" VARCHAR2(30),
        "OBJ$NAME" VARCHAR2(128),
        "POLICYNAME" VARCHAR2(30),
        "SCN" NUMBER,
        "SQLTEXT" VARCHAR2(4000),
        "LSQLTEXT" CLOB,
        "SQLBIND" VARCHAR2(4000),
        "COMMENT$TEXT" VARCHAR2(4000),
        "PLHOL" LONG,
        "STMT_TYPE" NUMBER,
        "NTIMESTAMP#" TIMESTAMP (6),
        "PROXY$SID" NUMBER,
        "USER$GUID" VARCHAR2(32),
        "INSTANCE#" NUMBER,
        "PROCESS#" VARCHAR2(16),
        "XID" RAW(8),
        "AUDITID" VARCHAR2(64),
        "STATEMENT" NUMBER,
        "ENTRYID" NUMBER,
        "DBID" NUMBER,
        "LSQLBIND" CLOB,
        "OBJ$EDITION" VARCHAR2(30)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"
LOB ("LSQLTEXT") STORE AS BASICFILE (
  TABLESPACE "SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
  NOCACHE LOGGING
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("LSQLBIND") STORE AS BASICFILE (
  TABLESPACE "SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
  NOCACHE LOGGING
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 505
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
 
 
 
 
SQL> SELECT DBMS_METADATA.GET_DDL('INDEX','SYS_IL0000000407C00040$$','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','SYS_IL0000000407C00040$$','SYS')
--------------------------------------------------------------------------------
  CREATE UNIQUE INDEX "SYS"."SYS_IL0000000407C00040$$" ON "SYS"."AUD$" (
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"
  PARALLEL (DEGREE 0 INSTANCES 0)
 
 
SQL> SELECT DBMS_METADATA.GET_DDL('INDEX','SYS_IL0000000407C00041$$','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','SYS_IL0000000407C00041$$','SYS')
--------------------------------------------------------------------------------
  CREATE UNIQUE INDEX "SYS"."SYS_IL0000000407C00041$$" ON "SYS"."AUD$" (
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"
  PARALLEL (DEGREE 0 INSTANCES 0)
 
 
!解决问题:创建基表则解决问题:
 
 
疑问:切换用户生成记录? 什么记录?什么方式会记录?如何关闭:
会话一:
select count(*) from aud$
  COUNT(*)
----------
       195
会话二:
SQL> conn scott/tiger
 
会话一:再次查询
SQL> select count(*) from aud$
  COUNT(*)
----------     --通过connect / as sysdba / conn hr/hr切换会产生记录:
       196             --切换用户,会生成审计信息及在基表中
 
--通过sqlplus / as sysdba操作系统验证:基表不会存储审计文件,而是参数文件:--操作系统层面:生成审计文件记录
SQL> show parameter audit_file_dest
NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------------
audit_file_dest        /picclife/app/oracle/admin/PROD/adump
 
 
*记录的什么信息:查询基表:
 
truncate table aud$;
SQL> conn yang/yang
---记录登录信息:
 
*精细化审计信息存储的FGA_LOG$无关:
SQL> select count(*) from fga_log$;
  COUNT(*)
----------
         0
 
*如何关闭:需要重启库:
SQL> alter system set audit_trail=none scope=spfile;
SQL> startup force;
解决OK:
 

 
 
番外:##GETDDL 索引语法:
SQL> SELECT DBMS_METADATA.GET_DDL('INDEX','SYS_IL0000000417C00013$$','SYS') FROM DUAL;
 
 
--查询系统表空间总大小
SQL> select sum(bytes)/1024/1024 from dba_data_files where tablespace_name='SYSTEM';
SUM(BYTES)/1024/1024
--------------------
                 325
--查询系统表空间已使用的大小
SQL> select sum(bytes)/1024/1024 from dba_SEGMENTS  where tablespace_name='SYSTEM';
SUM(BYTES)/1024/1024
--------------------
              275.25
 
--查询系统表空间对应的数据文件名称
SELECT FILE_NAME FROM DBA_DATA_FILES where tablespace_name='SYSTEM'
FILE_NAME
---------------------------------------------
/picclife/app/hukou/data/system01.dbf
--增加数据文件大小
SQL> ALTER database datafile '/picclife/app/hukou/data/system01.dbf' resize 500m;
 
 
 
原文地址:https://www.cnblogs.com/lvcha001/p/8159357.html