martes, 28 de febrero de 2012

Varios Escenarios de Recuperacion con RMAN

Aunque el documento al que me estoy refiriendo en esta ocasion esta en ingles, es una buena ayuda para cuando te topes con estas situaciones. Este documento se encuentra en communities de Oracle , asi que debes de tener acceso a MOS.

RMAN Recovery Scenarios

miércoles, 22 de febrero de 2012

Conectarte con ssh sin contraseña entre dos nodos


Una de las cosas mas comunes que tienes que hacer cuando trabajas en un ambiente RAC es conectarte entre tus nodos, sobre todo para establecer los mismos estandares entres ambos.

Pero con lo que te topas cuando estas haciendo esto, es que cada vez que haces una sesion de ssh , tienes que introducir tu password.

Lo primero que te tienes que asegurar es que en /etc/ssh/sshd_config, las siguientes entradas se encuentren y esten habilitadas en tu configuracion del servidor de ssh,  : 

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle
oracle $ cat /etc/ssh/sshd_config | egrep "RSAAuthentication|PubkeyAuthentication"
RSAAuthentication yes
PubkeyAuthentication yes


Si las entradas no se encontraban habilitadas o las tuviste que agregar, tienes que reiniciar tu servidor de ssh

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle
oracle $ /etc/init.d/sshd restart
Stopping ssh:                                             [  OK  ]
Starting ssh:                                             [  OK  ]

De igual manera, si el directorio .ssh no se encuentra, crealo de la siguiente manera

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle
oracle $ mkdir ~/.ssh

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle
oracle $ chmod 700 ~/.ssh

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle
oracle $ cd ~/.ssh

Ahora lo que hay que crear es un par de llaves, llamadas publicas/privadas, estas llaves son las que te vas a permitir hacer tu conexion via ssh sin un password

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/oracle/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oracle/.ssh/id_rsa.
Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.
The key fingerprint is:
45:b5:fd:0f:40:35:3e:6e:c6:70:1c:9d:9b:dd:fc:9e

oracle@servidor1.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ ls id_rsa*
id_rsa  id_rsa.pub

Una vez que creaste tu par de llaves, hay que agregar  la llave publica a tu segundo nodo, la manera que lo hago yo, es copiar al segundo nodo un archivo temporal de la llave publica

oracle@servidor2.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ scp servidor1.oracleenespanol.blogspot.com:/home/oracle/.ssh/id_rsa.pub ./id_rsa.pub.tmp

Password:
id_rsa.pub                                                                                                                        100%  401     0.4KB/s   00:00

oracle@servidor2.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ ls *.tmp
id_rsa.pub.tmp

Luego la anexo al archivo de llaves autorizadas, pero antes de hacer esto , creo un respaldo de este archivo, no vaya a ser que la Ley de Murphy se presente :)

oracle@servidor2.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ ls authorized_keys
authorized_keys

oracle@servidor2.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ scp -p authorized_keys authorized_keys.22Feb2012

oracle@servidor2.oracleenespanol.blogspot.com [DBATEST] /home/oracle/.ssh
oracle $ cat id_rsa.pub.tmp >> authorized_keys

Ya que hiciste lo anterior , vas a poder hacer una sesion de ssh entre tus dos nodos sin que te este requiriendo un password.

martes, 21 de febrero de 2012

RAC: Cambiar password para el usuario sys en ASM

Una de las situaciones que muchas empresas se enfrentan es que cuando renuncia un DBA de tu equipo, normalmente por seguridad y en un corto plazo te das a la tarea de cambiar los passwords de superusuario.

Como sabes, cambiar el password de un usuario de sys en una Base de Datos es lo mismo que cambiar el password a cualquier usuario.

TESTDB > alter user sys identified by oracle;

User altered.

Pero cuando estas manejando ASM, no lo puedes cambiar de esta manera. La unica manera de cambiar el password es con la utileria orapwd.

Lo primero que tenemos que hacer es configurar las variables de ambiente ORACLE_HOME y ORACLE_SID para que apunten a nuestra instancia de ASM, recuerda que esto es con el usuario de grid.

ORACLE_HOME=/mount/oracle/grid/11.2.0.2v3
ORACLE_SID=+ASM1
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_HOME ORACLE_SID PATH

De la misma manera, te tienes que asegurar que el valor de remote_login_passwordfile sea EXCLUSIVE, si este no lo es, asegurate que asi sea , cambiando el valor de este en el spfile y reiniciando tu instancia de ASM.

grid@servidor1.oracleenespanol.blogspot.com
root $ sqlplus
SQL*Plus: Release 11.2.0.2.0 Production on Tue Feb 21 20:32:46 2012
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 Real Application Clusters and Automatic Storage Management options

+ASM1 >show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

remote_login_passwordfile            string      EXCLUSIVE

Cambiate al directorio $ORACLE_HOME/dbs y renombra el archivo de password

grid@servidor1.oracleenespanol.blogspot.com
root $ cd $ORACLE_HOME/dbs

grid@servidor1.oracleenespanol.blogspot.com
root $ mv "orapw+ASM" "ASM.bu21Feb2012"

Por ultimo con el siguiente comando, vas a recrear el archivo de tipo password , con la contraseña que hayas escogido

orapwd file="orapw+ASM" password=<sys_password> 

lunes, 20 de febrero de 2012

Maquina Virtual (VM) y Oracle 11gR2

Oracle tiene una maquina Virtual llamada Virtual Box, con esta herramienta, te puede ayudar para cuando te quieres evitar el proceso de instalacion del RDBMS y del sistema operativo.

Lo unico, es que este es un producto unicamente para desarrollo y no es soportado en un ambiente de produccion, pero para empezar todas las pruebas que quieras hacer es una manera rapida y eficiente de manejar una base de datos Oracle 11gR2

Oracle Virtual Box

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.