viernes, 6 de enero de 2012

Tamaño de la Base de Datos Oracle

¿Cómo determinar el tamaño de una base de datos Oracle?

A  menudo nos hacen la pregunta de ¿cuál es el tamaño de nuestra base de datos? 
Podríamos decir cuál es el tamaño de los datos, pero considero que una respuesta más amplia sería  que el tamaño debería estar suministrado por nuestros tablespaces (incluyendo los temporales) más nuestros redolog y si la base de datos se encuentra en modo archivelog entonces agregar el tamaño de los directorios que almacenan los archivelogs.

Esta pequeña consulta responde a esta pregunta, de tamaño total de la base de datos, además de aportar alguna información sobre la utilización de los tablespaces.

Tamaño Total Base de Datos

SELECT sum(total) + sum(logs) +  sum(dir_archivelog) TamanoBDD
  FROM  (
  -- Espacio Libre Tablespaces
  select g.tablespace_name TS,
               ROUND(sum(g.bytes) / 1024 / 1024, 2) libre,
               0 total,
               0 logs,
               0 dir_archivelog
          from dba_free_space g
         group by g.tablespace_name
        union all
   --Espacio Total  Tablespaces   
        select f.tablespace_name,
               0,
               ROUND(sum(f.bytes) / 1024 / 1024, 2),
               0,
               0
          from dba_data_files f
         group by f.tablespace_name
        union all
   --Espacio de Tablespaces Temporales    
        SELECT v.TABLESPACE_NAME,
               free_blocks * 8192 / 1024 / 1024 libre,
               round(sum(bytes) / 1024 / 1024, 2) total,
               0,
               0
          FROM v$sort_segment v
          left outer join dba_temp_files t
            on v.TABLESPACE_NAME = t.tablespace_name
         group by v.TABLESPACE_NAME, free_blocks
        union all
  --Espacio de los Redologs     
        select 'REDOLOGS', 0, 0, round(sum(bytes) / 1024 / 1024, 2), 0
          from v$log
        union all
--Espacio del directorio que almacena los Archivelogs
        select 'DIR ARCHIVELOGS',
               0,
               0,
               0,
               to_number(substr(Display_value,
                                1,
                                INSTRC(Display_value, 'G', 1) - 1))
          from v$parameter
         where name = 'db_recovery_file_dest_size')

Con Informacion de uso de Los Tablespaces 
 
SELECT ts nombre_tablespace,
       sum(libre) Espacio_Libre,
       sum(total) Espacio_Total,
       sum(total) - sum(libre) Espacio_usado,
       sum(logs) Espacio_redoLogs,
       sum(dir_archivelog) Espacio_dir_archivelog
 FROM      (
  -- Espacio Libre Tablespace
  select g.tablespace_name TS,
               ROUND(sum(g.bytes) / 1024 / 1024, 2) libre,
               0 total,
               0 logs,
               0 dir_archivelog
          from dba_free_space g
         group by g.tablespace_name
        union all
   --Espacio Total   Tablespace
        select f.tablespace_name,
               0,
               ROUND(sum(f.bytes) / 1024 / 1024, 2),
               0,
               0
          from dba_data_files f
         group by f.tablespace_name
        union all
   --Espacio de Tablespaces Temporales    
        SELECT v.TABLESPACE_NAME,
               free_blocks * 8192 / 1024 / 1024 libre,
               round(sum(bytes) / 1024 / 1024, 2) total,
               0,
               0
          FROM v$sort_segment v
          left outer join dba_temp_files t
            on v.TABLESPACE_NAME = t.tablespace_name
         group by v.TABLESPACE_NAME, free_blocks
        union all
  --Espacio de los Redologs     
        select 'REDOLOGS', 0, 0, round(sum(bytes) / 1024 / 1024, 2), 0
          from v$log
        union all
--Espacio del directorio que almacena los Archivelogs
        select 'DIR ARCHIVELOGS',
               0,
               0,
               0,
               to_number(substr(Display_value,
                                1,
                                INSTRC(Display_value, 'G', 1) - 1))
          from v$parameter
         where name = 'db_recovery_file_dest_size')
 group by ts

Si necesitas mas información histórica acerca del uso de los tablespace, te recomiendo usar las vistas dba_hist_tablespace_stat y dba_hist_tbspc_space_usage que proporciona el AWR

lunes, 2 de enero de 2012

ORA-31634: Job Already Exists - El Trabajo ya existe

Export: Release 10.2.0.3.0
Connected to: Oracle Database 10g Enterprise Edition Release ORA-31634: job already exists
ORA-31664: unable to construct unique job name when defaulted

Este error ocurre generalmente cuando existen trabajos huérfanos de datapump que no se han limpiado de la base de datos

¿Cómo saber donde están esos trabajos?
en la vista dba_datapump_jobs se pueden visualizar (no usar las vistas gv$datapump_job que muestra los trabajos que actualmente están corriendo)

SELECT *  FROM dba_datapump_jobs
WHERE job_name NOT LIKE 'BIN$%'
AND STATE = 'NOT RUNNING'