martes, 21 de diciembre de 2010

Crear Una Base de Datos Oracle 11gR2 en Linux - Parte II

En la primera parte vimos como poder instalar la maquina virtual y la instalacion del sistema operativo Linux. Asi que en esta parte vamos a ver la instalacion de los binarios de Oracle, para en la ultima parte ver la creacion, via un script de sql, de la base de datos.

Instalacion de Binarios de Oracle
Como se menciona en la primera parte de esta entrada, tenemos que verificar los prerequisitos de instalacion, si no lo has hecho te recomiendo que lo verifiques en esta entrada.
  • Como mencionamos en la parte de prerequisitos, configuramos la variable de ambiente, en donde tenemos la ruta donde se va a instalar los binarios (ORACLE_HOME).
  • Una vez que tenemos inicializadas nuestras variables de ambiente, desde tenemos el Software de Oracle que descargamos mencionado en la primera parte, corremos runInstaller para iniciar la instalacion de los binarios.
  • Una vez que empieza el instalador, en mi caso deseleccione la configuracion con MOS (My Oracle Support), de la misma manera deje en blanco el correo electronico
  • En la siguiente parte, tambien le menciono que se brinque las actualizaciones de Software.
  • Ya como uno de los objetivos de esta entrada es la creacion de una base de datos via un script de SQL, en la siguiente seccion vamos a decirle al instalador que unicamente queremos instalar el Software.
  • Para continuar seleccione un tipo de instalacion de una sola instancia
  • Ahora seleccionamos el idioma en que vamos a correr, en mi caso seleccione ingles, este se los dejo a su convenincia.
  • El tipo de instalacion que lleve a cabo fue el de Enterprise Edition, esta es una seleccion que es de acuerdo a sus necesidades y licenciamiento que tienen.
  • En esta parte el instalador verifica lo que es el ORACLE_BASE y el ORACLE_HOME, como estas variables ya las habiamos definido, no hay realmente nada que hacer mas que continuar.
  • En la siguiente parte asignamos los grupos que van a tener permisos para nuestros binarios, en mi caso seleccione al mismo grupo dba, pero puede ser el grupo oinstall que creamos en los prerequisitos.
  • Si ya llegaste a esta parte del instalador y no has verificado los prerequisitos, el instalador te va a hacer mencion de cuales son los prerequisitos que no se cumplen para proseguir con la instalacion.
  • 11gR2 tiene una funcionalidad de crear un script llamado runfixup.sh, que tiene que correr con el usuario root, para corregir todos los prerequisitos necesarios que no tengan que ver con una modificacion directa con un tamaño de disco o instalar paquetes, como por ejemplo los parametros de Kernel necesarios.
  • Una vez que arreglamos todos los prerequisitos necesarios, le damos siguiente y nos lleva a una pantalla de resumen de instalacion,  en donde podemos verificar si queremos hacer algun cambio a nuestra instalacion, si estamos de acuerdo le damos siguiente e inicia la instalacion.
  • Por ultimo, tenemos que correr los scripts que te menciona el instalador, estos se corren con el usuario root.

Conclusion
Como podemos ver es sencilla la instalacion de los binarios, en lo que tenemos que tener cuidado es en haber cumplido los prerequisitos de instalacion, si es asi el caso, vamos a tener una instalacion sin complicaciones. En la ultima parte de esta entrada vamos a ver la creacion de una base de datos via un script de SQL.

viernes, 17 de diciembre de 2010

Requisitos Para Instalar Oracle 11gR2 en Linux x86 para RHEL5

Estos son los requerimientos para poder instalar Oracle 11gR2 en Oracle Linux x86 para RHEL 5. Siempre recomiendo tomar los ultimos valores disponibles en la documentacion oficial de Oracle disponible en este enlace
Si no especifico otro usuario, todos los comando mencionados son con el usuario root asi que debemos tener acceso a ese usuario.

Requisitos de Memoria
  • Por lo menos 1 GB de RAM
    Para verificar el tamaño de tu RAM
    grep MemTotal /proc/meminfo
  • Espacio swap
    Para verificar el tamaño de tu espacio Swap
    grep SwapTotal /proc/meminfo

RAM Disponible Espacion Swap Requerido
Entre 1 GB y 2 GB 1.5 veces el tamaño de la RAM
Entre 2 GB y 16 GB Igual al Tamaño de la RAM
Mas que 16 GB 16 GB

Requisitos de Hardware
  • 1 GB de espacio en el directorio /tmp
    Para determinar el espacio libre
    df -h /tmp
Tipo de Instalacion Requerimientos de Archivos SW (GB)
Enterprise Edition 3.95
Standard Edition 3.88

Tipo de Instalacion Requerimientos Para Datafiles (GB)
Enterprise Edition 1.7
Standard Edition 1.5

Requisitos de Software
  • Determinar la distribucion y version de Linux instalado. Acuerdate que estamos instalando una version de RHEL 5 con un kernel 2.6.32
    cat /proc/version
  • Kernel Requerido
    Para Asianux Server 3, Oracle Linux 5, y Red Hat Enterprise Linux 5:
    2.6.18 o posterior
    Para verificar que la version requerida del Kernel esta instalada
    uname -r
  • Paquetes Requeridos
    Todos son la version mencionada o posterior.
    binutils-2.17.50.0.6
    compat-libstdc++-33-3.2.3
    elfutils-libelf-0.125
    elfutils-libelf-devel-0.125
    elfutils-libelf-devel-static-0.125
    gcc-4.1.2
    gcc-c++-4.1.2
    glibc-2.5-24
    glibc-common-2.5
    glibc-devel-2.5
    glibc-headers-2.5
    kernel-headers-2.6.18
    ksh-20060214
    libaio-0.3.106
    libaio-devel-0.3.106
    libgcc-4.1.2
    libgomp-4.1.2
    libstdc++-4.1.2
    libstdc++-devel-4.1.2
    make-3.81
    numactl-devel-0.9.8.i386
    sysstat-7.0.2
    Para verificar si tienes el paquete instalado, utiliza el siguiente comando
    rpm -q nombre_paquete

    Ejemplo
    rpm -q binutils

