diff --git a/clienti/oracle-xe-21c/import/cleanup_audit.sql b/clienti/oracle-xe-21c/import/cleanup_audit.sql index 4e438f5..9c148c1 100644 --- a/clienti/oracle-xe-21c/import/cleanup_audit.sql +++ b/clienti/oracle-xe-21c/import/cleanup_audit.sql @@ -4,6 +4,8 @@ -- Compatibil cu: Oracle 11g XE, 12c, 18c XE, 21c XE -- Compatibil cu: non-CDB si CDB/PDB -- Scop: Curata audit trail din SYSAUX + dezactiveaza auditurile +-- + curata advisor objects + scheduler log +-- + resize UNDO si SYSAUX datafiles -- Rulat ca: SYS AS SYSDBA -- - non-CDB: sqlplus / as sysdba -- - CDB/PDB: conectat la PDB (ALTER SESSION SET CONTAINER = XEPDB1) @@ -17,7 +19,10 @@ -- 3. Curata audit trail-urile existente -- 4. Configureaza auto-purge pentru siguranta -- 5. Dezactiveaza auto tasks care umfla SYSAUX --- 6. Verifica rezultatul +-- 6. Curata SQL Advisor objects (WRI$_ADV_*) - pot ocupa GB +-- 7. Curata scheduler event log +-- 8. Resize UNDO si SYSAUX datafiles +-- 9. Verifica rezultatul -- ============================================================ SET SERVEROUTPUT ON SIZE UNLIMITED @@ -34,6 +39,11 @@ DECLARE v_count NUMBER; v_aud_size_mb NUMBER := 0; v_sysaux_mb NUMBER := 0; + v_undo_file VARCHAR2(512); + v_undo_mb NUMBER; + v_sysaux_file VARCHAR2(512); + v_sysaux_df NUMBER; + v_hwm NUMBER; -- Helper: executa SQL si ignora erori PROCEDURE exec_ignore(p_sql VARCHAR2) IS @@ -291,11 +301,34 @@ BEGIN exec_log('TRUNCATE TABLE sys.wri$_sqlset_references', 'TRUNCATE wri$_sqlset_references'); exec_log('TRUNCATE TABLE sys.wri$_sqlset_definitions', 'TRUNCATE wri$_sqlset_definitions'); - -- Cleanup advisor tasks + stats - exec_log('BEGIN DBMS_ADVISOR.DELETE_EXPIRED_TASKS; END;', 'Delete expired advisor tasks'); + -- Cleanup stats + recyclebin exec_log('BEGIN DBMS_STATS.PURGE_STATS(SYSDATE - 7); END;', 'Purge stats older than 7 days'); exec_log('PURGE DBA_RECYCLEBIN', 'Purge recyclebin'); + -- ========================================================= + -- PASUL 5b: CLEANUP SQL ADVISOR OBJECTS (WRI$_ADV_*) + -- ========================================================= + -- WRI$_ADV_OBJECTS poate acumula milioane de randuri (GB) + -- Sunt doar recomandari de tuning, nu date de productie + DBMS_OUTPUT.PUT_LINE(' '); + DBMS_OUTPUT.PUT_LINE('[PASUL 5b] Cleanup SQL Advisor objects...'); + + -- Truncate in ordinea corecta (foreign keys) + exec_log('TRUNCATE TABLE sys.wri$_adv_actions', 'TRUNCATE wri$_adv_actions'); + exec_log('TRUNCATE TABLE sys.wri$_adv_findings', 'TRUNCATE wri$_adv_findings'); + exec_log('TRUNCATE TABLE sys.wri$_adv_recommendations', 'TRUNCATE wri$_adv_recommendations'); + exec_log('TRUNCATE TABLE sys.wri$_adv_rationale', 'TRUNCATE wri$_adv_rationale'); + exec_log('TRUNCATE TABLE sys.wri$_adv_journal', 'TRUNCATE wri$_adv_journal'); + exec_log('TRUNCATE TABLE sys.wri$_adv_objects', 'TRUNCATE wri$_adv_objects'); + + -- ========================================================= + -- PASUL 5c: CLEANUP SCHEDULER EVENT LOG + -- ========================================================= + DBMS_OUTPUT.PUT_LINE(' '); + DBMS_OUTPUT.PUT_LINE('[PASUL 5c] Cleanup scheduler event log...'); + + exec_log('TRUNCATE TABLE sys.scheduler$_event_log', 'TRUNCATE scheduler$_event_log'); + -- ========================================================= -- PASUL 6: DEZACTIVARE AUTO TASKS -- ========================================================= @@ -357,6 +390,86 @@ BEGIN exec_log('GRANT EXECUTE ON SYS.DBMS_LOCK TO CONTAFIN_ORACLE', 'GRANT DBMS_LOCK TO CONTAFIN_ORACLE'); END IF; + -- ========================================================= + -- PASUL 9: RESIZE UNDO DATAFILE + -- ========================================================= + -- UNDO poate creste foarte mult dupa import-uri bulk + -- undo_retention=900 (15 min) e suficient pentru XE + DBMS_OUTPUT.PUT_LINE(' '); + DBMS_OUTPUT.PUT_LINE('[PASUL 9] Resize UNDO datafile...'); + + exec_log('ALTER SYSTEM SET undo_retention = 900', 'undo_retention = 900'); + + BEGIN + SELECT file_name, ROUND(bytes/1024/1024) + INTO v_undo_file, v_undo_mb + FROM dba_data_files + WHERE tablespace_name = 'UNDOTBS1' + AND ROWNUM = 1; + + DBMS_OUTPUT.PUT_LINE(' UNDO datafile: ' || v_undo_file || ' (' || v_undo_mb || ' MB)'); + + IF v_undo_mb > 2048 THEN + -- Incearca resize la 2 GB, apoi 4 GB, apoi 6 GB + BEGIN + EXECUTE IMMEDIATE 'ALTER DATABASE DATAFILE ''' || v_undo_file || ''' RESIZE 2G'; + DBMS_OUTPUT.PUT_LINE(' [OK] UNDO resize la 2 GB'); + EXCEPTION WHEN OTHERS THEN + BEGIN + EXECUTE IMMEDIATE 'ALTER DATABASE DATAFILE ''' || v_undo_file || ''' RESIZE 4G'; + DBMS_OUTPUT.PUT_LINE(' [OK] UNDO resize la 4 GB'); + EXCEPTION WHEN OTHERS THEN + BEGIN + EXECUTE IMMEDIATE 'ALTER DATABASE DATAFILE ''' || v_undo_file || ''' RESIZE 6G'; + DBMS_OUTPUT.PUT_LINE(' [OK] UNDO resize la 6 GB'); + EXCEPTION WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE(' [SKIP] UNDO resize: ' || SUBSTR(SQLERRM, 1, 150)); + END; + END; + END; + ELSE + DBMS_OUTPUT.PUT_LINE(' [OK] UNDO deja <= 2 GB, skip resize'); + END IF; + END; + + -- ========================================================= + -- PASUL 10: RESIZE SYSAUX DATAFILE + -- ========================================================= + DBMS_OUTPUT.PUT_LINE(' '); + DBMS_OUTPUT.PUT_LINE('[PASUL 10] Resize SYSAUX datafile...'); + + BEGIN + SELECT file_name, ROUND(bytes/1024/1024) + INTO v_sysaux_file, v_sysaux_df + FROM dba_data_files + WHERE tablespace_name = 'SYSAUX' + AND ROWNUM = 1; + + -- Calculeaza high water mark + SELECT CEIL(MAX(block_id + blocks) * 8192 / 1024 / 1024) + INTO v_hwm + FROM dba_extents + WHERE tablespace_name = 'SYSAUX'; + + DBMS_OUTPUT.PUT_LINE(' SYSAUX datafile: ' || v_sysaux_file || ' (' || v_sysaux_df || ' MB)'); + DBMS_OUTPUT.PUT_LINE(' SYSAUX HWM: ' || v_hwm || ' MB'); + + -- Resize doar daca putem recupera cel putin 500 MB + IF v_sysaux_df - v_hwm > 500 THEN + BEGIN + EXECUTE IMMEDIATE 'ALTER DATABASE DATAFILE ''' || v_sysaux_file + || ''' RESIZE ' || (v_hwm + 100) || 'M'; + DBMS_OUTPUT.PUT_LINE(' [OK] SYSAUX resize la ' || (v_hwm + 100) || ' MB'); + EXCEPTION WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE(' [SKIP] SYSAUX resize: ' || SUBSTR(SQLERRM, 1, 150)); + DBMS_OUTPUT.PUT_LINE(' [INFO] HWM prea aproape de dim. curenta, spatiul se va reutiliza'); + END; + ELSE + DBMS_OUTPUT.PUT_LINE(' [SKIP] Diferenta < 500 MB, nu merita resize'); + DBMS_OUTPUT.PUT_LINE(' [INFO] Spatiul liber din SYSAUX se va reutiliza automat'); + END IF; + END; + -- ========================================================= -- VERIFICARE FINALA -- =========================================================