miércoles, 15 de febrero de 2012

RAC y como Crear Manualmente Una Base de Datos Oracle 11gR2

Una de mis entradas mas populares al dia de hoy, ha sido la de como crear una base de datos en 11g. Ahora lo que vamos a hacer es como crear una base de datos manualmente en un ambiente RAC en 11g

Verificar Variable de Ambiente

Aqui tenemos que decidir el nombre que va a tener nuestra instancia y base de datos,  aqui un ejemplo utilizando Korn shell, si utilizas C Shell, usa el comando setenv

  • variable ORACLE_SID
    export ORACLE_SID=TESTDB1
  • variable DB_NAME
    export DB_NAME=TESTDB
  • variable ORACLE_BASE
    export ORACLE_BASE='/mount/oracle'
  • variable ORACLE_HOME
    export ORACLE_HOME='/mount/oracle/product/11.2.0.2v3'
  • 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/initTESTDB1.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='+ASM_DATA/TESTDB/CONTROLFILE/control01.ctl','+ASM_DATA/TESTDB/CONTROLFILE/control02.ctl'
*.db_block_size =8192
*.db_name ='TESTDB'
*.db_recovery_file_dest='+FRA_DATA'
*.db_recovery_file_dest_size =2G
*.diagnostic_dest ='/mount/oracle/dump01'
*.cluster_database=FALSE
*.log_archive_dest_1='LOCATION=+ASM_DATA/TESTDB/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target =1G
*.open_cursors =300
*.processes =150
*.remote_listener='orclespdev1-scan.oracleenespanol.blogspot.com:1826'
*.remote_login_passwordfile ='EXCLUSIVE'
TESTDB1.instance_name = TESTDB1
TESTDB1.instance_number=1
TESTDB1.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/initTESTDB1.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.Tomando en cuenta que en ASM ya existen los siguientes directorios:

ASMCMD> pwd
+ASM_DATA/TESTDB

ASMCMD> ls
ARCHIVELOG/
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/

 
CREATE database TESTDB
USER SYS IDENTIFIED BY sys_password
USER SYSTEM IDENTIFIED BY system_password
MAXINSTANCES 32
MAXLOGHISTORY 10000
MAXLOGMEMBERS 5
MAXDATAFILES 2024
MAXLOGFILES 64
ARCHIVELOG
LOGFILE   GROUP 1 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo01a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo01b.log'
  ) SIZE 100M,
  GROUP 2 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo02a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo02b.log'
  ) SIZE 100M,
  GROUP 3 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo03a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo03b.log'
  ) SIZE 100M
CHARACTER SET UTF8
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '+ASM_DATA/TESTDB/DATAFILE/system01.dbf' size 500M autoextend on next 100M maxsize 2000M extent management local
SYSAUX datafile '+ASM_DATA/TESTDB/DATAFILE/sysaux01.dbf' size 100M autoextend on next 100M maxsize 2000M
UNDO tablespace UNDOTBS1 datafile '+ASM_DATA/TESTDB/DATAFILE/undotbs1_01.dbf' size 500M autoextend on next 100M maxsize 1000M
DEFAULT temporary tablespace TEMP tempfile '+ASM_DATA/TESTDB/TEMPFILE/temp01.dbf' size 100M autoextend on next 100M maxsize 1000M;


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 cuatro scripts para crear las vistas y procedimientos del diccionario de datos, este es un paso obligatorio asi que no te lo saltes, catalog.sql,catproc.sql y catclust.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:

TESTDB1 >CONNECT SYS AS SYSDBA
spool catalog.log
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catalog.sql
spool off

spool catproc.log
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catproc.sql
spool off 

spool catclust.log 
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catclust.sql
spool off

TESTDB1 >CONNECT SYSTEM
Enter password:
spool pupbld.log
@/mount/oracle/product/11.2.0.2v3/sqlplus/admin/pupbld.sql
spool off
 

Para asegurarme que los usuarios de sys y system usen a TEMP como su tablespace temporal , corro el siguiente comando

TESTDB1 >alter user sys temporary tablespace TEMP;
User altered.

TESTDB1 >alter user sys temporary tablespace TEMP;
User altered.

Hasta este momento, si seguiste mi previa entrada de como crear una base de Datos en Linux, todo es similar (hasta parte del mismo texto :) ), pero aqui es en donde empieza a cambiar la situacion.

Crear segundo hilo de Online Redo Logs y segundo Tablespace de Undo

En RAC, cada instancia necesita tener su propio set de online Redo logs y su propio tablespace de undo, por eso necesitamos crear para la segunda instancia este segundo set, y asi sucesivamente para cada instancia que vayas a tener en tu configuracion.

TESTDB1 > CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE
2  '+ASM_DATA/TESTDB/DATAFILE/undotbs2_01.dbf' size 100M autoextend on next 100M maxsize 1000M
3 ONLINE
4 RETENTION NOGUARANTEE
5 BLOCKSIZE 8K
6 FLASHBACK ON;

Tablespace created.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2 GROUP 4 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo04a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo04b.log'
5  ) SIZE 100M;

Database altered.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2  GROUP 5 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo05a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo05b.log'
5  ) SIZE 100M;

Database altered.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2  GROUP 6 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo06a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo06b.log'
5  ) SIZE 100M;

Database altered.

Archivo de Parametros en RAC