Parametro Valor Minimo Archivo
semmsl
semmns
semopm
semmni
250
32000
100
128
/proc/sys/kernel/sem
shmall 2097152 /proc/sys/kernel/shmall
shmmax Ya sea 4 GB - 1 byte, or la mitad del tamaño de la memoria fisica (en bytes), El que sea Menor.
Default: 536870912

/proc/sys/kernel/shmmax
shmmni 4096 /proc/sys/kernel/shmmni
file-max 6815744 /proc/sys/fs/file-max
ip_local_port_range Minimo: 9000
Maximo: 65500
/proc/sys/net/ipv4/ip_local_port_range
rmem_default 262144 /proc/sys/net/core/rmem_default
rmem_max 4194304 /proc/sys/net/core/rmem_max
wmem_default 262144 /proc/sys/net/core/wmem_default
wmem_max 1048576 /proc/sys/net/core/wmem_max
aio-max-nr Maximo: 1048576 /proc/sys/fs/aio-max-nr

Para ver los valores de los parametros del Kernel, utiliza los comandos mencionados en la siguiente tabla

Parametro Comando
semmsl, semmns, semopm, y semmni # /sbin/sysctl -a | grep sem
shmall, shmmax, y shmmni # /sbin/sysctl -a | grep shm
file-max # /sbin/sysctl -a | grep file-max
ip_local_port_range # /sbin/sysctl -a | grep ip_local_port_range
rmem_default # /sbin/sysctl -a | grep rmem_default
rmem_max # /sbin/sysctl -a | grep rmem_max
wmem_default # /sbin/sysctl -a | grep wmem_default
wmem_max # /sbin/sysctl -a | grep wmem_max

  • Si cualquiera de los valores mencionados es menor a los valores recomendados, crea o edita el archivo /etc/sysctl.conf y añade o edita las lineas mencionadas abajo: 
    fs.aio-max-nr = 1048576
    fs.file-max = 6815744
    kernel.shmall = 2097152
    kernel.shmmax = 536870912
    kernel.shmmni = 4096
    kernel.sem = 250 32000 100 128
    net.ipv4.ip_local_port_range = 9000 65500
    net.core.rmem_default = 262144
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 1048586
  • Utiliza el siguiente comando para cambiar los valores actuales que tiene el kernel
    /sbin/sysctl -p
  • El siguiente comando te ayuda para confirmar que los parametros estan correctos
    /sbin/sysctl -a
Crear el usuario Oracle y sus grupos
Tomando en cuenta de que esta es una instalacion nueva vamos a crear los siguientes grupos
  • /usr/sbin/groupadd dba
  •  /usr/sbin/groupadd oinstall
A continuacion vamos a vamos a crear el usuario oracle
  • /usr/sbin/useradd -g oinstall -G dba oracle 
  • Para cambiar el password del usuario, vamos a usar el siguiente comando
    passwd oracle
Recursos Limites Para el Usuario que va a instalar los binarios
Estos son los valores recomendados por Oracle
Recurso Limite del Shel Recurso Limite Soft Limite Hard
Descriptores de Open file
nofile

por lo menos 1024

por lo menos 655
Numero de procesos disponibles a un solo usuario
nproc

por lo menos 2047

por lo menos 16384
Tamaño del segmento stack del proceso
stack

por lo menos 10240 KB

por lo menos 10240 KB, y a lo mas 32768 KB

  • Para verificar los recursos limites del usuarioEntra como el usuario que va a hacer la instalacion, en nuestro caso es el usuario Oracle
  • Verifica los limites soft y hard para los descriptores de archivo. Por ejemplo:
    $ ulimit -Sn
     4096
    $ ulimit -Hn
    65536
  • Verifica los limites soft y hard para los numeros de procesos disponibles al usuario. Por ejemplo:
    $ ulimit -Su
    2047
    $ ulimit -Hu
    16384
  • Verifica los limites soft y hard para los segmentos stack.Por ejemplo:
    $ ulimit -Ss
    10240
    $ ulimit -Hs
    32768
  • Si es necesario, actualiza los recursos limites en el archivo de configuracion /etc/security/limits.conf . Por ejemplo, añade las siguientes lineas al archivo /etc/security/limits.conf file:
    oracle              soft    nproc   2047
    oracle              hard    nproc   16384
    oracle              soft    nofile  1024
    oracle              hard    nofile  65536
    oracle              soft    stack   10240
Crear los Directorios Necesarios
En mi caso, yo rompo un poco de la arquitectura OFA, pero sigue teniendo mucho sentido, creo un mount point y dentro de ese creo todos los directorios necesarios para mi base de datos. En mi caso, uso el directorio de oracle para instalar los binarios.
oracle@localhost /mount
oracle $ ls
arch01     copy01     dba01      dump01     oracle   u01

Configurando la variable de ambiente
Aqui yo tambien me alejo un poco de lo que recomienda Oracle. Lo que hago es utilizar en el .profile del usuario oracle uso lo siguiente:

set -o vi
stty erase "^?"
export PS1="
`echo ${LOGNAME}`@`hostname` \${PWD}
`who am i | awk '{print $1}'` $ "
export EDITOR=vi
PATH=$HOME/bin:
$PATH
export PATH
 De ahi en el directorio $HOME/bin creo una variable de ambiente que refleje ahora si las necesidades de mi instancia, ya que puedo definir una variable distinta si tengo tengo otras versiones de Oracle en mi servidor.

