miércoles, 19 de enero de 2011

Que es un registro tipo Undo

Aqui de nuevo en Oracle en Español, tratando de demistificar a la base de datos para poder entenderla, esta entrada esta un poco larga, ya que voy a tratar de dar una pequeña explicacion de lo que son los registros e información tipo Undo y todo lo que lo rodea.

Primero que nada, debemos conocer lo que es una transaccion.

Que es una Transaccion?
Una transacción es una unidad lógica y atómica de trabajo que contiene una o más sentencias de SQL. Una transaccion agrupa operaciones SQL, de forma que, o a todas las operaciones se le hace un commit, lo que significa que se aplican a la base de datos, o a todas se hace un rollback, lo que significa que se deshacen de la base de datos. Una transaccion debe de tener las propiedades de ACID

Que es un registro Undo?
Basicamente es informacion que es utilizada por Oracle para hacer un rollback (deshacer), a los cambios que hemos hecho a nuestros datos en una transaccion y principalmente tiene los siguientes tres usos:
  • Deshacer los datos en nuestra transaccion cuando ejecutamos el comando ROLLBACK
    Cuando ejecutamos un rollback,los registros de Undo son usados para deshacer los cambios en la Base de Datos a nuestra transaccion que no ha efectuado un commit.
  • Poder tener consistencia de lectura de datos
    Oracle utiliza los registros de tipo Undo para mantener una imagen consistente de los datos, mientras son modificados por otro usuario.
  • Recuperar la Base de Datos
    Los registros de tipo Undo son usados en la recuperacion de la Base de Datos, para deshacer cualquier cambio en nuestros datos a los que no se haya efectuado commit y se encuentre en los datafiles.
Este registro es manejado en un tablespace especial de tipo undo, y puedes ver que tablespace es de tipo undo en la vista dba_tablespaces
TESTDB >select tablespace_name 
from
 dba_tablespaces where contents='UNDO';
TABLESPACE_NAME
------------------------------
UNDOTBS


En este tablespace se van a almacenar unicamente segmentos de tipo undo, que a su vez este segmento esta compuesto de minimo dos undo extents,los segmentos de tipo undo son escritos en ellos de forma circular.

En este tipo de tablespace no podemos almacenar una tabla o un indice, el mismo manejador de base de datos no lo permite. Tambien hay que saber que la base de datos nos permite tener mas de un tablespace de tipo undo pero solamente uno puede estar activo a la vez.

Existe dos tipos de manejo de los registros de undo, ya sea de tipo Manual o Automatico, que el default en 11g es Automatico.En el modo Automatico, los registros de undo son manejados en lo que se conoce como segmentos de undo, en el modo manual, los registros de undo se manejan en segmentos de rollback y no se utiliza el tablespace de tipo undo.

La informacion de tipo undo se divide en tres:
  • Informacion Undo Uncommited o Active (Sin Cometer)
    Da soporte a una transaccion en ejecución, y es requerida si un usuario quiere efectuar un rollback o si la transaccion falla. Este tipo de información nunca es sobreescrita
  • Informacion Undo Commited o Unexpired (Cometida)
    Esta información ya no es requerida por la transacción, pero es necesaria para cumplir con el intervalo de tiempo definida en el UNDO_RETENTION (veremo mas abajo la definicion de este).
  • Informacion Undo Expired (Expirada)
    Esta información ya no es requerida por una transacción y puede ser sobreescrita por la siguiente transacción activa.
Como mencionaba arriba, los registros de undo, tambien nos sirven para mantener la consistencia de lectura de datos,que pasa cuando un query quiere obtener información del registro tipo undo, y esta información ya ha sido sobrescrita, si eso te llega a suceder, vas a ver el siguiente error ORA-01555 Snapshot Too Old . Este error lo que  te esta diciendo es que el query necesita una "fotografia" de los datos a como estaba en un punto pasado y reconstruir esta "fotografia" de datos requiere información del registro tipo undo que ya no se encuentra en él.

Oracle usa una retencion de undo (Undo Retention) manejada en segundos, cuando el tablespace de tipo undo se maneja con la opcion AUTOEXTEND, Oracle retiene la informacion de tipo undo por el tiempo minimo que el parametro UNDO_RETENTION tiene, nada mas que hay un detalle a saber, que si el tablespace ya no tiene suficiente espacio para crecer, va a empezar a utilizar espacio que ocupa la información sin expirar (UNEXPIRED), que esto puede causar un error de tipo ORA-01555.

Ahora que ya sabemos que son, que puedo hacer con esta información?
Vamos a ver un pequeño ejemplo con el usuario hr y vas a poder ver una transacción y el espacio que esta consumiendo de undo.

Primera que nada vamos a verificar el SID tenemos asignado y crear una tabla llamada prueba

