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:
@@ -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
|
||||||
-- =========================================================
|
-- =========================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user