ORACLE_HOME=/mount/oracle/product/11.2.0.2v1
DATA_PUMP_DIR=/mount/copy01/export01/TESTDB/
ORACLE_SID=TESTDB
ORACLE_BASE=/mount/oracle
export ORACLE_HOME ORACLE_SID ORACLE_BASE DATA_PUMP_DIR
ORACLE_CONFIG_HOME=/mount/oracle/product/cfg/TESTDB
export ORACLE_CONFIG_HOME
ADR_HOME=/mount/dump01/oracle/TESTDB/diag/rdbms/testdb/TESTDB
export ADR_HOME
SID_HOME=/mount/dba01/oracle/TESTDB
export SID_HOME
DBA_HOME=/mount/dba01/oracle
export DBA_HOME
TNS_ADMIN=$ORACLE_HOME/network/admin
export TNS_ADMIN
ORACLE_TERM=vt100
export ORACLE_TERM
Conclusion
Aqui no hay mucho que concluir, mas que les vuelvo a decir que esto es solo una guia, para cualquier cambio de los requisitos, consulten la documentacion oficial

miércoles, 15 de diciembre de 2010

Crear Una Base de Datos Oracle 11gR2 en Linux - Parte I

Algo de lo que no me habia dado fijado es que este blog siendo orientado a los principiantes como DBAs, no habia hecho una entrada de como crear un ambiente de pruebas y hacer una instalacion del sistema operativo Linux, por esta razon esta entrada la voy a dividir en dos o tres partes, ya que nos va a tomar algo de tiempo para poder hacerla.

Para empezar estos son los componentes que vamos a utilizar, antes de que instales cualquiera de los componentes, acuerdate de leer cada una de las licencias y sus restricciones de uso,asi como apegarte a ellas.
La instalacion de VMWare Server no la voy a cubrir, ya que es una instalacion muy directa. Asi que pasamos directo a la instalacion de Linux.

Te recomiendo que antes de empezar a hacer cualquier instalacion, leas la entrada que hice para los requerimientos de la instalacion de Oracle, ya que esto te puede dar una idea del espacio y requerimiento de memoria que le tienes que asignar a la maquina virtual.

Instalacion de Linux
  • Al seleccionar crear una Maquina virtual en el VMWare Server Console, te aparecera la siguiente pantalla en donde le damos un nombre de "Linux RHEL 5"

  • Ahora vamos a seleccionar el tipo de sistema operativo Linux, y la version RHEL 5 Linux 32 Bit

  • En este caso, por las limitaciones de la memoria, le voy a asignar 1.5g de memoria, tomando en cuenta que para la instalacion de 11gR2 necesitamos como minimo 1g de memoria.
  •  Vamos a crear un Disco Virtual, en mi caso lo cree con 20g de capacidad, el tamaño de este se los dejo a ustedes, pero si es menor a 20g podrian quedar limitados en lo que puedan hacer en el SO.



  • El tipo de Conexion de Red es de tipo NAT
  •  Como parte final de la configuracion de la maquina virtual, creamos un CD/DVD drive y seleccionamos que sea a partir de un archivo ISO, cargando el primer archivo ISO de la distibucion de Linux para este.
  •  Una vez que acabamos de configurar nuestra maquina virtual, la iniciamos, asegurandonos que el CD/DVD drive tiene cargado el primer archivo ISO de la distribucion Linux.
  •  En el siguiente paso seleccionamos el idioma, en mi caso seleccione Ingles, pero pueden seleccionar Español.
  •  El tipo de teclado debe de ser correspondiente a la maquina donde lo estan instalando, en mi caso es America Latina, una vez que le damos siguiente nos pide inicializar la nueva particion, esta es la misma que definimos en la maquina virtual.

  •  A continuacion definimos el tipo dispositivo de Red, asi como el nombre del Host y los DNS, en mi caso es como se muestra en la pantalla.

  • En la penultima pantalla, nos permite seleccionar los componentes adicionales que queremos instalar, por el momento lo deje por default ya que despues vamos a instalar las librerias requeridas necesarias para poder instalar Oracle.
  • Y por ultimo iniciamos la instalacion, cada vez que nos solicite tenemos que cambiar el dispositivo CD/DVD al siguiente archivo ISO correspondiente.

Conclusion
En esta primera parte vimos lo sencillo que es una instalacion y configuracion estandar de una maquina virtual, asi como la distribucion Linux. En la Parte II vamos a ver la configuracion e instalacion del software de Oracle y en la Parte III vamos a ver como crear una Base de Datos con un script de SQL.


lunes, 13 de diciembre de 2010

Cambiar el DBID de Nuestra Instancia

Algo para los que manejamos respaldos en RMAN con un catalogo y constantemente estamos clonando Bases de Datos via tradicional, no via RMAN, el DBID es algo de lo que tenemos que estar conscientes para poder registrar nuestras BDs en el mismo catalogo de RMAN donde se encuentra la BD fuente de la clonacion.

Si nunca has manejado un catalogo de RMAN, el DBID no era de gran importancia ya que si queriamos renombrar nuestra instancia, lo unico que teniamos que hacer era recrear el control file, y listo, nuestra base de datos tenia un nuevo nombre, pero hay que saber que el DBID se mantenia igual.
Oracle tiene una utileria llamada DBNEWID para poder cambiar el DBID de la instancia asi como el nombre de la instancia, y esta utileria tiene unas cuantas ramificaciones que hay que saber:
  • En el momento que cambiamos el DBID, cualquier respaldo y archived redo logs anterior a este proceso no nos va a servir para recuperar nuestra base de datos, se vuelven obsoletos para esta version de la base de datos, ya que a la vez tenemos que abrir la base de datos con la opcion de resetlogs, el cual recrea los online redo logs y regresa la secuencia a 1.
  • Si nada mas cambiamos el DBNAME, los respaldos y archived redo logs siguen sirviendonos ya que no tenemos que abrir la base de datos con open resetlogs, lo unico que hay que tomar en cuenta que tenemos que cambiar el parametro DB_NAME.
  • Si cambiamos el nombre con la utileria DBNEWID, hay que tomar en cuenta que no cambia el nombre unico global, GLOBAL_NAME, este lo cambiamos via el comando ALTER DATABASE
  • Si cambiamos el DBID, vamos a tener que recrear el password file.