Otra de las cosas que cambia con respecto a una Base de Datos que no esta en RAC contra una que si esta en arquitectura RAC, es que hay ciertos parametros que es obligatorio que en todas las instancias sean iguales,en 11gR2 son los siguientes
COMPATIBLE
CLUSTER_DATABASE
CLUSTER_DATABASE_INSTANCES
CONTROL_FILES
DB_BLOCK_SIZE
DB_DOMAIN
DB_FILES
DB_NAME
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE
DB_UNIQUE_NAME
INSTANCE_TYPE (RDBMS or ASM)
PARALLEL_EXECUTION_MESSAGE_SIZE
REMOTE_LOGIN_PASSWORDFILE
UNDO_MANAGEMENT
Aqui un ejemplo del init que construi para este ejercicio, llamado /mount/dba01/oracle/TESTDB/pfile/pfileTESTDB_RAC.ora

*.audit_file_dest ='/mount/oracle/dump01/TESTDB/adump'
*.audit_trail ='db'
*.compatible ='11.2.0'
*.control_files='+ASM_DATA/TESTDB/CONTROLFILE/control01.ctl','+ASM_DATA/TESTDB/CONTROLFILE/control02.ctl'
*.db_block_size =8192
*.db_name ='TESTDB'
*.db_recovery_file_dest='+FRA_DATA'
*.db_recovery_file_dest_size =2G
*.diagnostic_dest ='/mount/oracle/dump01'
*.cluster_database=TRUE
*.log_archive_dest_1='LOCATION=+ASM_DATA/TESTDB/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target =1G
*.open_cursors =300
*.processes =150
*.remote_listener='orclespdev1-scan.oracleenespanol.blogspot.com:1826'
*.remote_login_passwordfile ='EXCLUSIVE'
TESTDB1.instance_name = TESTDB1
TESTDB2.instance_name = TESTDB2
TESTDB1.instance_number=1
TESTDB2.instance_number=2
TESTDB1.undo_tablespace='UNDOTBS1'
TESTDB2.undo_tablespace='UNDOTBS2'
TESTDB1.thread=1
TESTDB2.thread=2

Una de las cosas que te permite la arquitectura de RAC, es que cada instancia tenga su propio archivo de parametros.

Pero en mi caso, prefiero tener uno compartido, esto lo hago removiendo cualquier archivo de arranque que exista en $ORACLE_HOME/dbs/spfileTESTBn.ora (donde n es el numero de instancia)

Algo que debes de tener muy claro es que como vamos a tener un archivo de parametros compartido, la rutas fijas, (Que no pertenecen a ASM) tienen que ser iguales en todos tus nodos, como por ejemplo audit_file_dest. 

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/oracle/product/11.2.0.2v3/dbs
oracle $ rm ./*TESTDB*.ora


Ya que removi cualquier archivo de parámetros que tenia, para cada instancia en su servidor en $ORACLE_HOME/dbs, voy a crear un archivo initTESTDBn.ora (n para el numero de instancia) que apunte a mi archivo de arranque binario compartido

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/oracle/product/11.2.0.2v3/dbs
oracle $ cat initTESTDB1.ora
SPFILE='+ASM_DATA/TESTDB/PARAMETERFILE/spfileTESTDB.ora'

Ahora voy a bajar la instancia TESTDB1 para despues subirla con el archivo de parametros en RAC

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/TESTDB/pfile
oracle $ sqlplus

SQL*Plus: Release 11.2.0.2.0 Production on Wed Feb 15 10:00:53 2012
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Enter user-name: /as sysdba

TESTDB1 >shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

TESTDB1 > SPFILE='+ASM_DATA/TESTDB/PARAMETERFILE/spfileTESTDB.ora' FROM PFILE = '/mount/dba01/oracle/TESTDB/pfile/pfileTESTDB_RAC.ora';

File created.

TESTDB1 >startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2233336 bytes
Variable Size             675286024 bytes
Database Buffers          369098752 bytes
Redo Buffers               22319104 bytes
Database mounted.
Database opened.
TESTDB1 >

Ya que levantamos la instancia con los parametros necesarios de RAC, vamos a habilitar el segundo hilo de los online Redo Log

TESTDB1 >ALTER DATABASE ENABLE PUBLIC THREAD 2;

Database altered.

Y ahora volvemos a bajar la instancia TESTDB1

TESTDB1 >shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

Añadir nuestra Base de Datos como Recurso al Clusterware
Si te has fijado, todo lo hemos trabajado en una sola instancia,para poder manejarlo con el Server Manager, vamos a utilizar una utileria llamada srvctl. En 11gR2 , se define una base de datos como un recurso en Oracle Clusterware, y cuando creamos una base de datos manual, esto se hace con la utileria srvctl.

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add database -d TESTDB -o "/mount/oracle/product/11.2.0.2v3"

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add instance -d TESTDB -i TESTDB1 -n servidor1.oracleenespanol.blogspot.com

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add instance -d TESTDB -i TESTDB2 -n servidor2.oracleenespanol.blogspot.com 
 
oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl start database -d TESTDB 
 
oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl status database -d TESTDB

Instance TESTDB1 is running on node servidor1
Instance TESTDB2 is running on node servidor2

Conclusion
Espero que estos pasos te sirvan el dia que no quieras utilizar el dbca para crear tu base de datos, esto te permite mas flexibilidad para la creacion de esta.