简答题 10.  什么是审计(Audit)?
【正确答案】审计(Audit)用于监视用户所执行的数据库操作,审计信息可存储于数据字典表,称为审计记录。审计记录存储在SYSTEM表空间中的SYS.AUD$表中,可通过视图DBA_AUDIT_TRAIL查看。审计记录也可以存储在操作系统文件中(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)。
   审计的内容主要包括对数据库连接、SQL语句执行以及数据库对象访问等操作的跟踪记录。Oracle系统对任何用户所做的登录、操作数据库对象进行自动记录,以便使DBA在事后可以进行监督和检查。Oracle 11g默认启用审计,AUDIT_TRAIL参数的默认值为DB,这意味着审计数据将记录在数据库中的AUD$审计字典基表上。
   
   初始化参数AUDIT_TRAIL用于控制数据库审计,取值说明如下:
   1)NONE:禁用数据库审计。
   2)OS:启用数据库审计,并将数据库审计记录写入操作系统文件中。
   3)DB:启用数据库审计,并将数据库所有审计记录写入数据库的SYS.AUD$表。
   4)DB, EXTENDED:启用数据库审计,并将数据库所有审计记录写入数据库的SYS.AUD$表。另外,填充SYS.AUD$表的SQLBND列和SQLTEXT列。
   5)XML:启用数据库审计,并将所有记录写到XML格式的操作系统文件中。
   6) XML,EXTENDED:启用数据库审计,填充审计记录的所有列,包括SQLTEXT和SQLBIND的值。
   有关数据库审计的数据字典视图见下表。
   
有关数据库审计的数据字典视图
   

   在日常的数据库维护中,经常出现SYSTEM表空间被撑满,在绝大多数情况下是因为数据库登录审计的功能被启动了,此时一般建议把SYS.AUD$相关对象迁移到其他表空间,从而避免SYSTEM资源被用完的风险。
   在Oracle 11g之前迁移方法如下:
   
   从Oracle 11g开始可以使用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION进行迁移:
   
   如下示例为授予审计的一些权限:
   
   在Oracle 11g之前通过手工清理的方式或自定义作业来定期清理SYS.AUD$表,如下:
   
   需要注意的是,如果AUD$表过大,那么直接TRUNCATE AUD$表,系统要立即释放大量的EXTENTS,会严重影响系统性能。可以通过如下2个步骤逐步释放EXTENTS:
   1)清空数据并且保留原来的EXTENTS:
   
   在这里,REUSE STORAGE是TRUNCATE的一个参数,表示保持原来的存储不变。一般情况下,SQL命令“TRUNCATE TABLE TABLE_NAME;”其实就是“TRUNCATE TABLE TABLE_NAME DROP STORAGE;”。DROP STORAGE是TRUNCATE TABLE的默认参数。
   2)逐步回缩EXTENTS:
   
【答案解析】