Pasos para cambiar el DBID.
  1.  Asegurarnos que tenemos un buen respaldo de nuestra base de datos, ya que en este proceso vamos a abrir la base de datos con resetlogs y éste, en el peor de los casos,  va a ser nuestro punto a restaurar.
  2. Para poder hacer este proceso, la base de datos tiene que estar en modo MOUNT.

    oracle@localhost [TESTDB] /mount/oracle
    root $ sqlplus
    SQL*Plus: Release 11.2.0.2.0 Production on
    Mon Dec 13 07:38:14 2010
    Copyright (c) 1982, 2010, Oracle.  
    All
     rights reserved.
    Enter user-name: /as sysdba
    Connected to:

    Oracle Database 11g Enterprise Edition
    Release 11.2.0.2.0 - 64bit Production
    With the OLAP, Data Mining and Real
    Application Testing options

    TESTDB >shutdown immediate
    TESTDB >startup mount

    ORACLE instance started.

    TESTDB >exit

  3. En la linea de comandos vamos a llamar a la utileria DBNEWID, que se encuentra en $ORACLE_HOME/bin.

    oracle@localhost [TESTDB] /mount/oracle
    root $ nid target=sys/sys_password@TESTDB
    DBNEWID: Release 11.2.0.2.0 - Production on 
    Mon
     Dec 13 07:39:04 2010
    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  
    All
     rights reserved.

    Connected to database TESTDB (DBID=3071275785)
    Connected to server version 11.2.0

    Control Files in database:
        /mount/u01/oracle/TESTDB/control/control01.ctl
        /mount/u01/oracle/TESTDB/control/control02.ctl
        /mount/u01/oracle/TESTDB/control/control03.ctl

    Change database ID of database TESTDB? (Y/[N]) => Y

    Proceeding with operation
    Changing database ID from 3071275785
    to 3073734488
        Control File /mount/u01/oracle/TESTDB/control/control01.ctl - modified
        Control File /mount/u01/oracle/TESTDB/control/control02.ctl - modified
        Control File /mount/u01/oracle/TESTDB/control/control03.ctl - modified

        Datafile /mount/u01/oracle/TESTDB/data/system.db - dbid changed

        Datafile /mount/u01/oracle/TESTDB/data/undotbs1.db - dbid changed

        Datafile /mount/u01/oracle/TESTDB/data/sysaux.db - dbid changed

        Datafile /mount/u01/oracle/TESTDB/data/users01.db - dbid changed

        Datafile /mount/u01/oracle/TESTDB/data/temp01.db - dbid changed

        Control File /mount/u01/oracle/TESTDB/control/control01.ctl - dbid changed

        Control File /mount/u01/oracle/TESTDB/control/control02.ctl - dbid changed

        Control File /mount/u01/oracle/TESTDB/control/control03.ctl - dbid changed

        Instance shut down

    Database ID for database TESTDB changed
    to 3073734488.
    All previous backups and archived redo logs
    for this database are unusable.
    Database has been shutdown, 
    open
     database with RESETLOGS option.

    Succesfully changed database ID.
    DBNEWID - Completed succesfully.
  4. Una vez que termino la utileria, hay que abrir la base de datos en modo MOUNT

    oracle@localhost [TESTDB] /mount/oracle
    root $ sqlplus
    SQL*Plus: Release 11.2.0.2.0 Production on
    Mon Dec 13 07:39:28 2010

    Copyright (c) 1982, 2010, Oracle.  
    All
     rights reserved.

    Enter user-name: /as sysdba
    Connected to an idle instance.

    TESTDB >startup mount
    ORACLE instance started.

    Database mounted.
  5. Ahora tenemos que abrir la base de datos con la opcion RESETLOGS, es recomendable que despues de que la base de datos este abierta, tengamos que hacer un respaldo completo de nuestra base de datos.
    TESTDB >alter database open resetlogs;

    Database altered.
  6. Por ultimo, si quieres revisar el cambio del DBID puedes hacer el siguiente query
    TESTDB >select DBID,name from v$database;

          DBID NAME
    ---------- ---------------------------
    3073734488 TESTDB
Conclusion
Esta utileria de Oracle es muy util para cuando hemos clonado una BD via un respaldo caliente o frio que no fue con RMAN, ya que RMAN hace este paso de manera implicita. Lo unico es que es una utileria muy facil de usar pero a su vez muy peligrosa ya que nos puede dejar sin un respaldo util para nuestras BDs.

martes, 30 de noviembre de 2010

Tablespace Temporal y el error ORA-01652

Uno de los errores mas odiados por cualquier programador, es el ORA-01652, esto es por que muchos de ellos no alcanzan a comprender cual es la causa de este, para muchos programadores lo atribuyen a un error de la Base de datos y sencillamente piensan en añadir mas espacio al tablespace temporal, cuando en muchas de las ocasiones es causado por ellos mismos al tener operaciones de tipo SORT (GROUP BY, ORDER BY) que estan causando este error.

Para comprender un poco mas de que se trata este error, primero hay que comprender que es el tablespace Temporal (Temporary Tablespace).
El tablespace temporal contiene datos en transito que permanecen unicamente por la duracion de la sesion, esto significa que una vez que la sesion termina, estos datos dejan de existir. Un tablespace temporal ayuda a mejorar la concurrencia de multiples operaciones tipo SORT que no caben en la memoria.
Un tablespace temporal se usa para guardar lo siguiente
  • Tablas temporales e indices temporales
  • LOBs temporales
  • Resultados temporales de tipo SORT
  • Arboles B temporales
