Raúl Antonio Molina Alvarenga
19 de Abril de 2023
#OracleACE
#OracleTipsSV
A veces nos hacen la pregunta, cuanto espacio debemos reservar para el crecimiento a futuro de la base de datos, o cuanto espacio hemos consumido en un año anterior.
Esa información de forma natural en la base de datos, sin precalcularlo es un poco complejo obtenerla, especialmente si no tenemos vistas históricas que se obtienen con EE y Packs de diagnóstico y tuneo.
Aquí un pequeño TIP para poder calcular dicha información y almacenarlo, no considera el UNDO y TEMP, solo Información real de usuario.
Crear Tabla que almacenara la información histórica.
create table db_space_hist ( timestamp date, total_space number(8), used_space number(8), free_space number(8), pct_inuse number(5,2), num_db_files number(5) );
Crear procedimiento de colección de Información:
CREATE OR REPLACE PROCEDURE db_space_history AS BEGIN INSERT INTO db_space_hist SELECT SYSDATE, total_space, total_space-NVL(free_space,0) used_space, NVL(free_space,0) free_space, ((total_space - NVL(free_space,0)) / total_space)*100 pct_inuse, num_db_files FROM ( SELECT SUM(bytes)/1024/1024 free_space FROM sys.DBA_FREE_SPACE WHERE tablespace_name NOT LIKE '%UNDO%') FREE, ( SELECT SUM(bytes)/1024/1024 total_space, COUNT(*) num_db_files FROM sys.DBA_DATA_FILES WHERE tablespace_name NOT LIKE '%UNDO%') FULL; COMMIT; END; /
Crear el JOB que calculara la información, la Frecuencia puede ser la deseada, o necesitada, diaria, semanal , mensual.(Puede usarse o mejor dicho usar Scheduler JOBS).
DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'OBS.DB_SPACE_HISTORY;' ,next_date => sysdate+1 ,INTERVAL => 'TRUNC(SYSDATE+7)' ,no_parse => FALSE ); END;
La información se consulta asi:
select * from db_space_hist order by timestamp desc;
Espero les sea de Utilidad
Saludos.