para fora do tablespace SYSTEM (de sistema, onde ficam outras tabelas internas do Oracle) e, mensalmente, copia dados de auditoria para uma outra tabela para consultas historicas deixando sempre a tabela de auditoria com poucos dados. No exemplo, uma tabela e criada no mesmo banco de dados, porem voce pode adapta-lo para armazenar a tabela em outro banco de dados.Abaixo o script com a explicacao sobre cada parte faz. Executar com usuario "SYS":-- 1. Configurando auditoria (precisa de restart). Gerencie arquivos de auditoria gerados para o usuario SYS em audit_file_dest.AUDIT ALL ON SYS.AUD$ BY ACCESS;AUDIT ALL ON SYS.FGA_LOG$ BY ACCESS;ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE SID='*';ALTER SYSTEM SET AUDIT_TRAIL='DB_EXTENDED' SCOPE=SPFILE SID='*';-- 2. Checando espaco necessario para criar tablespace TS_AUDIT_TRAIL de auditoria e conta AUDIT_TRAIL (precisa usar OMF, do contrario especifique o caminho manualmente). A conta AUDIT_TRAIL foi bloqueada propositalmente, pois nao precisaremos ativa-la.DECLARE V_BYTES NUMBER;BEGINSELECT SUM(BYTES)*2 INTO V_BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'AUD$' OR SEGMENT_NAME = 'FGA_LOG$' OR SEGMENT_NAME IN (SELECT SEGMENT_NAME FROM DBA_LOBS WHERE TABLE_NAME = 'AUD$' OR TABLE_NAME = 'FGA_LOG$');DBMS_OUTPUT.PUT_LINE(CHR(10));DBMS_OUTPUT.PUT_LINE('* Um tablespace TS_AUDIT_TRAIL com '||ROUND(V_BYTES/1024/1024)||' MBs vai ser criado. *');DBMS_OUTPUT.PUT_LINE(CHR(10));END;/DECLARE V_BYTES NUMBER;BEGINSELECT SUM(BYTES)*2 INTO V_BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'AUD$' OR SEGMENT_NAME = 'FGA_LOG$' OR SEGMENT_NAME IN (SELECT SEGMENT_NAME FROM DBA_LOBS WHERE TABLE_NAME = 'AUD$' OR TABLE_NAME = 'FGA_LOG$');EXECUTE IMMEDIATE 'CREATE TABLESPACE TS_AUDIT_TRAIL DATAFILE SIZE '||V_BYTES||' AUTOEXTEND ON NEXT 100M SEGMENT SPACE MANAGEMENT AUTO';DBMS_OUTPUT.PUT_LINE(CHR(10));DBMS_OUTPUT.PUT_LINE('* Tablespace com '||ROUND(V_BYTES/1024/1024)||' MBs criado com sucesso.');END;/CREATE USER AUDIT_TRAIL IDENTIFIED BY aud$user$oracleDEFAULT TABLESPACE TS_AUDIT_TRAILQUOTA UNLIMITED ON TS_AUDIT_TRAILACCOUNT LOCK;-- 3. Criando tabelas de historico para arquivamento de dados de auditoria (crie indices posteriormente se desejar). A coluna "PLHOL" esta sendo alterada de LONG para CLOB para permitir a copia. Nao havera impacto durante a auditoria, pois esta coluna nao e utilizada e provavelmente sera removida no futuro.ALTER TABLE SYS.FGA_LOG$ MODIFY(PLHOL CLOB);CREATE TABLE AUDIT_TRAIL.AUDIT_ARCHIVE COMPRESS BASIC TABLESPACE TS_AUDIT_TRAIL AS SELECT * FROM SYS.AUD$;CREATE TABLE AUDIT_TRAIL.AUDIT_ARCHIVE_FGA COMPRESS BASIC TABLESPACE TS_AUDIT_TRAIL AS SELECT * FROM SYS.FGA_LOG$;DELETE FROM SYS.AUD$ WHERE NTIMESTAMP#<=(SELECT MAX(NTIMESTAMP#) FROM AUDIT_TRAIL.AUDIT_ARCHIVE);DELETE FROM SYS.FGA_LOG$ WHERE NTIMESTAMP#<=(SELECT MAX(NTIMESTAMP#) FROM AUDIT_TRAIL.AUDIT_ARCHIVE_FGA);COMMIT;-- 4. Movendo auditoria para novo tablespace TS_AUDIT_TRAIL.BEGIN SYS.DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD, AUDIT_TRAIL_LOCATION_VALUE => 'TS_AUDIT_TRAIL');END;/-- 5. Realizando shrink da tabela AUD$ e FGA_LOG$ com coleta de estatisticas.ALTER TABLE SYS.AUD$ ENABLE ROW MOVEMENT;ALTER TABLE SYS.AUD$ SHRINK SPACE CASCADE;ALTER TABLE SYS.FGA_LOG$ ENABLE ROW MOVEMENT;ALTER TABLE SYS.FGA_LOG$ SHRINK SPACE CASCADE;EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS','AUD$');EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS','FGA_LOG$');---------------------------------------------------------------------------------------Mantendo o audit trail. Configurar agendamento.--------------------------------------------------------------------------------------- 6. Configurando Scheduler Job para executar manutencao de auditoria dia 01 de cada mes. Voce pode alterar a frequencia conforme a sua necessidade.BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB ( job_name => 'SYS.AUDIT_TRAIL_MAINTENANCE' ,start_date => NULL ,repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=00;BYMINUTE=00;BYSECOND=00' ,end_date => NULL ,job_class => 'DEFAULT_JOB_CLASS' ,job_type => 'PLSQL_BLOCK' ,job_action => 'BEGIN INSERT INTO AUDIT_TRAIL.AUDIT_ARCHIVE SELECT * FROM SYS.AUD$; INSERT INTO AUDIT_TRAIL.AUDIT_ARCHIVE_FGA SELECT * FROM SYS.FGA_LOG$; DELETE FROM SYS.AUD$ WHERE NTIMESTAMP#<=(SELECT MAX(NTIMESTAMP#) FROM AUDIT_TRAIL.AUDIT_ARCHIVE); DELETE FROM SYS.FGA_LOG$ WHERE NTIMESTAMP#<=(SELECT MAX(NTIMESTAMP#) FROM AUDIT_TRAIL.AUDIT_ARCHIVE_FGA); COMMIT; EXECUTE IMMEDIATE ''ALTER TABLE AUDIT_TRAIL.AUDIT_ARCHIVE MOVE COMPRESS BASIC''; EXECUTE IMMEDIATE ''ALTER TABLE AUDIT_TRAIL.AUDIT_ARCHIVE_FGA MOVE COMPRESS BASIC''; DBMS_STATS.GATHER_TABLE_STATS(''SYS'',''AUD$''); DBMS_STATS.GATHER_TABLE_STATS(''SYS'',''FGA_LOG$'');END;' ,comments => NULL ); SYS.DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'SYS.AUDIT_TRAIL_MAINTENANCE' ,attribute => 'RESTARTABLE' ,value => FALSE); SYS.DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'SYS.AUDIT_TRAIL_MAINTENANCE' ,attribute => 'LOGGING_LEVEL' ,value => SYS.DBMS_SCHEDULER.LOGGING_RUNS); SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL ( name => 'SYS.AUDIT_TRAIL_MAINTENANCE'