Los tablespaces temporales utilizan un tipo de segmento llamado segmento temporal, pero algo importante a saber es que dentro de un tablespace temporal, todas las operaciones tipo SORT comparten un solo segmento SORT. Un segmento SORT es creado por la primer sentencia que, despues de iniciar la base de datos utiliza el tablespace temporal para hacer una operacion tipo SORT y es liberado unicamente cuando la base de datos es apagada.
Ya que sabemos esto, tambien es importante saber que cualquier escritura a un segmento SORT no genera ni redo o undo, este se debe a que los datos que existen en el tablespace temporal no necesitan existir mas alla que para la sesion que los creo.

Una sentencia de SQL puede hacer multiples operaciones de tipo SORT y una sesion puede tener multiples sentencias de SQL activas a la vez, cada una con la potencia de tener multiples operaciones SORT a disco. Cuando los resultados de una operacion SORT a disco ya no son necesitados, los bloques en el segmento SORT son marcados como "no utilizados" y pueden ser usados por otra operacion tipo SORT.

Aqui es donde entra el error ORA-01652, ya que una operacion tipo SORT va a fallar con este error cuando no existen bloques "no utilizados" en el segmento SORT o cuando el tablespace temporal no tenga espacio suficiente para alojar un extent mas.

Una vez que suceda cualquiera de los dos casos anteriores, se va a registrar este error en el log de la base de datos, pero el verdadero problema viene en que, solamente se registra el error, mas no la sentencia que causo el error.

De aqui lo mas recomendable es tener un monitoreo activo, podemos crear en Grid control/database control una metrica con el query que tenemos abajo

select count(1) from (
select trunc(100*(u.tot/d.tot),2) PCTUSED from
     (select sum(u.blocks) tot from v$tempseg_usage u) u,
     (select sum(d.blocks) tot from dba_temp_files d) d )
where PCTUSED > 50;


Si PCTUSED es mayor a 50, nos va a permitir ingresar a la base de datos y poder detectar que sesion es la que esta haciendo una operacion de tipo SORT mayor y de ahi poder detectar la sentencia de SQL que esta consumiendo un segmento de tipo SORT mayor.

Este query de abajo no me pertenece, y no tomo credito por el, de la misma manera debe de ser revisado y ejecutado en un ambiente de prueba antes de ejecutarlo en produccion , me lo encontre en internet hace rato, pero es el que utilizo para hacer una busqueda de las sesiones y los Mbs de sort que estan usando

--------Temp Space Usage
column SID_SERIAL format a15
column OSUSER format a15
column USERNAME format a15
column MODULE format a10
column PROGRAM format a10
column TABLESPACE format a20
set pages 100 lines 130

SELECT   S.sid || ',' || S.serial# sid_serial, S.username, S.osuser, P.spid, S.module,
         S.program, SUM (T.blocks) * TBS.block_size / 1024 / 1024 mb_used, T.tablespace,
         COUNT(*) sort_ops,T.segtype
FROM     v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
WHERE    T.session_addr = S.saddr
AND      S.paddr = P.addr
AND      T.tablespace = TBS.tablespace_name
GROUP BY S.sid, S.serial#, S.username, S.osuser, P.spid, S.module,
         S.program, TBS.block_size, T.tablespace,T.segtype
ORDER BY mb_used,sid_serial
/


Conclusion
Lo que si debemos de saber es que una vez que sucede el error ORA-01652 con un tablespace temporal, lo que tenemos que hacer es identificar que sesion es la que esta consumiendo mas SORT, si la sesion que estaba consumiendo mas SORT desaparece , no podremos saber que sentencia de SQL estaba consumiendo nuestra tablespace temporal, de ahi que lo mejor que debemos y tenemos que hacer es tener un monitoreo proactivo no reactivo ante esta situacion.

miércoles, 24 de noviembre de 2010

Respaldos con RMAN - Parte II

En la entrada anterior (Parte I) platicamos un poco de los componentes basicos de RMAN para poder hacer un respaldo.
En esta entrada vamos a configurar un esquema de Catalogo para recuperacion, asi como conectarnos a el y hacer un respaldo de nuestra base de datos.

Conectarnos a RMAN
Existen varias maneras de conectarnos a RMAN, aqui hay varias, la que vamos a utilizar es la tercera, ya nos vamos a estar conectando a un esquema de catalogo de recuperacion.
  • rman TARGET /                       # Autorización via OS
  • rman TARGET SYS@prod NOCATALOG      # RMAN pregunta por el password de SYS de la BD prod
  • rman TARGET / CATALOG rco@catdb     # RMAN pregunta por el password de rco de la BD catdb
