我可以在 table 被截断时插入 table 吗?
Can I INSERT into table while table is being TRUNCATEd?
我有一个 SYSTEM table AUD$,其中写入了每个用户的操作(AUDIT select、插入、更新等)。这个table有1亿条记录。我决定截断 table(我猜这将花费几分钟),因为我们不再需要这些数据。
但是每次用户登录到数据库时,都会在 table AUD$ 中创建一条记录。
所以我的问题是:INSERT(如果用户登录到数据库)在 TRUNCATE table 期间是否有效?
Oracle 有一个名为 DBMS_AUDIT_MGMT 的软件包,它可以(并且应该)用于管理您的审计 table,这是减少 AUD$ 大小的正确方法。如果您要写出这些文件,它也可以用于管理 OS 级别的审计。下面是将 AUD$ table 移动到它自己的 table 空间并设置审计管理的示例。
创建专用审计table空间
CREATE TABLESPACE AUDAUX DATAFILE '/u01/oracle/oradata/<DB_NAME>/audaux01.dbf'
SIZE 25M AUTOEXTEND ON NEXT 10m MAXSIZE UNLIMITED;
将 sys.aud$ table 移动到新的 table 空间
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;
/
我有一个 SYSTEM table AUD$,其中写入了每个用户的操作(AUDIT select、插入、更新等)。这个table有1亿条记录。我决定截断 table(我猜这将花费几分钟),因为我们不再需要这些数据。
但是每次用户登录到数据库时,都会在 table AUD$ 中创建一条记录。
所以我的问题是:INSERT(如果用户登录到数据库)在 TRUNCATE table 期间是否有效?
Oracle 有一个名为 DBMS_AUDIT_MGMT 的软件包,它可以(并且应该)用于管理您的审计 table,这是减少 AUD$ 大小的正确方法。如果您要写出这些文件,它也可以用于管理 OS 级别的审计。下面是将 AUD$ table 移动到它自己的 table 空间并设置审计管理的示例。
创建专用审计table空间
CREATE TABLESPACE AUDAUX DATAFILE '/u01/oracle/oradata/<DB_NAME>/audaux01.dbf'
SIZE 25M AUTOEXTEND ON NEXT 10m MAXSIZE UNLIMITED;
将 sys.aud$ table 移动到新的 table 空间
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;
/