表格被截断时,我可以插入表格吗?

时间:2019-08-18 14:11:54

标签: sql oracle truncate

我有一个SYSTEM表AUD $,每个用户的操作都写入到该表中(AUDIT选择,插入,更新...)。该表有1亿条记录。我决定截断该表(我猜这将花费几分钟),因为我们不再需要此数据。

但是每次用户登录数据库时,都会在此表AUD $中创建一条记录。

所以我的问题是:在TRUNCATE表中,INSERT(如果用户登录到数据库)是否起作用?

1 个答案:

答案 0 :(得分:2)

Oracle有一个名为DBMS_AUDIT_MGMT的程序包,该程序包可以(并且应该)用于管理审计表,这是减小AUD $大小的正确方法。如果您要写出这些文件,它也可以用于管理操作系统级别的审核。这是将AUD $表移至其自己的表空间并设置审核管理的示例。

创建专用的审核表空间

CREATE TABLESPACE AUDAUX DATAFILE '/u01/oracle/oradata/<DB_NAME>/audaux01.dbf'
SIZE 25M AUTOEXTEND ON NEXT 10m MAXSIZE UNLIMITED;

将sys.aud $表移动到新表空间

SET SERVEROUTPUT ON
BEGIN
 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
  AUDIT_TRAIL_TYPE            => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  AUDIT_TRAIL_LOCATION_VALUE  => 'AUDAUX');
END;
/

设置所需的参数,并在需要时反弹数据库

audit_trail='DB,EXTENDED'
audit_sys_operations=true

初始化清理操作

SET SERVEROUTPUT ON
BEGIN
 DBMS_AUDIT_MGMT.INIT_CLEANUP(
  AUDIT_TRAIL_TYPE            => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  DEFAULT_CLEANUP_INTERVAL    => 12 );
END;
/

验证清理已初始化

SET SERVEROUTPUT ON
BEGIN
 IF 
   DBMS_AUDIT_MGMT.IS_CLEANUP_INITIALIZED(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD)
 THEN
   DBMS_OUTPUT.PUT_LINE('AUD$ is initialized for clean-up');
 ELSE
   DBMS_OUTPUT.PUT_LINE('AUD$ is not initialized for clean-up.');
 END IF;
END;
/

创建清除作业

SET SERVEROUTPUT ON
BEGIN
  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (
   AUDIT_TRAIL_TYPE            => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
   AUDIT_TRAIL_PURGE_INTERVAL  => 12,
   AUDIT_TRAIL_PURGE_NAME      => 'Standard_Audit_Trail_Purge',
   USE_LAST_ARCH_TIMESTAMP     => FALSE );
END;
/

清洗作业示例

SET SERVEROUTPUT ON
BEGIN
  DBMS_AUDIT_MGMT.DROP_PURGE_JOB (
   AUDIT_TRAIL_PURGE_NAME      => 'DB_AUDIT_TRAIL_PURGE');
END;
/