Configuracion del esquema de Catalogo de Recuperacion
Este esquema lo vamos a crear en una instancia distinta a la que queremos respaldar, en este caso creamos previamente la BD va a llevar el nombre de catdb y el esquema de rco.
  1. En la BD catdb, nos conectamos via SQL*Plus y vamos a crear un tablespace llamado "catalogo_recup"
    CREATE TABLESPACE "catalogo_recup"
    DATAFILE ' /mount/u01/oracle/PROD/data/catalogo_recup01.dbf'
    SIZE 100M
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO
    /
  2. Todavia en catdb, vamos a crear el esquema rco, asi como definir el tablespace defualt, asignarle una cuota indefinida y por ultimo asignarle el rol de RECOVERY_CATALOG_OWNER
    CREATE USER rco IDENTIFIED BY rco
    DEFAULT TABLESPACE catalogo_recup
    TEMPORARY TABLESPACE temp
    QUOTA UNLIMITED ON catalogo_recup
    /
    GRANT RECOVERY_CATALOG_OWNER TO rco
    /
  3. Una vez que creamos el esquema rco, nos salimos del ambiente de SQL*Plus y nos vamos a conectar con el cliente de RMAN al esquema que acabamos de crear, mencionando que este es un catalogo y vamos a crear el catalogo en este esquema.
    rman catalog rco/rco@catdb
    Recovery Manager: Release 10.2.0.4.0 - Production on Wed Nov 24 06:07:39 2010
    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    connected to recovery catalog database

    RMAN> create catalog;

    recovery catalog created

    RMAN> exit
  4. Algo que es importante saber, cuando registramos dos o mas BDs en el catalogo, es necesario que cada una de estas tengan un identificador unico, este es manejado por Oracle, y es el DBID, que lo podemos encontrar en la vista de v$database
    prod >select DBID from v$database;

          DBID
    ----------
     949818943
    Si quieres registrar otra base de datos que tenga el mismo DBID, lo vas a tener que hacer en otro catalogo o vas a tener que cambiar el DBID de la base de datos con la utileria de Oracle $ORACLE_HOME/bin/nid (DBNEWID), que esto lo veremos en otra entrada, pero por lo pronto puedes ir a la documentacion oficial de como utilizar esta.
  5. Lo ultimo que nos falta de hacer es registrar la base de datos prod en el catalogo que acabamos de crear, esto lo hacemos desde el cliente de rman, conectandonos a la BD que queremos respaldar y al catalogo que vamos a utilizar.

    rman target system/system_password@prod catalog rco/rco@catdb

    RMAN> register database;
    Una vez que esta registrada la BD prod, podemor correr el comando report schema, para verificar que el registro se llevo a cabo.
    RMAN> report schema;


    Report of database schema for database with db_unique_name prod

    List of Permanent Datafiles
    ===========================
    File Size(MB) Tablespace           RB segs Datafile Name
    ---- -------- -------------------- ------- ------------------------
    1    500      SYSTEM               ***     /mount/u01/oracle/prod/data/system.dbf
    2    800      UNDOTBS1             ***     /mount/u01/oracle/prod/data/undotbs1.dbf
    3    475      SYSAUX               ***     /mount/u01/oracle/prod/data/sysaux.dbf
    4    100      USERS                ***     /mount/u01/oracle/prod/data/users01.dbf

    List of Temporary Files
    =======================
    File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
    ---- -------- -------------------- ----------- --------------------
    1    5000     TEMP                 5000        /mount/u01/oracle/prod/data/temp01.dbf
Respaldando nuestra base de Datos
Una vez configurando nuestro catalog y registrando nuestra BD en el catalogo, existen varias maneras de hacer un respaldo, pero a continuacion es un ejemplo de un respaldo incremental nivel 0, a su vez respaldando el controlfile, los archivelogs y el spfile.
rman target system/system_password@prod catalog rco/rco@catdb
Recovery Manager: Release 11.2.0.2.0 - Production on Wed Nov 24 23:30:21 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: prod (DBID=949818943)
connected to recovery catalog database
RMAN> RUN
2> {
3> ALLOCATE CHANNEL CH1 DEVICE TYPE DISK
4>  FORMAT '/mount/copy01/prod/oracle/prod/incr/%d_HOT_%M%D%Y_%p_%s';
5>  BACKUP AS COMPRESSED BACKUPSET
6>  INCREMENTAL LEVEL = 0
7>  DATABASE TAG prod_HOTINCR_1124_2321;
8>  BACKUP FORMAT '/mount/copy01/prod/oracle/prod/control/%d_%M_%D_%Y_%t.ctl'
9>  CURRENT CONTROLFILE
10>  TAG prod_CONTROLFILE_1124_2321;
11>  BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL TAG prod_ARCH_1124_2321 DELETE INPUT;
12>  BACKUP SPFILE;
13> }

released channel: ORA_DISK_1
allocated channel: CH1
channel CH1: SID=151 device type=DISK

Starting backup at 24-NOV-10
channel CH1: starting compressed incremental level 0 datafile backup set
channel CH1: specifying datafile(s) in backup set
input datafile file number=00002 name=/mount/u01/oracle/prod/data/undotbs1.dbf
input datafile file number=00001 name=/mount/u01/oracle/prod/data/system.dbf
input datafile file number=00003 name=/mount/u01/oracle/prod/data/sysaux.dbf
input datafile file number=00004 name=/mount/u01/oracle/prod/data/users01.dbf
channel CH1: starting piece 1 at 24-NOV-10
channel CH1: finished piece 1 at 24-NOV-10
piece handle=/mount/copy01/prod/oracle/prod/incr/prod_HOT_11242010_1_10 tag=prod_HOTINCR_1124_2321 comment=NONE
channel CH1: backup set complete, elapsed time: 00:02:35
channel CH1: starting compressed incremental level 0 datafile backup set
channel CH1: specifying datafile(s) in backup set
including current control file in backup set
including current SPFILE in backup set
channel CH1: starting piece 1 at 24-NOV-10
channel CH1: finished piece 1 at 24-NOV-10
piece handle=/mount/copy01/prod/oracle/prod/incr/prod_HOT_11242010_1_11 tag=prod_HOTINCR_1124_2321 comment=NONE
channel CH1: backup set complete, elapsed time: 00:00:01
Finished backup at 24-NOV-10

Starting backup at 24-NOV-10
channel CH1: starting full datafile backup set
channel CH1: specifying datafile(s) in backup set
including current control file in backup set
channel CH1: starting piece 1 at 24-NOV-10
channel CH1: finished piece 1 at 24-NOV-10
piece handle=/mount/copy01/prod/oracle/prod/control/prod_11_24_2010_735952466.ctl tag=prod_CONTROLFILE_1124_2321 comment=NONE
channel CH1: backup set complete, elapsed time: 00:00:01
Finished backup at 24-NOV-10

