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'

martes, 13 de diciembre de 2011

Oracle Dead Connection Detection

Oracle Dead Connection Detection (ODCD) es una característica implementada a partir de  SQL *Net 2.1 detecta cuando  una conexión TCP ha terminado inesperadamente liberando los recursos asociados a esta.                                                                    Cuando una conexión es establecida, el SQL*NET lee el archivo de parámetros sqlnet.ora, ubicado en la ruta  $ORACLE_HOME/network/admin , este archivo debe contener el parámetro SQLNET.EXPIRE_TIME que especifica el intervalo de tiempo en minutos, para enviar un paquete de verificación  a las conexiones cliente y/o servidor establecidas y saber si aun siguen activas

cuando el tiempo expira, SQL*NEt del lado del servidor, envía un Paquete de prueba al cliente si el cliente tiene la conexión activa, la prueba se descarta y el temporizador es reiniciado. si el cliente ha terminado anormalmente, el servidor recibe un error del envió del paquete  y el SQL*Net envía una señal al sistema operativo para que libere los recursos asociados a esa conexióny al proceso PMON para que realice la limpieza del proceso y los recursos en la Base de datos.

martes, 23 de agosto de 2011

Error ORA-01843: Not a Valid Month

Al tratar de realizar un import de un esquema

c:\>  imp system/prueba@prueba  file=prueba.dmp  log=prueba.log fromuser=scott touser=tiger
Recibimos el error
IMP-00017: following statement failed with ORACLE error 1843:
" ALTER TABLE "TABLA1" MODIFY ("FECHA" DEFAULT '01-01-2009' )"

IMP-00003: ORACLE error 1843 encountered
ORA-01843: not a valid month

Este error ocurre generalmente por que tenemos configurado el NLS_DATE_FORMAT diferente a como esta la tabla.

Para solucionarlo simplemente configuramos las variables (para sistemas unix)
export NLS_DATE_FORMAT=DD-MM-RRRR
export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252

Si estamos en un sistema operativo windows debemos modificar estas entradas en el regedit :)

miércoles, 6 de julio de 2011

Iniciar y Detener Bases de Datos Oracle Automáticamente

Lo primero que debemos hacer si queremos iniciar y detener nuestras bases de datos Oracle automáticamente es modificar el archivo oratab, en éste archivo se almacena la información de las bases de datos instaladas además de indicar si las instancias deben iniciar automáticamente.


Editar el archivo oratab
editamos el archivo oratab con usuario root
vi  /etc/oratab
editamos la linea TEST:/oracle/app/oracle/10.2.0/db:N y la cambiamos a Y
TEST:/oracle/app/oracle/10.2.0/db:Y

martes, 28 de junio de 2011

Restaurar Base de Datos Master en SQL Server 2000

Mover bases de datos entre servidores en SQL SERVER es generalmente sencillo, pero cuando se trata de la base de datos Master, es un poco más complejo. Aquí va un ejemplo de cómo restaurar la base de datos master en otro servidor.

Vamos a asumir que el SQL SERVER 2000 ya esta instalado en la nueva máquina, y tiene los mismos service packs a nivel de base de datos de la maquina original, ahora seguiremos estos pasos:

1. En la nueva máquina vamos a detener los servicios del SQL SERVER 2000
net stop MSSQLServer

2. Iniciar  el servicio SQL SERVER en modo single-user
sqlservr -c -m

viernes, 13 de mayo de 2011

Matar sesiones de un usuario

En Oracle existen varias formas de Matar una sesión de usuario, Aquí va  un ejemplo de un procedimiento que puede hacerlo, sirve para versiones  10g y  anteriores, recibe como parametro el usuario a cancelar y elimina todas las sesiones

 CREATE OR REPLACE PROCEDURE Matar_una_sesion ( Usuario in varchar2)  AS
Sesion  varchar2(20);
Serial  varchar2(20);
Cursor_Sql integer;
Retorno integer;
Comando VARCHAR2(100);