{"id":872,"date":"2014-02-18T21:00:02","date_gmt":"2014-02-18T20:00:02","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=872"},"modified":"2014-02-18T17:06:13","modified_gmt":"2014-02-18T16:06:13","slug":"manteniendo-las-tablas-de-auditoria","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/manteniendo-las-tablas-de-auditoria\/","title":{"rendered":"Mantenimiento de las tablas de auditor\u00eda   SYS.AUD$"},"content":{"rendered":"<p>Hoy vamos a ver algo tan b\u00e1sico como es el mantenimiento de las tablas de auditoria. Los registros de auditoria de la base de datos es una de esas cosas que tienden a crecer indiscriminadamente llen\u00e1ndonos los tablespaces del sistema sin que nos demos cuenta. Hoy vamos a ver como limitar estos registros a los de los \u00faltimos 100 d\u00edas (algo mas de 3 meses).<\/p>\n<p>En las versiones anteriores (9i,10g ) el mantenimiento de las tablas de auditoria era un poco <i>\u00abpor tu cuenta y riesgo\u00bb<\/i>, hab\u00eda documentaci\u00f3n de como hacerlo pero dec\u00eda que no era soportada ( por ejemplo la nota <i>Note: 1019377.6 Script to move SYS.AUD$ table out of SYSTEM tablespace <\/i>).<br \/>\nAfortunadamente en la versi\u00f3n 11g Oracle ha creado el paquete <a href\"=http:\/\/docs.oracle.com\/cd\/E11882_01\/appdev.112\/e25788\/d_audit_mgmt.htm\">DBMS_AUDIT_MGMT<\/a> facilit\u00e1ndonos la labor.<\/p>\n<p>Lo primero que tenemos que ver es donde se encuentran las tabas de auditoria, para ello usaremos la consulta<\/p>\n<pre>\r\nSELECT table_name, tablespace_name\r\nFROM dba_tables\r\nWHERE table_name IN ('AUD$', 'FGA_LOG$')\r\nORDER BY table_name;\r\n\r\nTABLE_NAME                     TABLESPACE_NAME\r\n------------------------------ ------------------------------\r\nAUD$                           SYSTEM\r\nFGA_LOG$                       SYSTEM\r\n<\/pre>\n<p>O con la llamada al paquete<\/p>\n<pre>\r\ncolumn parameter_name format a30\r\ncolumn parameter_value format a20\r\nSELECT * FROM dba_audit_mgmt_config_params;\r\n\r\nPARAMETER_NAME            PARAMETER_VALUE      AUDIT_TRAIL\r\n------------------------ ------------------ ----------------------\r\nDB AUDIT TABLESPACE            TS_AUD         STANDARD AUDIT TRAIL\r\nDB AUDIT TABLESPACE            TS_AUD         FGA AUDIT TRAIL\r\nAUDIT FILE MAX SIZE            10000          OS AUDIT TRAIL\r\nAUDIT FILE MAX SIZE            10000          XML AUDIT TRAIL\r\nAUDIT FILE MAX AGE             5              OS AUDIT TRAIL\r\nAUDIT FILE MAX AGE             5              XML AUDIT TRAIL\r\nDB AUDIT CLEAN BATCH SIZE      10000          STANDARD AUDIT TRAIL\r\nDB AUDIT CLEAN BATCH SIZE      10000          FGA AUDIT TRAIL\r\nOS FILE CLEAN BATCH SIZE       1000           OS AUDIT TRAIL\r\nOS FILE CLEAN BATCH SIZE       1000           XML AUDIT TRAIL\r\n\r\n10 filas seleccionadas.\r\n<\/pre>\n<p>Por  defecto, estas tablas estar\u00e1n en el tablespace SYSTEM, es muy importante el mover  estas tablas fuera de este tablespace si vamos a trabajar sobre ellas,ya uqe, sino Oracle usar\u00e1 el tablespace SYSAUX,algo que no queremos que pase bajo ning\u00fan concepto.<br \/>\nLo primero que vamos a hacer es crear un tablespace para la auditoria, as\u00ed que, vamos a ver el tama\u00f1o que necesitamos y a crear un tablespace con suficiente tama\u00f1o: <\/p>\n<pre>\r\nSQL> select sum(bytes)\/1024\/1024 Mb \r\n        from dba_segments \r\n          where segment_name in ('AUD$', 'FGA_LOG$');\r\n-------\r\n200,0625\r\nSQL> create tablespace TS_AUD\r\n   datafile '\\oracle\\oradata\\instancia\\ts_audit01.dbf' size 250M;\r\n<\/pre>\n<p>Una vez tengamos el tablespace creado, podemos usar la llamada <i> DBMS_AUDIT_MGMT.set_audit_trail_location <\/i> para mover las tablas actuales al nuevo tablespace <\/p>\n<pre>\r\nBEGIN\r\n DBMS_AUDIT_MGMT.set_audit_trail_location(\r\n audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,\r\n audit_trail_location_value => 'TS_AUD');\r\nEND;\r\n \r\nBEGIN\r\n DBMS_AUDIT_MGMT.set_audit_trail_location(\r\n audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD,\r\n audit_trail_location_value => 'TS_AUD');\r\nEND;\r\n<\/pre>\n<p>Con estos pasos, ya tenemos las tablas de auditoria en un tablespace especifico llamado TS_AUD, es en este momento cuando podemos comenzar con las tareas de mantenimiento de los registros de auditor\u00eda.<\/p>\n<p>Como dec\u00edamos al principio, vamos ha configurar la base de datos para que se borren los registros anteriores a 100 d\u00edas.<\/p>\n<p>Lo primero que tendremos que hacer es inicializar el paquete con <a href\"http:\/\/docs.oracle.com\/cd\/E11882_01\/appdev.112\/e25788\/d_audit_mgmt.htm#ARPLS65423\"> DBMS_AUDIT_MGMT.init_cleanup<\/a><br \/>\nEn nuestro caso lo lanzaremos  sobre <i>AUDIT_TRAIL_AUD_STD<\/i> Ya que lo que queremos limpiar son los registros de las tablas de auditoria de la base de datos, si quisi\u00e9ramos limpiar otro (por ejemplo los del S.O seguir\u00edamos la tabla <a href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/appdev.112\/e25788\/d_audit_mgmt.htm#ARPLS65397\">Audit Trail Types<\/a>)<\/p>\n<pre>\r\nBEGIN\r\n DBMS_AUDIT_MGMT.init_cleanup(\r\n audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,\r\n default_cleanup_interval => 24 \/* horas*\/);\r\nEND;\r\n<\/pre>\n<p>Tras esto, con la propiedad SET_LAST_ARCHIVE_TIMESTAMP indicamos cual es la fecha del ultimo registro que queremos guardar.(en nuestro caso borraremos todo lo anterior a 100 d\u00edas)<\/p>\n<pre>\r\nBEGIN\r\n  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(\r\n    audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,\r\n    last_archive_time => SYSTIMESTAMP-100 \/*100 d\u00edas*\/);\r\nEND;\r\n<\/pre>\n<p>Antes de ejecutar el trabajo, vamos a ver cual es el registro m\u00e1s antiguo:<\/p>\n<pre>\r\nSQL> select min(ntimestamp#) from sys.aud$;\r\n-------------------------------------------\r\n17\/10\/13 00:00:50,119000\r\n<\/pre>\n<p>Ejecutamos el purgado con la llamada<\/p>\n<pre>\r\nBEGIN\r\n  DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(\r\n   audit_trail_type=> DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,\r\n   use_last_arch_timestamp => TRUE);\r\nEND;\r\n<\/pre>\n<p>Tras ejecutar esto, el \u00faltimo registro deber\u00eda de corresponderse con la fecha SYSDATE-100.<br \/>\nSi lo comprobamos tendremos que <\/p>\n<pre>\r\nSQL> select to_date(SYSTIMESTAMP-100) from dual \r\n--------\r\n11\/11\/13\r\nSQL> select min(ntimestamp#) from sys.aud$;\r\n------------------------------------------\r\n11\/11\/13 16:46:08,889000\r\n<\/pre>\n<p>Con lo que, efectivamente, habremos borrado todos los registros anteriores a 100 d\u00edas. <\/p>\n<p>A partir de ahora, podemos, o bien llevar a cabo los borrados de manera puntual con la llamada anterior, o planificarlos con en un job de purgado con la llamada <\/p>\n<pre>\r\nBEGIN\r\n  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(\r\n    audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,\r\n    audit_trail_purge_interval => 24 \/* horas *\/,  \r\n    audit_trail_purge_name => 'PURGADO_DE_TABLAS_AUDITORIA',\r\n    use_last_arch_timestamp=> TRUE);\r\nEND;\r\n<\/pre>\n<p>Como siempre, podemos encontrar mas informaci\u00f3n en soporte Oracle en las notas :<br \/>\nDocumentaci\u00f3n del paquete <a href\"http:\/\/docs.oracle.com\/cd\/E11882_01\/appdev.112\/e25788\/d_audit_mgmt.htm#ARPLS241\">DBMS_AUDIT_MGMT<\/a><br \/>\nNote 72460.1 Moving AUD$ to Another Tablespace and Adding Triggers to AUD$<br \/>\nNote: 1019377.6 Script to move SYS.AUD$ table out of SYSTEM tablespace<br \/>\nNote: 166301.1 How to Reorganize SYS.AUD$ Table<br \/>\nNote: 731908.1 New Feature DBMS_AUDIT_MGMT To Manage And Purge Audit Information<br \/>\nNote: 73408.1 How to Truncate, Delete, or Purge Rows from the Audit Trail Table SYS.AUD$ <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a ver algo tan b\u00e1sico como es el mantenimiento de las tablas de auditoria. Los registros de auditoria de la base de datos es una de esas cosas que tienden a crecer indiscriminadamente llen\u00e1ndonos los tablespaces del sistema &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/manteniendo-las-tablas-de-auditoria\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,3],"tags":[72,249,128,144,143],"class_list":["post-872","post","type-post","status-publish","format-standard","hentry","category-11g","category-tunning","tag-aud","tag-11g","tag-auditoria","tag-ora-06512","tag-ora-46267"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/comments?post=872"}],"version-history":[{"count":16,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"predecessor-version":[{"id":888,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/872\/revisions\/888"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}