Starting backup at 24-NOV-10
current log archived
channel CH1: starting compressed archived log backup set
channel CH1: specifying archived log(s) in backup set
input archived log thread=1 sequence=250 RECID=487 STAMP=735952469
channel CH1: starting piece 1 at 24-NOV-10
channel CH1: finished piece 1 at 24-NOV-10
piece handle=/mount/copy01/prod/oracle/prod/incr/prod_HOT_11242010_1_13 tag=prod_ARCH_1124_2321 comment=NONE
channel CH1: backup set complete, elapsed time: 00:00:01
channel CH1: deleting archived log(s)
archived log file name=/mount/arch01/oracle/DBADG/prod_250_1_735160286.dbf RECID=487 STAMP=735952469
Finished backup at 24-NOV-10

Starting backup at 24-NOV-10
channel CH1: starting full datafile backup set
channel CH1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel CH1: starting piece 1 at 24-NOV-10
channel CH1: finished piece 1 at 24-NOV-10
piece handle=/mount/copy01/prod/oracle/prod/incr/prod_HOT_11242010_1_14 tag=TAG20101124T231431 comment=NONE
channel CH1: backup set complete, elapsed time: 00:00:01
Finished backup at 24-NOV-10
released channel: CH1

RMAN> exit
Recovery Manager complete.
Conclusión
RMAN es una herramienta que ha evolucionado a traves de las versiones de Oracle, y que hoy en dia es una manera recomendable de tener un punto de respaldo de nuestras BDs, asi como ayudarnos para cuando tenemos un bloque corrupto y hasta verificar si el respaldo sirve o no. Te recomiendo que pruebes RMAN lo antes posible y le saques todo el jugo que se pueda.

Respaldos con RMAN - Parte I

El dia de hoy me encontre un blog en donde mencionaba la mejor manera de hacer un respaldo, cuando lo empecé a leer , lo primero que menciona es crear varios scripts, uno para definir donde de encuentran nuestros datafiles, otro donde se encuentran nuestros controlfiles y otro que hace lo corre todo de modo serial, y me dejo pensando en que la persona que escribio este blog, nunca escucho de que Oracle tiene una herramienta llamada RMAN, que para lo que sirve es exactamente ahorrarnos estos pasos y a la vez brindarnos una seguridad de que nuestros respaldos sirven.
Esta entrada la dividi en varias partes, ya que aunque es una herramienta bastante sencilla de utilizar, es de gran importancia saber de que se compone, ya que eso es lo que nos va a permitir tener la seguridad de los respaldos que y puntos de recuperacion de nuestra base de datos.

Componentes Basicos
Aunque RMAN tiene mas componentes de los que voy a mencionar, los siguientes yo los consideraria como los minimos necesarios para poder tener una infraestructura segura para nuestros respaldos.
  • Cliente de RMAN
    El cliente de RMAN es la aplicacion de Oracle que maneja las operaciones de respaldos y recuperacion, este puede utilizar Oracle Net para conectarse a traves de la red, asi que puede encontrarse en un servidor distinto a la Base de Datos primaria.
  • Base de Datos Primaria (Target Database)
    Es la base de Datos que contiene los controlfiles,datafiles y en dado caso los archived redo logs que RMAN va a respaldar o restaurar.
  • Base de Datos de Catalogo y Esquema de Catalogo (Recovery and Schema Catalog Database)
    Este componente es la base de datos que contiene el catalogo de recuperacion, este catalogo contiene metadata que RMAN utiliza para respaldar y recuperar la base de datos primaria.
    Aunque este componente no es obligatorio, ya que podemos respaldar utilizando nada mas el controlfile,si diria que es una buena practica tenerlo en nuestro ambiente de respaldos y recuperacion.
  • Manejador de Medios (Media Manager)
    Para ponerlo de manera sencilla,este manejador es una aplicacion de un vendor para mandar nuestros respaldos a cinta, como por ejemplo Netbackup o Tivoli.
Canales de RMAN
Una de las cosas mas importantes a entender es que el cliente de RMAN no hace los respaldos, restauraciones o recuperaciones, si no lo que hace es asigna sesiones de servidor en la Base de Datos Primaria y las dirige para que estas hagan las operaciones correspondientes.
En Unix un canal es un proceso de servidor, en Windows es un thread dentro del servicio de la Base de Datos.
En la figura que sigue puedes ver un pequeño ejemplo de como funcionan estos, estos canales son los que cuando hagamos nuestros respaldos, podamos hacer un respaldo en paralelo.
Algo importante a saber, los dispositivos soportados por RMAN para respaldos son disco y SBT (System Backup to Tape), un SBT es manejado por un vendor y normalmente estan conformadas por las librerias de cinta y los drives de cinta.

Una vez que logramos comprender lo minimo necesario de la arquitectura de RMAN, en la siguiente entrada (Parte II) vamos a ver directamente como configurar nuestro ambiente de respaldo de RMAN, incluyendo la base de datos de catalogo y como hacer respaldos desde RMAN.

jueves, 11 de noviembre de 2010

Un Bloque corrupto (ORA-01578) y como repararlo con RMAN en 11g

Uno de los errores mas odiados por cualquier DBA es el ORA-01578, un bloque corrupto en nuestra base de datos, y por que de los mas odiados, por que si no tienes un buen respaldo de tus datos, significa tener perdida de datos y tratar de explicar eso a un cliente no es nada facil.
El buen sentido comun te dice que toda base de datos de produccion debe de tener un respaldo, y mil veces mejor si este es en la herramienta de Oracle RMAN, ya que poder recuperar un bloque sin tener que restaurar el datafile, o tener que restaurar tu respaldo a una BD temporal y de ahi tener que exportar/importar tus datos, es una muy buena manera de reducir nuestro MTTR (Mean Time To Recover).
Vamos a poner en practica como poder hacer esto con RMAN y 11g.
Previo a empezar este ejercicio, debemos de tener un hot backup de nuestra base de datos y este debe no debe de estar obsoleto.
Para poder hacer este ejercicio, necesitamos corromper un bloque, hago incapie en que esto se debe de hacer un ambiente de pruebas, no en produccion.
Vamos a buscar el bloque que corresponde a la tabla EMPLOYEES de nuestro esquema HR.
TESTDB >SELECT dbms_rowid.rowid_block_number(rowid) from employees where EMPLOYEE_ID=101;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                 205

