feat(cleanup): add advisor objects, scheduler log cleanup and datafile resize

Add cleanup for WRI$_ADV_* tables (can accumulate millions of rows/GBs),
scheduler$_event_log truncate, and automatic UNDO/SYSAUX datafile resize
with progressive fallback (2G→4G→6G). Tested on Oracle 18c XE.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-03-24 16:55:58 +00:00
parent 6410339196
commit 11001933f2

View File

@@ -4,6 +4,8 @@
-- Compatibil cu: Oracle 11g XE, 12c, 18c XE, 21c XE -- Compatibil cu: Oracle 11g XE, 12c, 18c XE, 21c XE
-- Compatibil cu: non-CDB si CDB/PDB -- Compatibil cu: non-CDB si CDB/PDB
-- Scop: Curata audit trail din SYSAUX + dezactiveaza auditurile -- Scop: Curata audit trail din SYSAUX + dezactiveaza auditurile
-- + curata advisor objects + scheduler log
-- + resize UNDO si SYSAUX datafiles
-- Rulat ca: SYS AS SYSDBA -- Rulat ca: SYS AS SYSDBA
-- - non-CDB: sqlplus / as sysdba -- - non-CDB: sqlplus / as sysdba
-- - CDB/PDB: conectat la PDB (ALTER SESSION SET CONTAINER = XEPDB1) -- - CDB/PDB: conectat la PDB (ALTER SESSION SET CONTAINER = XEPDB1)
@@ -17,7 +19,10 @@
-- 3. Curata audit trail-urile existente -- 3. Curata audit trail-urile existente
-- 4. Configureaza auto-purge pentru siguranta -- 4. Configureaza auto-purge pentru siguranta
-- 5. Dezactiveaza auto tasks care umfla SYSAUX -- 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 SET SERVEROUTPUT ON SIZE UNLIMITED
@@ -34,6 +39,11 @@ DECLARE
v_count NUMBER; v_count NUMBER;
v_aud_size_mb NUMBER := 0; v_aud_size_mb NUMBER := 0;
v_sysaux_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 -- Helper: executa SQL si ignora erori
PROCEDURE exec_ignore(p_sql VARCHAR2) IS 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_references', 'TRUNCATE wri$_sqlset_references');
exec_log('TRUNCATE TABLE sys.wri$_sqlset_definitions', 'TRUNCATE wri$_sqlset_definitions'); exec_log('TRUNCATE TABLE sys.wri$_sqlset_definitions', 'TRUNCATE wri$_sqlset_definitions');
-- Cleanup advisor tasks + stats -- Cleanup stats + recyclebin
exec_log('BEGIN DBMS_ADVISOR.DELETE_EXPIRED_TASKS; END;', 'Delete expired advisor tasks');
exec_log('BEGIN DBMS_STATS.PURGE_STATS(SYSDATE - 7); END;', 'Purge stats older than 7 days'); exec_log('BEGIN DBMS_STATS.PURGE_STATS(SYSDATE - 7); END;', 'Purge stats older than 7 days');
exec_log('PURGE DBA_RECYCLEBIN', 'Purge recyclebin'); 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 -- 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'); exec_log('GRANT EXECUTE ON SYS.DBMS_LOCK TO CONTAFIN_ORACLE', 'GRANT DBMS_LOCK TO CONTAFIN_ORACLE');
END IF; 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 -- VERIFICARE FINALA
-- ========================================================= -- =========================================================