This post is also available in: English
O Oracle Database 11g vêm com algumas opções de audit ligadas por default, o que pode ao longo do tempo esgotar a tablespace SYSTEM sem que o DBA perceba o porque. No entanto, esta mesma versão disponibiliza agora algumas packages DBMS que podem facilitar muito a vida do administrador que deseja migrar para outra tablespace ou alterar o período de retenção dos dados. Até a versão 10gR2, era preciso fazer essa alteração de maneira mais arcaica, que pode ser verificado no Doc ID 1019377.6 no suporte da Oracle.
Para começar, verifique se as suas opções de auditoria estão ligadas.
No meu caso, eu ativei para todas as operações do sistema e configurei para que fosse guardado também o SQL executado (DB_EXTENDED). Isso pode variar de caso a caso. Coloque os valores desejados e reinicie seu banco.
SQL> SHOW parameter audit NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_file_dest string /u02/admin/rmanbkp/adump audit_syslog_level string audit_sys_operations boolean TRUE audit_trail string DB_EXTENDED
Vamos primeiro localizar em qual tablespace estão as tabelas de auditoria.
SQL> SELECT OWNER, 2 SEGMENT_NAME, 3 TABLESPACE_NAME 4 FROM DBA_SEGMENTS 5 WHERE SEGMENT_NAME IN ('AUD$', 'FGA_LOG$'); OWNER SEGMENT_NAME TABLESPACE_NAME ------------------------------ -------------------------------------------------------------------------------- ------------------------------ SYS FGA_LOG$ SYSTEM SYS AUD$ SYSTEM
Agora vamos verificar se a infraestrutura do processo automático de expurgo do audit já foi inicializado.
SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 IF sys.DBMS_AUDIT_MGMT.is_cleanup_initialized(sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN 3 DBMS_OUTPUT.put_line('YES'); 4 ELSE 5 DBMS_OUTPUT.put_line('NO'); 6 END IF; 7 END; 8 / NO SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; PARAMETER_NAME PARAMETER_VALUE AUDIT_TRAIL -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------- DB AUDIT TABLESPACE SYSAUX STANDARD AUDIT TRAIL DB AUDIT TABLESPACE SYSAUX FGA AUDIT TRAIL AUDIT FILE MAX SIZE 10000 OS AUDIT TRAIL AUDIT FILE MAX SIZE 10000 XML AUDIT TRAIL AUDIT FILE MAX AGE 5 OS AUDIT TRAIL AUDIT FILE MAX AGE 5 XML AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 STANDARD AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 FGA AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 OS AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 XML AUDIT TRAIL 10 rows selected
Caso já tenha sido ativado, pule para a próxima etapa. Caso contrário, vamos então iniciar a infraestrutura do expurgo do audit com o intervalo de execução da limpeza (não retenção) para cada 1 dia (24 horas).
SQL> BEGIN 2 SYS.dbms_audit_mgmt.init_cleanup( 3 audit_trail_type => SYS.DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD, 4 default_cleanup_interval => 24 /* hours */); -- PARAMETRO NAO USADO NA 11GR2 (PARA USO FUTURO) 5 END; 6 / PL/SQL procedure successfully completed
Verificando novamente.
SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 IF sys.DBMS_AUDIT_MGMT.is_cleanup_initialized(sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN 3 DBMS_OUTPUT.put_line('YES'); 4 ELSE 5 DBMS_OUTPUT.put_line('NO'); 6 END IF; 7 END; 8 / YES SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; PARAMETER_NAME PARAMETER_VALUE AUDIT_TRAIL -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------- DB AUDIT TABLESPACE SYSAUX STANDARD AUDIT TRAIL DB AUDIT TABLESPACE SYSAUX FGA AUDIT TRAIL AUDIT FILE MAX SIZE 10000 OS AUDIT TRAIL AUDIT FILE MAX SIZE 10000 XML AUDIT TRAIL AUDIT FILE MAX AGE 5 OS AUDIT TRAIL AUDIT FILE MAX AGE 5 XML AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 STANDARD AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 FGA AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 OS AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 XML AUDIT TRAIL DEFAULT CLEAN UP INTERVAL 24 STANDARD AUDIT TRAIL DEFAULT CLEAN UP INTERVAL 24 FGA AUDIT TRAIL 12 rows selected
Note o aparecimento das 2 últimas linhas com o valor "DEFAULT CLEAN UP INTERVAL" de 24 horas.
O próximo passo é a criação de uma tablespace exclusiva para guardar os dados de auditoria:
SQL> CREATE TABLESPACE AUDTBS DATAFILE '/u02/oradata/ORACL/audtbs01.dbf' SIZE 128M 2 AUTOEXTEND ON NEXT 64M MAXSIZE 2G 3 NOLOGGING default NOCOMPRESS ONLINE PERMANENT BLOCKSIZE 8K 4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M SEGMENT SPACE MANAGEMENT AUTO; Tablespace created
Agora vamos mover as tabelas AUD$ e FGA_LOG$ para a nova tablespace criada. É recomendado que estas tabelas estejam vazias para otimizar o processo. Faça um truncate se possível ou então deixe os dados e aguarde.
SQL> BEGIN 2 SYS.DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( 3 audit_trail_type => SYS.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 4 audit_trail_location_value => 'AUDTBS'); 5 END; 6 / PL/SQL procedure successfully completed SQL> SQL> BEGIN 2 SYS.DBMS_AUDIT_MGMT.set_audit_trail_location( 3 audit_trail_type => SYS.DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD, 4 audit_trail_location_value => 'AUDTBS'); 5 END; 6 / PL/SQL procedure successfully completed
Hora de verificar se as tabelas foram realmente movidas. Verifique se os valores do parâmetro "DB AUDIT TABLESPACE" na primeira query foram alterados.
SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; PARAMETER_NAME PARAMETER_VALUE AUDIT_TRAIL -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------- DB AUDIT TABLESPACE AUDTBS STANDARD AUDIT TRAIL DB AUDIT TABLESPACE AUDTBS FGA AUDIT TRAIL AUDIT FILE MAX SIZE 10000 OS AUDIT TRAIL AUDIT FILE MAX SIZE 10000 XML AUDIT TRAIL AUDIT FILE MAX AGE 5 OS AUDIT TRAIL AUDIT FILE MAX AGE 5 XML AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 STANDARD AUDIT TRAIL DB AUDIT CLEAN BATCH SIZE 10000 FGA AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 OS AUDIT TRAIL OS FILE CLEAN BATCH SIZE 1000 XML AUDIT TRAIL DEFAULT CLEAN UP INTERVAL 24 STANDARD AUDIT TRAIL DEFAULT CLEAN UP INTERVAL 24 FGA AUDIT TRAIL 12 rows selected SQL> SQL> SELECT OWNER, 2 SEGMENT_NAME, 3 TABLESPACE_NAME 4 FROM DBA_SEGMENTS 5 WHERE SEGMENT_NAME IN ('AUD$', 'FGA_LOG$'); OWNER SEGMENT_NAME TABLESPACE_NAME ------------------------------ -------------------------------------------------------------------------------- ------------------------------ SYS FGA_LOG$ AUDTBS SYS AUD$ AUDTBS
Agora vamos criar um novo Scheduler Job que irá marcar diariamente todos os registros de auditoria anteriores a 90 dias como arquivados. Desta forma, o processo de limpeza poderá limpá-los.
SQL> BEGIN 2 DBMS_SCHEDULER.CREATE_JOB ( 3 job_name => 'SYS.DAILY_AUDIT_ARCHIVE_TIMESTAMP', 4 job_type => 'PLSQL_BLOCK', 5 job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,LAST_ARCHIVE_TIME => SYSDATE-90); END;', 6 start_date => sysdate, 7 repeat_interval => 'FREQ=HOURLY;INTERVAL=24', 8 enabled => TRUE, 9 comments => 'Create an archive timestamp' 10 ); 11 END; 12 / PL/SQL procedure successfully completed
Fazendo a verificação se o job foi criado.
SQL> SELECT OWNER,JOB_NAME,JOB_STYLE,JOB_CREATOR,JOB_TYPE,JOB_ACTION,START_DATE,REPEAT_INTERVAL,ENABLED,STATE,SYSTEM,NLS_ENV,COMMENTS FROM dba_scheduler_jobs WHERE job_name LIKE '%AUDIT%'; OWNER JOB_NAME JOB_STYLE JOB_CREATOR JOB_TYPE JOB_ACTION START_DATE REPEAT_INTERVAL ENABLED STATE SYSTEM NLS_ENV COMMENTS ------------------------------ ------------------------------ ----------- ------------------------------ ---------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------- --------------- ------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- SYS DAILY_AUDIT_ARCHIVE_TIMESTAMP REGULAR SYS PLSQL_BLOCK BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE => DBMS_AUDIT_ 22/05/13 13:29:13,000000 -03:00 FREQ=HOURLY;INTERVAL=24 TRUE SCHEDULED TRUE NLS_LANGUAGE='BRAZILIAN PORTUGUESE' NLS_TERRITORY='BRAZIL' NLS_CURRENCY='R$' NLS Create an archive timestamp
Por fim, vamos criar o processo para limpar diariamente os registros que foram marcados pelo job anterior.
SQL> BEGIN 2 SYS.DBMS_AUDIT_MGMT.CREATE_PURGE_JOB( 3 AUDIT_TRAIL_TYPE => SYS.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 4 AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */, 5 AUDIT_TRAIL_PURGE_NAME => 'Daily_Audit_Purge_Job', 6 USE_LAST_ARCH_TIMESTAMP => TRUE 7 ); 8 END; 9 / PL/SQL procedure successfully completed
Fazendo a verificação se o job foi criado.
SQL> SELECT JOB_NAME,JOB_STATUS,AUDIT_TRAIL,JOB_FREQUENCY FROM DBA_AUDIT_MGMT_CLEANUP_JOBS; JOB_NAME JOB_STATUS AUDIT_TRAIL JOB_FREQUENCY -------------------------------------------------------------------------------- ---------- ---------------------------- -------------------------------------------------------------------------------- DAILY_AUDIT_PURGE_JOB ENABLED STANDARD AUDIT TRAIL FREQ=HOURLY;INTERVAL=24 SQL> SELECT OWNER,JOB_NAME,JOB_STYLE,JOB_CREATOR,JOB_TYPE,JOB_ACTION,START_DATE,REPEAT_INTERVAL,ENABLED,STATE,SYSTEM,NLS_ENV,COMMENTS FROM dba_scheduler_jobs WHERE job_name LIKE '%AUDIT%'; OWNER JOB_NAME JOB_STYLE JOB_CREATOR JOB_TYPE JOB_ACTION START_DATE REPEAT_INTERVAL ENABLED STATE SYSTEM NLS_ENV COMMENTS ------------------------------ ------------------------------ ----------- ------------------------------ ---------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------- --------------- ------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- SYS DAILY_AUDIT_ARCHIVE_TIMESTAMP REGULAR SYS PLSQL_BLOCK BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE => DBMS_AUDIT_ 22/05/13 13:29:13,000000 -03:00 FREQ=HOURLY;INTERVAL=24 TRUE SCHEDULED TRUE NLS_LANGUAGE='BRAZILIAN PORTUGUESE' NLS_TERRITORY='BRAZIL' NLS_CURRENCY='R$' NLS Create an archive timestamp SYS DAILY_AUDIT_PURGE_JOB REGULAR SYS PLSQL_BLOCK BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(1, TRUE); END; 22/05/13 13:30:13,003284 AMERICA/RECIFE FREQ=HOURLY;INTERVAL=24 TRUE SCHEDULED TRUE NLS_LANGUAGE='BRAZILIAN PORTUGUESE' NLS_TERRITORY='BRAZIL' NLS_CURRENCY='R$' NLS Audit clean job = 'Daily_Audit_Purge_Job'
Para finalizar, recomendo remover todas as opções default da auditoria do Oracle e religá-las apenas para execuções "Whenever Successful", não catalogando comandos executados que falharam por falta de privilégios.
SQL> noaudit all; SQL> noaudit all privileges; SQL> noaudit exempt access policy; Noaudit succeeded Noaudit succeeded Noaudit succeeded sql> audit all by access whenever successful; -- Adiciona 27 opções de AUDIT sql> audit alter any table by access whenever successful; sql> audit create any table by access whenever successful; sql> audit drop any table by access whenever successful; sql> audit create any procedure by access whenever successful; sql> audit drop any procedure by access whenever successful; sql> audit alter any procedure by access whenever successful; sql> audit grant any privilege by access whenever successful; sql> audit grant any object privilege by access whenever successful; sql> audit grant any role by access whenever successful; sql> audit audit system by access whenever successful; sql> audit create external job by access whenever successful; sql> audit create any job by access whenever successful; sql> audit create any library by access whenever successful; sql> audit create public database link by access whenever successful; sql> audit exempt access policy by access whenever successful; sql> audit alter user by access whenever successful; sql> audit create user by access whenever successful; sql> audit role by access whenever successful; sql> audit create session by access whenever successful; sql> audit drop user by access whenever successful; sql> audit alter database by access whenever successful; sql> audit alter system by access whenever successful; sql> audit alter profile by access whenever successful; sql> audit drop profile by access whenever successful; Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded Audit succeeded
Verificando..
SQL> SELECT * FROM DBA_STMT_AUDIT_OPTS order by 3; USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE ------------------------------ ------------------------------ ---------------------------------------- ---------- ---------- ALTER ANY PROCEDURE BY ACCESS NOT SET ALTER ANY TABLE BY ACCESS NOT SET ALTER DATABASE BY ACCESS NOT SET ALTER PROFILE BY ACCESS NOT SET ALTER SYSTEM BY ACCESS NOT SET ALTER USER BY ACCESS NOT SET CLUSTER BY ACCESS NOT SET CONTEXT BY ACCESS NOT SET CREATE ANY JOB BY ACCESS NOT SET CREATE ANY LIBRARY BY ACCESS NOT SET CREATE ANY PROCEDURE BY ACCESS NOT SET CREATE ANY TABLE BY ACCESS NOT SET CREATE EXTERNAL JOB BY ACCESS NOT SET CREATE PUBLIC DATABASE LINK BY ACCESS NOT SET CREATE SESSION BY ACCESS NOT SET CREATE USER BY ACCESS NOT SET DATABASE LINK BY ACCESS NOT SET DIMENSION BY ACCESS NOT SET DIRECTORY BY ACCESS NOT SET DROP ANY PROCEDURE BY ACCESS NOT SET DROP ANY TABLE BY ACCESS NOT SET DROP PROFILE BY ACCESS NOT SET DROP USER BY ACCESS NOT SET EXEMPT ACCESS POLICY BY ACCESS NOT SET GRANT ANY OBJECT PRIVILEGE BY ACCESS NOT SET GRANT ANY PRIVILEGE BY ACCESS NOT SET GRANT ANY ROLE BY ACCESS NOT SET INDEX BY ACCESS NOT SET MATERIALIZED VIEW BY ACCESS NOT SET MINING MODEL BY ACCESS NOT SET NOT EXISTS BY ACCESS NOT SET PROCEDURE BY ACCESS NOT SET PROFILE BY ACCESS NOT SET PUBLIC DATABASE LINK BY ACCESS NOT SET PUBLIC SYNONYM BY ACCESS NOT SET ROLE BY ACCESS NOT SET ROLLBACK SEGMENT BY ACCESS NOT SET SEQUENCE BY ACCESS NOT SET SYNONYM BY ACCESS NOT SET SYSTEM AUDIT BY ACCESS NOT SET SYSTEM GRANT BY ACCESS NOT SET TABLE BY ACCESS NOT SET TABLESPACE BY ACCESS NOT SET TRIGGER BY ACCESS NOT SET TYPE BY ACCESS NOT SET USER BY ACCESS NOT SET VIEW BY ACCESS NOT SET 47 rows selected SQL>
Pronto, agora você não precisa mais se preocupar com o crescimento descontralado da sua tablespace SYSTEM. A auditoria está isolada em uma tablespace dedicada.
Gostou? Não deixe de comentar ou deixar um 👍!
14 comentários
Pular para o formulário de comentário
Rodrigo ,
Que excelente artigo sobre expurgo de auditoria , estou implementando auditoria aqui na empresa e é exatamente isso que vou precisar , não sabia dos novos recursos do R11G.
Muito bom !
Valeu !!!!
abç
Autor
Obrigado!
Grande abç!
Excelente artigo,
Estou implementando a auditoria na empresa onde trabalho e este artigo me ajudou bastante.
Muito Obrigada!
Autor
Que bom Deyse! Fico grato por ouvir isso! =]
Abcs,
Rodrigo
Rodrigo,
Recentemente, instalamos um banco na versão 12.1.0.1.0, sendo que "The Unified Auditing" não está habilitado e "The get_stats_history_retention is 7".
No tablespace AUDSYS, os objetos "table" CLI_SWP$21f1d8bc$1$1 and "lobsegment" SYS_LOB0000091751C00014$$ estão em constante crescimento.
Você tem alguma dica de como limitar o crescimentos destes objetos?
Grato,
Carlos.
Autor
Oi Carlos,
As melhores formas de limitar são alterando a quantidade de auditoria que você gera ou aumentando a frequência e diminuindo a retenção para maiores expurgos dos dados históricos.
Caso não seja possível, outra recomendação é exportar com alguma periodicidade os dados das tabelas de auditorias e limpá-las.
Abcs,
Rodrigo
Muito bom.
Rodrigo, excelente artigo sobre auditoria. Há tempos eu nao via algo tão completo.
Uma dúvida que tenho em relação á aud$ é se eu posso aplicar a compressão OLTP nela. É recomendado ou tem algum efeito colateral?
Autor
Oi Reginaldo,
Tudo bem?
Nunca é recomendado alterar uma tabela interna de BD ($ tables), quanto mais ao formato de compressão. Sem dúvidas a compressão OLTP, pela forma que ela é concebida, vai gerar um impacto grande nas operações de BD que geram auditoria.
O melhor a se fazer neste caso é fazer um expurgo (diário/semanal via job) da aud$ para uma outra tabela de outro schema usando "load compress" (não OLTP).
Abcs,
RJ
Olá Rodrigo, parabéns pelo artigo, realmente bastante completo.
Gostaria de saber a respeito dos arquivos .aud que são gravados na pasta adump, nesse caso eles também são excluídos conforme a retenção ou só com um rm agendado no linux?
Desde já agradeço.
Abs.
Autor
Oi Dione,
Para arquivos aud (que são gerados caso o seu audit trail location esteja como OS ou para logins feitos com SYSDBA), eles precisam ser agendados. No entanto, em vez de executar um "rm", utilize o utilitário adrci passando como parâmetro o tempo de retenção. É mais fácil e mais seguro.
Abraços,
RJ
Olá Rodrigo!
Parabéns pelo artigo! Muito esclarecedor!! Obrigada por compartilhar!
Tenho uma dúvida, sobre a rotina de limpeza, tenho que fazer uma separa para a FGA_LOG$ Porque percebi que a minha tabela FGA_LOG$ não está sendo "limpa".
Muito obrigada!
Herica Beccalli
Autor
Oi Herica, tudo bem?
Sim, você pode fazer uma política separada ou então alterar a constante passada nos parâmetros. Dê uma neste link para ver a que tabela cada constante aponta: https://docs.oracle.com/database/121/ARPLS/d_audit_mgmt.htm#BABIDGEA
Abcs,
Rodrigo
Boa tarde. Parabens e mjuito bem detalhado . Uma duvida a mais . Possível listar os horários que essas alterações estão sendo feitas? Exemplo de gerar um relatório para ser enviado ao respons. .. Obrigado