TESTDB >select sys_context('USERENV','SID') from dual;
SYS_CONTEXT('USERENV','SID')
----------------------------------------------------------------
69

TESTDB >create table prueba (idprueba number);
Table created.


Con el siguiente query,verificamos que ninguna transacción esta activa en nuestra sesion, el resultado debe de ser un valor nulo.


TESTDB >select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------

Luego creamos un pequeño bloque de pl/sql que inserte datos en la tabla que creamos, y es muy importante que no le des commit


TESTDB >begin
  2  for i in 1..10000 loop
  3  insert into prueba values (i);
  4  end loop;
  5  end;
  6  /
PL/SQL procedure successfully completed.


Volvemos a verificar la transacción, y te vas a dar cuenta que como hicimos un insert y no hemos hecho commit, nos regresa un resultado, significando que a nuestra transacion se le asigno un identificador o XID

TESTDB >select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------
47.29.15324


Estos tres numeros son en el orden en que aparecen:
  • El identificador del segmento undo donde la transaccion registra su informacion undo.
  • El numero de Slot undo en el segmento undo
  • El numero secuencial en el Slot de undo

Pero esta información que te muestro arriba, dado que es util saber, normalmente tenemos que ver transacciones que no nos pertenecen, por eso existe una vista llamada v$transaction, en donde podemos verificar transacciones que esta sucediendo en otra parte. Y aqui vas a encontrar tres campos que se te van a hacer muy familiares

  • XIDUSN.-El identificador del segmento undo donde la transaccion registra su informacion undo.
  • XIDSLOT.-El numero de Slot undo en el segmento undo
  • XIDSQN.-El numero secuencial en el Slot de undo

Con el query que se encuentra abajo, puedes ver la relacion con la sesion y la cantidad de undo en megas que esta utilizando la sesion:


select r.name,s.sid,s.serial#,s.module,
    to_char(s.logon_time, 'mm/dd/yy hh24:mi:ss') as login_time,
    xidusn, xidslot, xidsqn,
    t.used_ublk * to_number(x.value)/(1024*1024) as undo_mb
from v$session s,v$transaction t,v$rollname r,v$parameter x
where s.saddr = t.ses_addr and r.usn = t.xidusn
    and x.name = 'db_block_size';


Rollback Segment      SID,Serial   Module               Login Time            XIDUSN    XIDSLOT     XIDSQN      Undo MB
--------------------- ------------ -------------------- ----------------- ---------- ---------- ---------- ------------
_SYSSMU47_1546937756$ 69,1043      SQL*Plus             01/18/11 18:35:40         47         29      15324        .9141

Conclusion
Conocimos lo que era una transacción, asi como lo que es la definición de undo, de la misma manera que una vez que una transacción inicia, se guarda en un registro tipo undo, la informacion antes de ser cometida (UNCOMMITED) para poder hacer un rollback y tambien para tener consistencia en la lectura de datos una vez que esta fue cometida (COMMITED).

lunes, 10 de enero de 2011

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

Bienvenidos a un nuevo año aqui en Oracle en Español, y para empezar este 2011, vamos a terminar con la serie de crear una base de datos en Linux, para los que llegan directo a esta serie, la Parte I cubre la instalacion de la maquina virtual y el sistema operativo Linux , la Parte II cubre la instalacion de los binarios de Oracle e hicimos una entrada especial para los prerequisitos de la instalacion de los binarios.


Verificar Variable de Ambiente

Aqui tenemos que decidir el nombre que va a tener nuestra instancia, aunque ya es algo que vimos en los prerequisitos, mas vale volver a verificar el nombre, aqui un ejemplo utilizando Korn shell, si utilizas C Shell, usa el comando setenv

  • variable ORACLE_SID
    export ORACLE_SID=TESTDB 
  • variable ORACLE_BASE
    export ORACLE_BASE='/mount/oracle'
  • variable ORACLE_HOME
    export ORACLE_HOME='/mount/oracle/product/11.2.0.2v1'
  • variable PATH
    export PATH=$ORACLE_HOME/bin:$PATH
Crear el archivo de parametros

Aqui esta un ejemplo de un archivo init para que arranques, este no es para nada uno a tener en produccion ya que ese tiene que ser revisado para las necesidades de la instancia, pero para nuestras pruebas, con este es mas que suficiente.Este archivo lo guarde en la siguiente ruta /mount/dba01/oracle/TESTDB/pfile/initTESTDB.ora, tu lo puedes guardar en la ruta que a ti te sirva y lo puedas tener a la mano.