Una vez que tenemos el bloque, vamos a utilizar el comando "dd" de Unix para corromper el bloque, sabiendo que la tabla de EMPLOYEES se encuentra en el datafile "users01.dbf"
dd if=/dev/zero of=users01.dbf bs=8192 conv=notrunc seek=205 count=1

Ya que corrompimos el bloque, vamos a validar nuestra base de datos con RMAN, y este comando nos va a mostrar que el datafile "users01.dbf" tiene un bloque corrupto.
rman target=/
RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
.
.
.
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
4    FAILED 0              7123         12800           11188245359861
  File Name: /mount/u01/oracle/TESTDB/data/users01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              4683
  Index      0              332
  Other      1              662
Si checamos la vista V$DATABASE_BLOCK_CORRUPTION, vamos a ver que el bloque 205 del archivo 4 se encuentra corrupto
TESTDB >select * from V$DATABASE_BLOCK_CORRUPTION;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE
---------- ---------- ---------- ------------------ ---------------------------
         4        205          1                  0 ALL ZERO

RMAN  en 11g trae una nueva funcionalidad de mostrar que errores tiene nuestra base de datos, relacionados a recuperabilidad, asi como asesorarte que puedes hacer para recuperar tus datos y hasta poder aplicar la opcion que te da.
Con el comando "list failure" podemos ver que error tenemos asi como el detalle de este error.
RMAN> list failure;

List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
402        HIGH     OPEN      11-NOV-10     Datafile 4: '/mount/u01/oracle/TESTDB/data/users01.dbf' contains one or more corrupt blocks


RMAN> list failure 402 detail;

using target database control file instead of recovery catalog
List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
402        HIGH     OPEN      11-NOV-10     Datafile 4: '/mount/u01/oracle/TESTDB/data/users01.dbf' contains one or more corrupt blocks
  Impact: Some objects in tablespace USERS might be unavailable
  List of child failures for parent failure ID 402
  Failure ID Priority Status    Time Detected Summary
  ---------- -------- --------- ------------- -------
  405        HIGH     OPEN      11-NOV-10     Block 205 in datafile 4: '/mount/u01/oracle/TESTDB/data/users01.dbf' is media corrupt
    Impact: Object EMPLOYEES owned by HR might be unavailable

Una vez que detectamos el error, podemos decirle a RMAN que nos asesore con el error detectado.
RMAN> advise failure 402;

List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
402        HIGH     OPEN      11-NOV-10     Datafile 4: '/mount/u01/oracle/TESTDB/data/users01.dbf' contains one or more corrupt blocks

analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=95 device type=DISK
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available

Optional Manual Actions
=======================
no manual actions available

Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Perform block media recovery of block 205 in file 4
  Strategy: The repair includes complete media recovery with no data loss
  Repair script: /mount/dump01/oracle/TESTDB/diag/rdbms/TESTDB/TESTDB/hm/reco_1373000937.hm

Si queremos ver unicamente que recimendacion nos esta haciendo RMAN para este error, podemos utilizar el comando "repair failure preview", este solamente te dara la recomendacion, mas no ejecutara la reparacion.
RMAN> repair failure preview;

Strategy: The repair includes complete media recovery with no data loss
Repair script: /mount/dump01/oracle/TESTDB/diag/rdbms/TESTDB/TESTDB/hm/reco_2285570611.hm

contents of repair script:
   # block media recovery
   recover datafile 4 block 205;

Si estamos satisfechos con lo que nos recomienda Oracle, el comando "repair failure" hara la recuperacion de nuestros datos.
RMAN> repair failure;

Strategy: The repair includes complete media recovery with no data loss
Repair script: /mount/dump01/oracle/TESTDB/diag/rdbms/TESTDB/TESTDB/hm/reco_2285570611.hm

contents of repair script:
   # block media recovery
   recover datafile 4 block 205;

Do you really want to execute the above repair (enter YES or NO)? Y
executing repair script

Starting recover at 11-NOV-10
using channel ORA_DISK_1

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00004
channel ORA_DISK_1: reading from backup piece /mount/copy01/TESTDB/oracle/TESTDB/incr/TESTDB_HOT_11102010_1_11
channel ORA_DISK_1: piece handle=/mount/copy01/TESTDB/oracle/TESTDB/incr/TESTDB_HOT_11102010_1_11 tag=TESTDB_HOTINCR_1110_2321
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:25

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished recover at 11-NOV-10
repair failure complete

Ya que termino de ejecutarse el comando, podemos volver a verificar nuestra BD y veremos que ya no existe el bloque corrupto
RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
.
.
.

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
4    OK     0              7123         12800           11188245359861
  File Name: /mount/u01/oracle/TESTDB/data/users01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              4684
  Index      0              332
  Other      0              661


TESTDB >select * from V$DATABASE_BLOCK_CORRUPTION;


no rows selected

TESTDB >select FIRST_NAME,LAST_NAME from employees where EMPLOYEE_ID=101;

FIRST_NAME
------------------------------------------------------------
LAST_NAME
---------------------------------------------------------------------------
Neena
Kochhar

Conclusion
RMAN y 11g trae una gran funcion para poder apoyarnos en nuestra recuperacion de datos, de la misma manera el tener nuestros respaldos con RMAN nos permite poder recuperarnos de un bloque corrupto con un MTTR muy bajo, ya que no tenemos que hacer una recuperacion completa de nuestra base de datos para unicamente obtener los bloques perdidos.