audit_file_dest ='/mount/oracle/dump01/TESTDB/adump'
audit_trail ='db'
compatible ='11.2.0'
control_files = (/mount/u01/oracle/TESTDB/control/control01.ctl,
/mount/u01/oracle/TESTDB/control/control02.ctl)
db_block_size =8192
db_domain =''
db_name ='TESTDB'
db_recovery_file_dest ='/mount/oracle/copy01/flash_recovery_area/TESTDB'
db_recovery_file_dest_size =2G
diagnostic_dest ='/mount/oracle/dump01'
memory_target =1G
open_cursors =300
processes =150
remote_login_passwordfile ='EXCLUSIVE'
undo_tablespace ='UNDOTBS1'

Conectarnos a la base de datos y crear el archivo de parametros binario a partir del archivo initTESTDB.ora

Nos vamos a conectar a la base de datos autenticandonos con el sistema operativo y una vez conectados vamos a crear el archivo binarios (spfile).


$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> CREATE SPFILE
FROM PFILE = '/mount/dba01/oracle/TESTDB/pfile/initTESTDB.ora';

Crear Nuestra Base de Datos

Una vez que creamos nuestro archivo binario de parametros, vamos a levantar la base de datos en modo nomount

SQL> startup nomount;

Ahora vamos a correr el siguiente SQL para crear nuestra base de datos. Vamos a inicializar la instancia con el comando

SQL> CREATE DATABASE TESTDB
   USER SYS IDENTIFIED BY sys_password
   USER SYSTEM IDENTIFIED BY system_password
   LOGFILE GROUP 1 ('/mount/u01/oracle/TESTDB/redo01a.log','/mount/u02/oracle/TESTDB/redo01b.log') SIZE 100M ,
           GROUP 2 ('/mount/u01/oracle/TESTDB/redo02a.log','/mount/u02/oracle/TESTDB/redo02b.log') SIZE 100M ,
           GROUP 3 ('/mount/u01/oracle/TESTDB/redo03a.log','/mount/u02/oracle/TESTDB/redo03b.log') SIZE 100M
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET UTF8
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/mount/u01/oracle/TESTDB/data/system01.dbf' SIZE 500M REUSE
   SYSAUX DATAFILE '/mount/u01/oracle/TESTDB/data/sysaux01.dbf' SIZE 500M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/mount/u02/oracle/TESTDB/data/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/mount/u02/oracle/TESTDB/data/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs1
      DATAFILE '/mount/u01/oracle/TESTDB/data/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

Correr scripts para crear las vistas del Diccionario de Datos

Una vez que la base de datos se haya creado, vamos a correr los siquientes tres scripts para crear las vistas y procedimientos del diccionario de datos, este es un paso obligatorio asi que no te lo saltes, catalog.sql y catproc.sql deben de correr con el usuario sys y los encuentras en $ORACLE_HOME/rdbms/admin, el script pupbld.sql debe de correr con el usuario system y lo encuentras en el directorio $ORACLE_HOME/sqlplus/admin. Aqui un ejemplo de como correrlos:


TESTDB >CONNECT SYS AS SYSDBA
spool catalog.log
@/mount/oracle/product/11.2.0.2v1/rdbms/admin/catalog.sql
spool off
spool catproc.log
@/mount/oracle/product/11.2.0.2v1/rdbms/admin/catproc.sql
spool off
TESTDB >CONNECT SYSTEM
Enter password:
spool pupbld.log
@/mount/oracle/product/11.2.0.2v1/sqlplus/admin/pupbld.sql
spool off

Conclusion
Una vez que ya hemos seguido las ultimas tres entradas,hemos logrado crear una base de datos desde cero, espero que te sirva como ejemplo para poder crear tus base datos de ejemplos y de ahi puedas crear una para produccion.

lunes, 3 de enero de 2011

Ser DBA es el septimo trabajo con mejores expectativas a 10 años

Para nuestros seguidores de este blog de Oracle en Español, me encontre esta nota, segun CNN Money, el puesto de DBA se encuentra en la septima posicion de los mejores trabajos a tener en el 2010, y cuenta con un crecimiento del 20% en los proximos 10 años, asi que no estamos tan errados al haber escogido este camino, pero como dice la nota, una de las cosas en contra, son las llamadas a las 3 de la mañana para resolver algun problema, asi como estar en constante cambio, asi que si no estas listo para dedicarle tiempo a tu trabajo, este puede ser el camino equivocado.

Algunas estadisticas tomadas del articulo de CNN Money

Salario
Salario Promedio en EU
(Con 2 o mas años de Experiencia)
USD $93,000
Salario Maximo en EU USD $129,000
Oportunidades
Crecimiento a 10 años
(2008-2018)
20%
Total de Trabajos en EU
(Actuales)
110,000

Para seguir leyendo y conocer las fuentes de los numeros mencionados, puedes ir a esta liga, lo que si te menciono es que esta en ingles.

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.