domingo, 30 de septiembre de 2012

Oracle RMAN DUPLICATE database

This practical case, shows how to easily duplicate a Oracle database using RMAN.

Starting with our database, instance named TEST, in open mode, we'll create all we need to start in nomount mode a second instance named TEST2, this one will be the cloned database, finally launching copy from RMAN utility to clone the database.

1.- The first step, creating password file for the new instance (TEST2).

[oracle@oracletest ~]$ cd $ORACLE_HOME/dbs
[oracle@oracletest dbs]$ orapwd file=$ORACLE_HOME/dbs/orapwTEST2


Enter password for SYS: 

2.- New listener for TEST2 database.

Configure the listener.ora and tnsnames.ora files, to permit database TEST2 accepting connections.

[oracle@oracletest admin]$ cd $ORACLE_HOME/network/admin
[oracle@oracletest admin]$ vi listener.ora 

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = TEST)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
      (SID_NAME = TEST)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = TEST2)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
      (SID_NAME = TEST2)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracletest)(PORT = 1521))
  )

ADR_BASE_LISTENER = /u01/app/oracle

TRACE_LEVEL_LISTENER = USER

[oracle@oracletest admin]$ vi tnsnames.ora 

TEST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracletest)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST)
    )
  )

TEST2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracletest)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST2)
3.-  Create pfile.

[oracle@oracletest admin]$ cd $ORACLE_HOME/dbs
[oracle@oracletest dbs]$ vi initTEST2.ora

DB_NAME=TEST2
DB_BLOCK_SIZE=8192
CONTROL_FILES=(+DATA2/test2/controlfile/control01.ctl)
DB_FILE_NAME_CONVERT=(+DATA,+DATA2)
LOG_FILE_NAME_CONVERT=(+DATA,+DATA2)

Only these above parameters are in the new database pfile, DB_NAME specifies the new name for cloned instance, db_block_size is the block size for database, the next parameter indicates the control files location, and the last two parameters are for the naming conversion for datafiles and redo log files, the new ASM disk location for this files will be +DATA2 instead the original +DATA1.

Export ORACLE_SID, and run into nomount mode the new instance TEST2.

[oracle@oracletest dbs]$ export ORACLE_SID=TEST2
[oracle@oracletest dbs]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sat Sep 29 22:41:19 2012

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

Connected to an idle instance.

SQL> startup nomount pfile='?/dbs/initTEST2.ora';
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size    2211928 bytes
Variable Size  159387560 bytes
Database Buffers   50331648 bytes
Redo Buffers    5226496 bytes

SQL> create spfile from pfile;

File created.

4.- Start origin database (TEST) in mount or open mode.

[oracle@oracletest ~]$ echo $ORACLE_SID
TEST
[oracle@oracletest ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sat Sep 29 22:45:17 2012

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

Connected to an idle instance.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size    2212936 bytes
Variable Size  163580856 bytes
Database Buffers  142606336 bytes
Redo Buffers    4759552 bytes
Base de datos montada.

5.- Connect to RMAN and executing DUPLICATE command to start with the clone process.

Connect to RMAN on the origin database (TEST) , from here connecting to the new database using the following command: CONNECT AUXILIARY.

Once DUPLICATE command is running, RMAN is responsible for doing all the job.

[oracle@oracletest ~]$ rman

Recovery Manager: Release 11.2.0.1.0 - Production on Sat Sep 29 22:46:32 2012

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

RMAN> connect target sys@TEST  

target database Password: 
connected to target database: TEST (DBID=2093094325, not open)

RMAN> connect auxiliary sys@TEST2

auxiliary database Password: 
connected to auxiliary database: TEST2 (not mounted)

RMAN> duplicate target database to TEST2 from active database;


Starting Duplicate Db at 29-SEP-2012 22:57:20
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=1 device type=DISK

contents of Memory Script:
{
   sql clone "create spfile from memory";
}
executing Memory Script

sql statement: create spfile from memory

contents of Memory Script:
{
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area     217157632 bytes

Fixed Size                     2211928 bytes
Variable Size                159387560 bytes
Database Buffers              50331648 bytes
Redo Buffers                   5226496 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''TEST'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''TEST2'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   backup as copy current controlfile auxiliary format  '+DATA2/test2/controlfile/control01.ctl';
   alter clone database mount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''TEST'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set  db_unique_name =  ''TEST2'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area     217157632 bytes

Fixed Size                     2211928 bytes
Variable Size                159387560 bytes
Database Buffers              50331648 bytes
Redo Buffers                   5226496 bytes

Starting backup at 29-SEP-2012 22:59:41
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=25 device type=DISK
channel ORA_DISK_1: starting datafile copy
copying current control file
output file name=/u01/app/oracle/product/11.2.0/db/dbs/snapcf_TEST.f tag=TAG20120929T225952 RECID=15 STAMP=795308405
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
Finished backup at 29-SEP-2012 23:00:28

database mounted
RMAN-05529: WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to disk group only.

contents of Memory Script:
{
   set newname for datafile  1 to 
 "+data2";
   set newname for datafile  2 to 
 "+data2";
   set newname for datafile  3 to 
 "+data2";
   set newname for datafile  4 to 
 "+data2";
   backup as copy reuse
   datafile  1 auxiliary format 
 "+data2"   datafile 
 2 auxiliary format 
 "+data2"   datafile 
 3 auxiliary format 
 "+data2"   datafile 
 4 auxiliary format 
 "+data2"   ;
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 29-SEP-2012 23:01:06
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=+DATA/test/datafile/system.276.794947707
output file name=+DATA2/test2/datafile/system.257.795308479 tag=TAG20120929T230107
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:25
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=+DATA/test/datafile/sysaux.277.794947709
output file name=+DATA2/test2/datafile/sysaux.256.795308565 tag=TAG20120929T230107
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:05
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=+DATA/test/datafile/undotbs1.278.794947711
output file name=+DATA2/test2/datafile/undotbs1.259.795308631 tag=TAG20120929T230107
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=+DATA/test/datafile/users.259.795088363
output file name=+DATA2/test2/datafile/users.260.795308657 tag=TAG20120929T230107
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
Finished backup at 29-SEP-2012 23:04:21

contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=15 STAMP=795308662 file name=+DATA2/test2/datafile/system.257.795308479
datafile 2 switched to datafile copy
input datafile copy RECID=16 STAMP=795308662 file name=+DATA2/test2/datafile/sysaux.256.795308565
datafile 3 switched to datafile copy
input datafile copy RECID=17 STAMP=795308662 file name=+DATA2/test2/datafile/undotbs1.259.795308631
datafile 4 switched to datafile copy
input datafile copy RECID=18 STAMP=795308663 file name=+DATA2/test2/datafile/users.260.795308657

contents of Memory Script:
{
   set until scn  1092216;
   recover
   clone database
   noredo
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 29-SEP-2012 23:04:24
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=23 device type=DISK

Finished recover at 29-SEP-2012 23:04:39

contents of Memory Script:
{
   shutdown clone immediate;
   startup clone nomount;
   sql clone "alter system set  db_name = 
 ''TEST2'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area     217157632 bytes

Fixed Size                     2211928 bytes
Variable Size                159387560 bytes
Database Buffers              50331648 bytes
Redo Buffers                   5226496 bytes

sql statement: alter system set  db_name =  ''TEST2'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset  db_unique_name scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area     217157632 bytes

Fixed Size                     2211928 bytes
Variable Size                159387560 bytes
Database Buffers              50331648 bytes
Redo Buffers                   5226496 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "TEST2" RESETLOGS ARCHIVELOG 
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP  1 ( '+data2' ) SIZE 50 M  REUSE,
  GROUP  2 ( '+data2' ) SIZE 50 M  REUSE,
  GROUP  3 ( '+data2' ) SIZE 50 M  REUSE
 DATAFILE
  '+DATA2/test2/datafile/system.257.795308479'
 CHARACTER SET AL32UTF8


contents of Memory Script:
{
   set newname for tempfile  1 to 
 "+data2";
   switch clone tempfile all;
   catalog clone datafilecopy  "+DATA2/test2/datafile/sysaux.256.795308565", 
 "+DATA2/test2/datafile/undotbs1.259.795308631", 
 "+DATA2/test2/datafile/users.260.795308657";
   switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to +data2 in control file

cataloged datafile copy
datafile copy file name=+DATA2/test2/datafile/sysaux.256.795308565 RECID=1 STAMP=795308819
cataloged datafile copy
datafile copy file name=+DATA2/test2/datafile/undotbs1.259.795308631 RECID=2 STAMP=795308819
cataloged datafile copy
datafile copy file name=+DATA2/test2/datafile/users.260.795308657 RECID=3 STAMP=795308820

datafile 2 switched to datafile copy
input datafile copy RECID=1 STAMP=795308819 file name=+DATA2/test2/datafile/sysaux.256.795308565
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=795308819 file name=+DATA2/test2/datafile/undotbs1.259.795308631
datafile 4 switched to datafile copy
input datafile copy RECID=3 STAMP=795308820 file name=+DATA2/test2/datafile/users.260.795308657

contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 29-SEP-2012 23:07:24

miércoles, 26 de septiembre de 2012

PRCR-1709 / ORA-01031 Insufficient privileges en Oracle Standalone ASM

Al realizar una instalación de Oracle Database 11g con ASM, previamente instalando Grid Infraestructure, con roles separados, por un lado Grid infraestructure con el usuario grid, y Oracle Database con usuario Oracle, nos podemos encontrar con un error como este al crear la base de datos.

PRCR-1079 : Failed to start resource ora.test.db
ORA-01031: insufficient privileges
ORA-01031: insufficient privileges
CRS-2674: Start of 'ora.test.db' on 'oracletest' failed

Sucede al intentar levantar automáticamente el recurso "ora.test.db" por parte del usuario grid, por falta de permisos, para solucionarlo debemos agregar al usuario grid al grupo "dba", o hacer toda la instalación (Grid Infraestructure y Oracle Database) con el mismo usuario.


miércoles, 1 de agosto de 2012

Oracle RAC CRS Resources operations

On the previous post we saw how to install an Oracle RAC environment for testing purposes, in this section you will find some commands to manage your Oracle RAC infraestructure.

Stop CRS


[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl stop crs
CRS-2791: Iniciando cierre de los recursos gestionados por los Servicios de Alta Disponibilidad de Oracle en 'racnode1'
CRS-2673: Intentando parar ''ora.crsd'' en ''racnode1''
CRS-2790: Iniciando cierre de los recursos gestionados por Cluster Ready Services en 'racnode1'
CRS-2673: Intentando parar ''ora.CRS.dg'' en ''racnode1''
CRS-2673: Intentando parar ''ora.racdb.servicetest.svc'' en ''racnode1''
.
.
.
CRS-2677: La parada de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2677: La parada de ''ora.diskmon'' en ''racnode1'' se ha realizado correctamente
CRS-2793: Ha terminado el cierre de los recursos gestionados por los Servicios de Alta Disponibilidad de Oracle en 'racnode1'
CRS-4133: Oracle High Availability Services has been stopped.

Start CRS

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl start crs
CRS-4123: Oracle High Availability Services has been started.

CRS resources status


[root@racnode2 ~]# /u01/app/11.2.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       racnode2                                     
ora.DATA.dg
               ONLINE  ONLINE       racnode2                                     
ora.FRA.dg
               ONLINE  ONLINE       racnode2                                     
ora.LISTENER.lsnr
               ONLINE  ONLINE       racnode2                                     
ora.asm
               ONLINE  ONLINE       racnode2                                     
ora.eons
               ONLINE  ONLINE       racnode2                                     
ora.gsd
               OFFLINE OFFLINE      racnode2                                     
ora.net1.network
               ONLINE  ONLINE       racnode2                                     
ora.ons
               ONLINE  ONLINE       racnode2                                     
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       racnode2                                     
ora.oc4j
      1        OFFLINE OFFLINE                                                   
ora.racdb.db
      1        ONLINE  OFFLINE                                                   
      2        ONLINE  ONLINE       racnode2                                     
ora.racdb.servicetest.svc
      1        ONLINE  ONLINE       racnode2                                     
ora.racnode1.vip
      1        ONLINE  INTERMEDIATE racnode2                                     
ora.racnode2.vip
      1        ONLINE  ONLINE       racnode2                                     
ora.scan1.vip
      1        ONLINE  ONLINE       racnode2        

The Legacy way.

root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora.CRS.dg     ora....up.type ONLINE    ONLINE    racnode1    
ora.DATA.dg    ora....up.type ONLINE    ONLINE    racnode1    
ora.FRA.dg     ora....up.type ONLINE    ONLINE    racnode1    
ora....ER.lsnr ora....er.type ONLINE    ONLINE    racnode1    
ora....N1.lsnr ora....er.type ONLINE    ONLINE    racnode2    
ora.asm        ora.asm.type   ONLINE    ONLINE    racnode1    
ora.eons       ora.eons.type  ONLINE    ONLINE    racnode1    
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE               
ora....network ora....rk.type ONLINE    ONLINE    racnode1    
ora.oc4j       ora.oc4j.type  OFFLINE   OFFLINE               
ora.ons        ora.ons.type   ONLINE    ONLINE    racnode1    
ora.racdb.db   ora....se.type ONLINE    ONLINE    racnode1    
ora....est.svc ora....ce.type ONLINE    ONLINE    racnode2    
ora....SM1.asm application    ONLINE    ONLINE    racnode1    
ora....E1.lsnr application    ONLINE    ONLINE    racnode1    
ora....de1.gsd application    OFFLINE   OFFLINE               
ora....de1.ons application    ONLINE    ONLINE    racnode1    
ora....de1.vip ora....t1.type ONLINE    ONLINE    racnode1    
ora....SM2.asm application    ONLINE    ONLINE    racnode2    
ora....E2.lsnr application    ONLINE    ONLINE    racnode2    
ora....de2.gsd application    OFFLINE   OFFLINE               
ora....de2.ons application    ONLINE    ONLINE    racnode2    
ora....de2.vip ora....t1.type ONLINE    ONLINE    racnode2    
ora.scan1.vip  ora....ip.type ONLINE    ONLINE    racnode2    

Stop cluster on current node.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl stop cluster

Stop cluster on a node.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl stop cluster -n racnode2

Stop cluster on both nodes.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl stop cluster -all

Start cluster.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl start cluster -all

Start Cluster on a node.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl start cluster -n racnode2

Check Cluster status.


root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl check cluster
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

Check CRS status.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

Check OHASD Daemon.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl check has
CRS-4638: Oracle High Availability Services is online

Disable CRS Daemon.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl disable crs

Enable CRS Daemon.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl enable crs

Disable Cluster resource.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl disable resource ora.rcat.db

Enable Cluster resource.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl enable resource ora.rcat.db

Delete Cluster resource.

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl delete resource ora.rcat.db

Get permissions from a cluster resource.


[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl getperm resource ora.racdb.db -g dba
Name: ora.racdb.db
r--

[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crs_getperm ora.racdb.db -g dba
Name: ora.racdb.db
r--

Get Oracle Clusterware versions.

root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl query crs softwareversion
Oracle Clusterware version on node [racnode1] is [11.2.0.1.0]
[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl query crs activeversion
Oracle Clusterware active version on the cluster is [11.2.0.1.0]
[root@racnode1 ~]# /u01/app/11.2.0/grid/bin/crsctl query crs releaseversion
Oracle High Availability Services release version on the local node is [11.2.0.1.0]

viernes, 13 de julio de 2012

Instalación Oracle RAC 11g + ASM

Para empezar haremos una breve descripción del entorno de pruebas que se va a instalar.
Haremos la instalación de Oracle RAC 11g, con dos nodos (racnode1 y racnode2), y con un tercer servidor (openfiler) que desempeñará el rol de Network Storage Server.

Aquí un esquema de la infraestructura.

























1.- Instalación del Sistema Operativo, Oracle Linux x86_64.
Esta instalación se realiza en los dos nodos del cluster.

Descargamos de https://edelivery.oracle.com la versión de Oracle Enterprise Linux 5.4 que mejor se adapte a nuestro hardware, en nuestro caso hemos hecho la instalación de 64 bits.

2.- Instalación de paquetes del Sistema Operativo en los dos nodos del RAC.
Esta instalación se realiza en los dos nodos del cluster.

Instalamos adicionalmente los siguientes paquetes de software.


yum install binutils.x86_64
yum install elfutils-libelf.x86_64 elfutils-libelf-devel.x86_64 elfutils-libelf-devel-static.x86_64
yum install glibc.x86_64 glibc-devel.x86_64 glibc-common.x86_64 glibc-headers.x86_64
yum install ksh.x86_64
yum install libaio.x86_64 libaio-devel.x86_64
yum install libgcc.x86_64
yum install libstdc++.x86_64 libstdc++-devel.x86_64 compat-libstdc++-33.x86_64
yum install make.x86_64
yum install gcc.x86_64 gcc-c++.x86_64
yum install unixODBC.x86_64 unixODBC-devel.x86_64
yum install sysstat.x86_64

3.- Configuración de red, en los dos nodos del RAC.
Esta configuración se realiza en los dos nodos del cluster..

Se necesitan al menos dos interfaces de red diferentes en cada nodo de Oracle RAC, uno para la red pública y otro para la privada (interconnect).
Es necesario configurar la misma tarjeta de red en todos los nodos para la misma red, es decir, en nuestro caso tenemos la eth0 y la eth1, si en uno de los nodos usamos la eth0 para la red pública, en el otro nodo lo deberemos hacer del mismo modo.

Para la red pública el adaptador debe soportar TCP/IP, para la red privada UDP GigabitEthernet.

En este ejemplo usaremos dos tarjetas de red, pero para sistemas en un entorno de producción necesitaremos otra tarjeta adicional para el tráfico de almacenamiento (Network Storage), en nuestro caso como es un sistema para hacer pruebas usaremos para este propósito la tarjeta eth1 que se usa también para el RAC interconnect.


Servidor Dns Ip Interface
racnode1 racnode1 10.0.9.210 eth0
racnode1 racnode1-priv 10.0.10.210 eth1
racnode1 racnode1-vip 10.0.9.220 eth0
racnode2 racnode2 10.0.9.211 eth0
racnode2 racnode2-priv 10.0.10.211 eth1
racnode2 racnode2-vip 10.0.9.221 eth0
openfiler openfiler 10.0.9.212 eth0
openfiler openfiler-priv 10.0.10.212 eth1

Configuramos las tarjetas de red con las ips correspondientes en los dos servidores.
Debería quedar algo similar a esto:


[root@racnode1]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:50:56:82:00:2E
          inet addr:10.0.9.210  Bcast:10.0.9.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe82:2e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45496 errors:0 dropped:151 overruns:0 frame:0
          TX packets:29385 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:25817882 (24.6 MiB)  TX bytes:5389896 (5.1 MiB)


eth1      Link encap:Ethernet  HWaddr 00:50:56:82:00:34
          inet addr:10.0.10.210  Bcast:10.0.10.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe82:34/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:239 errors:0 dropped:152 overruns:0 frame:0
          TX packets:49 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16969 (16.5 KiB)  TX bytes:5403 (5.2 KiB)


lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1200 (1.1 KiB)  TX bytes:1200 (1.1 KiB)


Modificamos el /etc/hosts de los dos nodos del RAC con la misma información. También configuramos nuestro DNS con la misma información.

[root@racnode1]# vi /etc/hosts
127.0.0.1       localhost.localdomain   localhost.localdomain   localhost4      localhost4.localdomain4 localhost


# Red publica - eth0
10.0.9.210      racnode1
10.0.9.211      racnode2


# Red Privada - eth1
10.0.10.210     racnode1-priv
10.0.10.211     racnode2-priv


# Public Virtual IP (VIP) - eth0:1
10.0.9.220      racnode1-vip
10.0.9.221      racnode2-vip


# SCAN
10.0.9.230      racnode-cluster-scan


# OpenFiler


10.0.9.212      openfiler
10.0.10.212     openfiler-priv

El nombre del host, ranode1 y racnode2 no debe estar puesto nunca en la dirección de Loopback (127.0.0.1), si estos nombres se incluyen en la dirección de Loopback la instalación de RAC fallará con un ORA-00603 o ORA-29702.

El siguiente paso es desactivar los firewalls del sistema operativo, en este caso iptables.

[root@racnode1 Packages]# /etc/init.d/iptables stop
iptables: Guardando las reglas del cortafuegos:            [  OK  ]
iptables: Poniendo las cadenas de la política ACCEPT: filt[  OK  ]
iptables: Descargando módulos:                            [  OK  ]

Desactivamos iptables para próximos reinicios del servidor.

[root@racnode1 Packages]# chkconfig iptables off

Desactivamos SeLinux.

[root@racnode1 ~]# echo 0 >/selinux/enforce
[root@racnode1 ~]# vim /etc/sysconfig/selinux

SELINUX=disabled


4.- Configuración de Cluster Time Synchronization Service (CTSS).
Esta configuración se realiza en los dos nodos del cluster.

Para usar el CTSS en el cluster debemos primero desactivar y desinstalar el servicio NTP en los dos nodos del RAC.

service ntpd stop
chkconfig ntpd off
mv /etc/ntp.conf /etc/ntp.conf.orig

Cuando la instalación detecta que el NTP no está activo, instalará y activará automaticamente el CTSS.
Para confimar que el ctssd está activo después de la instalación:

crsctl check ctss

5.- Instalación OpenFiler.
Esta instalación se realiza en el servidor de almacenamiento.

En este paso vamos a hacer la instalación de openfiler en el Network Storage Server, luego configuraremos este servidor como un dispositivo de storage iSCSI.

OpenFiler es una utilidad de almacenamiento en la red que es capaz de proporcionar o servir archivos en base a NAS o blocks en base a SAN. Soporta múltiples sistemas de archivos como CIFS, NFS, HTTP/DAV, FTP... nosotros usaremos iSCSI, implementaremos una SAN para el almacenamiento compartido necesario para el Oracle RAC 11g.
Para mas info sobre openfiler: http://www.openfiler.com

En nuestro caso como es una maquina de 64 bits, bajaremos el software:

openfiler-2.3-x86_64-disc1.iso

Arrancaremos el servidor desde la iso que hemos descargado y realizamos la instalación con los valores por defecto.
En la instalación configuraremos las tarjetas de red con las ips que le pertenecen según el cuadro que hemos puesto al principio del post.
Modificamos el /etc/hosts con la misma información que hemos puesto en uno de los dos nodos del RAC.

6.- Configuración OpenFiler.

Una vez ya tenemos instalado OpenFiler, es el momento de hacer la configuración de los volúmenes iSCSI.
Entramos en la gestión de OpenFiler, con un navegador web.
Los datos que debemos introducir para hacer login, son:
usuario: openfiler
password: password

La primera pantalla que nos aparece es la de Status, donde se muestra la información del estado actual del servidor Openfiler.




















Comenzamos con la configuración de OpenFiler.

Services


En la pestaña services habilitamos y arrancamos el iSCSI target, tal y como aparece en la imagen.



















En el Sistema Operativo podemos comprobar que el servicio realmente está arrancado:


[root@openfiler ~]# service iscsi-target status
ietd (pid 2471) is running...

Network Access Configuration

En la pestaña "System", pulsando en el enlace de la parte derecha "Network Setup", entramos en la configuración de red de Openfiler, lo que vamos a configurar ahora es identificar en OpenFiler los dos nodos de RAC que van a tener que acceder a los volúmenes de datos.
Las ips que introducimos son las correspondientes a la red privada.


















Volumes

Es el momento de crear los volúmenes que vamos a usar mas tarde.
Nos dirigimos a la pestaña "Volumes", y al enlace de la parte derecha de la pantalla "Block devices". Aquí nos muestra la información de los discos que tenemos en nuestro servidor OpenFiler.


En este ejemplo vamos a crear una única partición en el disco /dev/sdb, ocupando todo el espacio, luego crearemos un Volume Group con esta particion "/dev/sdb1" y de aquí crearemos 3 volumenes lógicos que son los que usaremos para almacenar los datos del RAC.

Creación de la particion

Pinchamos sobre el disco "/dev/sdb" en la columna "Edit disk", elegimos este porque el otro se está usando para el sistema openfiler.

Creamos una partición Primaria, del tipo "Linux Physical Volume" con el total del tamaño disponible en el disco.

















Creando el Grupo de Voluménes

Vamos al enlace "Volume Groups", y creamos un nuevo grupo de volúmenes con la partición previamente creada "/dev/sdb1".

















Creando Volúmenes

Nos dirigimos a la pestaña "Volumes", y pulsamos sobre el enlace "Add Volume". En la pantalla que nos aparece crearemos 3 volúmenes lógicos iSCSI.





















Al final los volúmenes quedan así. Podemos poner la distribución de espacio como creamos conveniente, este es solo un ejemplo de un sistema en pruebas.

















iSCSI Targets

Una vez ya tenemos creados los volúmenes lógicos iSCSI, es necesario crear los iSCSI targets, es necesarios crear un iSCSI target por cada volumen iSCSI que hemos creado, así luego podremos darles permisos de acceso a los clientes (racnode1 y racnode2) hacia los iSCSI targets.

Vamos a la pestaña "Volumes", y al enlace "iSCSI Targets".
Veremos que en la pantalla "Add new iSCSI Target" aparece un valor aleatorio para la creación de un nuevo target, nosotros vamos a crearlos con unos nombres significativos, así será mas fácil reconocerlos posteriormente. A continuación como los vamos a nombrar:

volume name Target IQN
rac-crs1 iqn.2006-01.com.openfiler:racvg.rac-crs1
rac-data1 iqn.2006-01.com.openfiler:racvg.rac-data1
rac-fra1 iqn.2006-01.com.openfiler:racvg.rac-fra1













En la pantalla que nos aparece a continuación, despues de añadir el iSCSI target, dejamos todos los valores por defecto.




















Estas operación debemos completarla para los 3 iSCSI targets que vamos a crear en total.

LUN Mapping

Ahora tenemos que mapear los iSCSI targets que hemos creado en el paso anterior con los volúmenes lógicos que creamos anteriormente.
Vamos a la pestaña "Volumes", enlace "iSCSI Targets", subpestaña "Target Configuration".
En la pantalla "Select iSCSI Target" elegimos uno de los 3 targets que hemos creado y pulsamos sobre "change".
A continuación vamos a la subpestaña "LUN mapping", y asociamos al iSCSI Target su correspondiente volumen lógico.

Volumen lógico rac-crs1


















Volumen lógico rac-data1



















Volumen lógico rac-fra1


















Para finalizar con la asignación de los "iSCSI targets" a los nodos del RAC, falta permitir el acceso desde los clientes a los volúmenes lógicos. Como en la anterior operación deberemos seleccionar uno a uno los iSCSI target desde la pestaña "Target Configuration", pulsando sobre el botón "Change", para después ir a la pestaá "Network ACL" y cambiar los "Access" que están en "Deny" por defecto por "Allow" y pulsar el botón "Update". Esta operación se tiene que hacer por cada uno de los 3 iSCSI Targets.


















7.- Configuración volúmenes iSCSI en nodos Oracle RAC.

Ya tenemos el servidor de almacenamiento preparado, ahora es el momento de preparar los nodos del RAC para que puedan acceder a los volúmenes.

Para que el Sistema operativo pueda alcanzar dichos volúmenes necesitaremos tener la aplicación iSCSI initiator en los dos nodos del RAC, este software se conectará automáticamente en el openfiler para acceder a los volúmenes que previamente hemos configurado.

Primero comprobamos si ya lo tenemos instalado.

[root@racnode1 ~]# rpm -qa |grep iscsi-initiator-utils

Si no lo tenemos instalado, lo instalamos.

[root@racnode1 ~]# yum install iscsi-initiator-utils.x86_64 iscsi-initiator-utils-devel.x86_64

Arrancamos los servicios iscsid y lo configuramos para que arranque automáticamente cuando el servidor arranque.


[root@racnode1 ~]# service iscsid start
Turning off network shutdown. Starting iSCSI daemon:       [  OK  ]
                                                           [  OK  ]
[root@racnode1 ~]# chkconfig iscsid on
[root@racnode1 ~]# chkconfig iscsi on

Comprobamos el acceso desde los nodos del RAC a los volúmenes. Si en este punto aparece un error "iscsiadm: No portals found", deberemos desactivar las entradas en el openfiler del archivo "/etc/initiators.deny", que seguramente nos estará bloqueando nuestra Ip.

[root@racnode1 ~]# iscsiadm -m discovery -t sendtargets -p openfiler-priv
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-fra1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-fra1
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-data1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-data1
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-crs1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-crs1

Ahora tenemos que loguear los dos nodos del RAC contra los volúmenes publicados en el openfiler.

[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-crs1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-crs1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-crs1, portal: 10.0.10.212,3260] successful.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-data1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-data1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-data1, portal: 10.0.10.212,3260] successful.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-fra1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-fra1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-fra1, portal: 10.0.10.212,3260] successful.

Configuramos el Logueo automático para los futuros arranques del servidor.

[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-crs1 -p 10.0.10.212 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-fra1 -p 10.0.10.212 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-data1 -p 10.0.10.212 --op update -n node.startup -v automatic

Creación de dispositivos SCSI lógicos.

Actualmente tenemos los iSCSI targets apuntando a un dispositivo local. Por ejemplo.
[root@racnode1 ~]# cd /dev/disk/by-path/
[root@racnode1 by-path]# ls -ltrh *openfiler*
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-crs1-lun-0 -> ../../sdb
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-data1-lun-0 -> ../../sdc
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-fra1-lun-0 -> ../../sdd

Esto no es algo permanente ya que si reiniciamos el servidor cuando el iscsi initiator se loguee en el openfiler no tiene porque asignarnos los discos a las mismas unidades, es decir puede ser que en el siguiente reinicio el iSCSI target ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-data1-lun-0 podría apuntar a sdd en lugar de sdc como lo hace actualmente.
Por ello lo que vamos a hacer es crear un nombre de dispositivo persistente, así si reiniciamos el servidor nos aseguramos de que el dispositivo al que hacemos referencia siempre va a ser el mismo. Esto se encarga de hacerlo udev, necesitamos generar una regla y un script.
*Nota: Este paso no funciona si estamos usando máquinas virtuales.

Primer paso, crear el archivo de reglas. (es una única linea)

[root@racnode1 by-path]# vi /etc/udev/rules.d/55-openiscsi.rules



KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"



Segundo paso, crear script. Este script obtiene los nombres de las Luns para que puedan ser generados los dispositivos iSCSI por udev.



[root@racnode1 by-path]# mkdir -p /etc/udev/scripts

[root@racnode1 by-path]# vi /etc/udev/scripts/iscsidev.sh

#!/bin/sh

# FILE: /etc/udev/scripts/iscsidev.sh

BUS=${1}
HOST=${BUS%%:*}

[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"

target_name=$(cat ${file})

# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
   exit 1
fi

# Check if QNAP drive
check_qnap_target_name=${target_name%%:*}
if [ $check_qnap_target_name = "iqn.2004-04.com.qnap" ]; then
    target_name=`echo "${target_name%.*}"`
fi

echo "${target_name##*.}"

[root@racnode1 by-path]# chmod 750 /etc/udev/scripts/iscsidev.sh

Con el udev configurado vamos a reiniciar el servicio iscsi.

[root@racnode1 nodes]# service iscsi stop
[root@racnode1 nodes]# service iscsi start

Creación de particiones.

Creamos particiones primarias usando todo el disco disponible en cada uno de los 3 volúmenes. Lo hacemos por ejemplo desde el racnode1.

[root@racnode1 by-path]# fdisk /dev/iscsi/rac-crs1/part
El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF
Building a new DOS disklabel with disk identifier 0x174b3585.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Orden (m para obtener ayuda): n
Acción de la orden
e   Partición extendida
   p   Partición primaria (1-4)
p
Número de partición (1-4): 1
Primer cilindro (1-1009, valor predeterminado 1): 1
Last cilindro, +cilindros or +size{K,M,G} (1-1009, valor predeterminado 1009):
Se está utilizando el valor predeterminado 1009

Orden (m para obtener ayuda): p

Disco /dev/iscsi/rac-crs1/part: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = cilindros of 4154 * 512 = 2126848 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x174b3585

Disposit.              Inicio       Comienzo      Fin      Bloques  Id  Sistema
/dev/iscsi/rac-crs1/part1               1        1009     2095662   83  Linux

Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.

En racnode2 comprobamos que vemos las particiones creadas desde el racnode1.

[root@racnode2 by-path]# partprobe
[root@racnode2 by-path]# fdisk -l

8.- Creación de usuarios, grupos y directorios.
Las operaciones que se van a ejecutar a continuación deben hacerse en los dos nodos del RAC.

A continuación los grupos y usuarios que se van a crear.

Grupo SO Usuarios SO Privilegios Oracle Grupo Oracle Descripción
oinstall grid, oracle Oracle Inventory and Software owner
asmadmin grid SYSASM OSASM Oracle Automatic Storage Management Group
asmdba grid, oracle SYSDBA for ASM OSDBA for ASM ASM Database Administrator Group
asmoper grid SYSOPER for ASM OSOPER for ASM ASM Operator Group
dba oracle SYSDBA OSDBA Database Administrator
oper oracle SYSOPER OSOPER Database Operator

Empezamos con la creación de grupos y cuentas para Grid.

[root@racnode1 /]# groupadd -g 1000 oinstall
[root@racnode1 /]# groupadd -g 1200 asmadmin
[root@racnode1 /]# groupadd -g 1201 asmdba
[root@racnode1 /]# groupadd -g 1202 asmoper
[root@racnode1 /]# useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper -d /home/grid -s /bin/bash -c "Grid Infrastructure Owner" grid
[root@racnode1 /]# id grid
uid=1100(grid) gid=1000(oinstall) grupos=1000(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper)
[root@racnode1 /]# passwd grid
Cambiando la contraseña del usuario grid.
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: todos los tokens de autenticación se actualizaron exitosamente.

Seguimos con la creación de grupos y cuentas para Oracle Database Software.

[root@racnode1 ~]# groupadd -g 1300 dba
[root@racnode1 ~]# groupadd -g 1301 oper
[root@racnode1 ~]# useradd -m -u 1101 -g oinstall -G dba,oper,asmdba -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
[root@racnode1 ~]# id oracle
uid=1101(oracle) gid=1000(oinstall) grupos=1000(oinstall),1201(asmdba),1300(dba),1301(oper)
[root@racnode1 ~]# passwd oracle
Cambiando la contraseña del usuario oracle.
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: todos los tokens de autenticación se actualizaron exitosamente.

Creación del profile del usuario grid.

Crearemos un profile personalizado para que al iniciar sesión con el usuario grid, nos cargue las variables de entorno que nosotros queramos.
Usaremos distintos ORACLE_SID para los distintos nodos del RAC.
racnode1: ORACLE_SID=+ASM1
racnode2: ORACLE_SID=+ASM2

[root@racnode1 /]# su - grid
[grid@racnode1 ~]$ > .bash_profile
[grid@racnode1 ~]$ vi .bash_profile
# ---------------------------------------------------
# .bash_profile
# ---------------------------------------------------
# OS User:      grid
# Application:  Oracle Grid Infrastructure
# Version:      Oracle 11g release 2
# ---------------------------------------------------

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
      . ~/.bashrc
fi

alias ls="ls -FA"

# ---------------------------------------------------
# ORACLE_SID
# ---------------------------------------------------
# Specifies the Oracle system identifier (SID)
# for the Automatic Storage Management (ASM)instance
# running on this node.
#

#Each RAC node must have a unique ORACLE_SID.
#

#(i.e. +ASM1, +ASM2,...)
# ---------------------------------------------------
ORACLE_SID=+ASM1; export ORACLE_SID

# ---------------------------------------------------
# JAVA_HOME
# ---------------------------------------------------
# Specifies the directory of the Java SDK and Runtime
# Environment.
# ---------------------------------------------------
JAVA_HOME=/usr/local/java; export JAVA_HOME

# ---------------------------------------------------
# ORACLE_BASE
# ---------------------------------------------------
# Specifies the base of the Oracle directory structure
# for Optimal Flexible Architecture (OFA) compliant
# installations. The Oracle base directory for the
# grid installation owner is the location where
# diagnostic and administrative logs, and other logs
# associated with Oracle ASM and Oracle Clusterware
# are stored.
# ---------------------------------------------------
ORACLE_BASE=/u01/app/grid; export ORACLE_BASE

# ---------------------------------------------------
# ORACLE_HOME
# ---------------------------------------------------
# Specifies the directory containing the Oracle
# Grid Infrastructure software. For grid
# infrastructure for a cluster installations, the Grid
# home must not be placed under one of the Oracle base
# directories, or under Oracle home directories of
# Oracle Database installation owners, or in the home
# directory of an installation owner. During
# installation, ownership of the path to the Grid
# home is changed to root. This change causes
# permission errors for other installations.
# ---------------------------------------------------
ORACLE_HOME=/u01/app/11.2.0/grid; export ORACLE_HOME

# ---------------------------------------------------
# ORACLE_PATH
# ---------------------------------------------------
# Specifies the search path for files used by Oracle
# applications such as SQL*Plus. If the full path to
# the file is not specified, or if the file is not
# in the current directory, the Oracle application
# uses ORACLE_PATH to locate the file.
# This variable is used by SQL*Plus, Forms and Menu.
# ---------------------------------------------------
ORACLE_PATH=/u01/app/oracle/common/oracle/sql; export ORACLE_PATH

# ---------------------------------------------------
# SQLPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# SQL*Plus searches for a login.sql file.
# ---------------------------------------------------
# SQLPATH=/u01/app/common/oracle/sql; export SQLPATH

# ---------------------------------------------------
# ORACLE_TERM
# ---------------------------------------------------
# Defines a terminal definition. If not set, it
# defaults to the value of your TERM environment
# variable. Used by all character mode products.
# ---------------------------------------------------
ORACLE_TERM=xterm; export ORACLE_TERM

# ---------------------------------------------------
# NLS_DATE_FORMAT
# ---------------------------------------------------
# Specifies the default date format to use with the
# TO_CHAR and TO_DATE functions. The default value of
# this parameter is determined by NLS_TERRITORY. The
# value of this parameter can be any valid date
# format mask, and the value must be surrounded by
# double quotation marks. For example:
#
#         NLS_DATE_FORMAT = "MM/DD/YYYY"
#
# ---------------------------------------------------
NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"; export NLS_DATE_FORMAT

# ---------------------------------------------------
# TNS_ADMIN
# ---------------------------------------------------
# Specifies the directory containing the Oracle Net
# Services configuration files like listener.ora,
# tnsnames.ora, and sqlnet.ora.
# ---------------------------------------------------
TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN

# ---------------------------------------------------
# ORA_NLS11
# ---------------------------------------------------
# Specifies the directory where the language,
# territory, character set, and linguistic definition
# files are stored.
# ---------------------------------------------------
ORA_NLS11=$ORACLE_HOME/nls/data; export ORA_NLS11

# ---------------------------------------------------
# PATH
# ---------------------------------------------------
# Used by the shell to locate executable programs;
# must include the $ORACLE_HOME/bin directory.
# ---------------------------------------------------
PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
PATH=${PATH}:/u01/app/common/oracle/bin
export PATH

# ---------------------------------------------------
# LD_LIBRARY_PATH
# ---------------------------------------------------
# Specifies the list of directories that the shared
# library loader searches to locate shared object
# libraries at runtime.
# ---------------------------------------------------
LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH

# ---------------------------------------------------
# CLASSPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# contain compiled Java classes.
# ---------------------------------------------------
CLASSPATH=$ORACLE_HOME/JRE
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export CLASSPATH

# ---------------------------------------------------
# THREADS_FLAG
# ---------------------------------------------------
# All the tools in the JDK use green threads as a
# default. To specify that native threads should be
# used, set the THREADS_FLAG environment variable to
# "native". You can revert to the use of green
# threads by setting THREADS_FLAG to the value
# "green".
# ---------------------------------------------------
THREADS_FLAG=native; export THREADS_FLAG

# ---------------------------------------------------
# TEMP, TMP, and TMPDIR
# ---------------------------------------------------
# Specify the default directories for temporary
# files; if set, tools that create temporary files
# create them in one of these directories.
# ---------------------------------------------------
export TEMP=/tmp
export TMPDIR=/tmp

# ---------------------------------------------------
# UMASK
# ---------------------------------------------------
# Set the default file mode creation mask
# (umask) to 022 to ensure that the user performing
# the Oracle software installation creates files
# with 644 permissions.
# ---------------------------------------------------
umask 022

Creación el profile del usuario oracle.
Usaremos distintos ORACLE_SID para los distintos nodos del RAC.
racnode1: ORACLE_SID=RACDB1
racnode2: ORACLE_SID=RACDB2

[root@racnode1 ~]# su - oracle
[oracle@racnode1 ~]$ > .bash_profile
[oracle@racnode1 ~]$ vi .bash_profile
# ---------------------------------------------------
# .bash_profile
# ---------------------------------------------------
# OS User:      oracle
# Application:  Oracle Database Software Owner
# Version:      Oracle 11g release 2
# ---------------------------------------------------

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
      . ~/.bashrc
fi

alias ls="ls -FA"

# ---------------------------------------------------
# ORACLE_SID
# ---------------------------------------------------
# Specifies the Oracle system identifier (SID) for
# the Oracle instance running on this node.
#

#Each RAC node must have a unique ORACLE_SID.
#

#(i.e. RACDB1, RACDB2,...)
# ---------------------------------------------------
ORACLE_SID=RACDB1; export ORACLE_SID

# ---------------------------------------------------
# ORACLE_UNQNAME
# ---------------------------------------------------
# In previous releases of Oracle Database, you were
# required to set environment variables for
# ORACLE_HOME and ORACLE_SID to start, stop, and
# check the status of Enterprise Manager. With
# Oracle Database 11g release 2 (11.2) and later, you
# need to set the environment variables ORACLE_HOME
# and ORACLE_UNQNAME to use Enterprise Manager.
# Set ORACLE_UNQNAME equal to the database unique
# name.
# ---------------------------------------------------
ORACLE_UNQNAME=RACDB; export ORACLE_UNQNAME

# ---------------------------------------------------
# JAVA_HOME
# ---------------------------------------------------
# Specifies the directory of the Java SDK and Runtime
# Environment.
# ---------------------------------------------------
JAVA_HOME=/usr/local/java; export JAVA_HOME

# ---------------------------------------------------
# ORACLE_BASE
# ---------------------------------------------------
# Specifies the base of the Oracle directory structure
# for Optimal Flexible Architecture (OFA) compliant
# database software installations.
# ---------------------------------------------------
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE

# ---------------------------------------------------
# ORACLE_HOME
# ---------------------------------------------------
# Specifies the directory containing the Oracle
# Database software.
# ---------------------------------------------------
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME

# ---------------------------------------------------
# ORACLE_PATH
# ---------------------------------------------------
# Specifies the search path for files used by Oracle
# applications such as SQL*Plus. If the full path to
# the file is not specified, or if the file is not
# in the current directory, the Oracle application
# uses ORACLE_PATH to locate the file.
# This variable is used by SQL*Plus, Forms and Menu.
# ---------------------------------------------------
ORACLE_PATH=/u01/app/common/oracle/sql; export ORACLE_PATH

# ---------------------------------------------------
# SQLPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# SQL*Plus searches for a login.sql file.
# ---------------------------------------------------
# SQLPATH=/u01/app/common/oracle/sql; export SQLPATH

# ---------------------------------------------------
# ORACLE_TERM
# ---------------------------------------------------
# Defines a terminal definition. If not set, it
# defaults to the value of your TERM environment
# variable. Used by all character mode products.
# ---------------------------------------------------
ORACLE_TERM=xterm; export ORACLE_TERM

# ---------------------------------------------------
# NLS_DATE_FORMAT
# ---------------------------------------------------
# Specifies the default date format to use with the
# TO_CHAR and TO_DATE functions. The default value of
# this parameter is determined by NLS_TERRITORY. The
# value of this parameter can be any valid date
# format mask, and the value must be surrounded by
# double quotation marks. For example:
#
#         NLS_DATE_FORMAT = "MM/DD/YYYY"
#
# ---------------------------------------------------
NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"; export NLS_DATE_FORMAT

# ---------------------------------------------------
# TNS_ADMIN
# ---------------------------------------------------
# Specifies the directory containing the Oracle Net
# Services configuration files like listener.ora,
# tnsnames.ora, and sqlnet.ora.
# ---------------------------------------------------
TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN

# ---------------------------------------------------
# ORA_NLS11
# ---------------------------------------------------
# Specifies the directory where the language,
# territory, character set, and linguistic definition
# files are stored.
# ---------------------------------------------------
ORA_NLS11=$ORACLE_HOME/nls/data; export ORA_NLS11

# ---------------------------------------------------
# PATH
# ---------------------------------------------------
# Used by the shell to locate executable programs;
# must include the $ORACLE_HOME/bin directory.
# ---------------------------------------------------
PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
PATH=${PATH}:/u01/app/common/oracle/bin
export PATH

# ---------------------------------------------------
# LD_LIBRARY_PATH
# ---------------------------------------------------
# Specifies the list of directories that the shared
# library loader searches to locate shared object
# libraries at runtime.
# ---------------------------------------------------
LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH

# ---------------------------------------------------
# CLASSPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# contain compiled Java classes.
# ---------------------------------------------------
CLASSPATH=$ORACLE_HOME/JRE
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export CLASSPATH

# ---------------------------------------------------
# THREADS_FLAG
# ---------------------------------------------------
# All the tools in the JDK use green threads as a
# default. To specify that native threads should be
# used, set the THREADS_FLAG environment variable to
# "native". You can revert to the use of green
# threads by setting THREADS_FLAG to the value
# "green".
# ---------------------------------------------------
THREADS_FLAG=native; export THREADS_FLAG

# ---------------------------------------------------
# TEMP, TMP, and TMPDIR
# ---------------------------------------------------
# Specify the default directories for temporary
# files; if set, tools that create temporary files
# create them in one of these directories.
# ---------------------------------------------------
export TEMP=/tmp
export TMPDIR=/tmp

# ---------------------------------------------------
# UMASK
# ---------------------------------------------------
# Set the default file mode creation mask
# (umask) to 022 to ensure that the user performing
# the Oracle software installation creates files
# with 644 permissions.
# ---------------------------------------------------
umask 022

Creación de directorios.

Para acabar con este apartado, crearemos los directorios necesarios para la instalación del software.

[root@racnode1 ~]# mkdir -p /u01/app/grid
[root@racnode1 ~]# mkdir -p /u01/app/11.2.0/grid
[root@racnode1 ~]# chown -R grid:oinstall /u01
[root@racnode1 ~]# mkdir -p /u01/app/oracle
[root@racnode1 ~]# chown oracle:oinstall /u01/app/oracle
[root@racnode1 ~]# chmod -R 775 /u01

9.- Configuración de límites de recursos para los usuarios.
Estos cambios los realizaremos en los dos nodos del RAC.

Para mejorar el rendimiento en sistemas Linux es necesario hacer algunos cambios en los límites de los usuarios oracle y grid.

Añadimos la configuración de límites para los usuarios oracle y grid.

[root@racnode1 ~]# vi /etc/security/limits.conf
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

Añadimos la siguiente fila si no existe.

[root@racnode1 ~]# vi /etc/pam.d/login
session    required     pam_limits.so

Añadimos al /etc/profile.

[root@racnode1 ~]# vi /etc/profile
if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
        if [ \$SHELL = "/bin/ksh" ]; then
                ulimit -p 16384
                ulimit -n 65536
        else
                ulimit -u 16384 -n 65536
        fi
umask 022
fi

9.- Configuración de Oracle Linux para Oracle Software.
Estos cambios los realizaremos en los dos nodos del RAC.

Memoria.

El mínimo de memoria para soportar Oracle grid infraestructure for cluster y Oracle RAC es 2,5 GB de RAM, además debemos asegurarnos que tenemos la suficiente memoria Swap, Oracle recomienda tener 1,5 veces la RAM para la memoria Swap en sistemas con 2GB de RAM o menos, para sistemas con RAM superior a 2GB será suficiente tener una Swap de igual tamaño que la RAM.

Vamos a hacer las comprobaciones necesarias.

[root@racnode2 by-path]# cat /proc/meminfo|grep MemTotal
MemTotal:        4057412 kB
[root@racnode2 by-path]# cat /proc/meminfo|grep SwapTotal
SwapTotal:       4063228 kB

En nuestro caso está todo correcto.

Parámetros del Kernel.

Oracle recomienda poner los siguientes parámetros, son valores mínimos si nuestro sistema tiene valores superiores no debemos cambiarlos.
Nuestro sistema ya incluye los parámetros kernel.shmallkernel.shmmax con valores superiores a los mínimos recomendados por oracle, por lo tanto esos los vamos a dejar tal y como están.



[root@racnode1 ~]# vim /etc/sysctl.conf

kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
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=1048576
fs.aio-max-nr=1048576

Activamos la configuración.

[root@racnode1 ~]# sysctl -p

9.- Configuración de ASMLib
Esta configuración se debe realizar en los dos nodos del RAC.

ASMLib es una libreria que da soporte al ASM software. ASM es el método de almacenamiento que vamos a usar para nuestra BD, almacenaremos los datos (datafiles, redo logs, control files ...), OCR y los voting disks, y la FRA.
No es totalmente necesario el uso de ASMLib, puesto que podríamos usar el "Standard Linux I/O" pero ASMLib se creó para mejorar el rendimiento respecto al Standard Unix I/O Api.

Instalamos el software que previamente hemos descargado de aquí, solo es necesario descargar el oracleasmlib, los otros dos paquetes los instalaremos desde el DVD de instalación.


root@racnode1 /]# cd /media/cdrom/Server

[root@racnode1 Server]# rpm -Uvh oracleasm-support-2.1.3-1.el5.x86_64.rpm
advertencia:oracleasm-support-2.1.3-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando...               ########################################### [100%]
   1:oracleasm-support      ########################################### [100%]
[root@racnode1 Server]# rpm -Uvh oracleasm-2.6.18-164.el5
oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm       oracleasm-2.6.18-164.el5xen-2.0.5-1.el5.x86_64.rpm
oracleasm-2.6.18-164.el5debug-2.0.5-1.el5.x86_64.rpm
[root@racnode1 Server]# rpm -Uvh oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm
advertencia:oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando...               ########################################### [100%]
   1:oracleasm-2.6.18-164.el########################################### [100%]
[root@racnode1 tmp]# rpm -Uvh /tmp/oracleasmlib-2.0.4-1.el5.x86_64.rpm
advertencia:oracleasmlib-2.0.4-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando...               ########################################### [100%]
   1:oracleasmlib           ########################################### [100%]



Configurando ASMLib

Para ver la configuración actual.

[root@racnode1 /]# oracleasm configure
ORACLEASM_ENABLED=false
ORACLEASM_UID=
ORACLEASM_GID=
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""

Para comenzar con la configuración.

[root@racnode1 by-path]# oracleasm configure -i
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting <ENTER> without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: grid
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done

Cargamos el módulo del Kernel oracleasm.

[root@racnode1 by-path]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Mounting ASMlib driver filesystem: /dev/oracleasm

10.- Creando discos ASM para Oracle
Esta configuración solo se debe realizar en uno de los nodos del RAC.

La creación de los discos ASM es necesario hacerla solo en uno de los dos nodos, por ejemplo en el noderac1, en el otro nodo haremos un scandisk para que reconozca los nuevos volúmenes.

Creamos los discos ASM.

[root@racnode1 /]# oracleasm createdisk CRS1 /dev/iscsi/rac-crs1/part1
Writing disk header: done
Instantiating disk: done
[root@racnode1 /]# oracleasm createdisk DATA1 /dev/iscsi/rac-data1/part1
Writing disk header: done
Instantiating disk: done
[root@racnode1 /]# oracleasm createdisk FRA1 /dev/iscsi/rac-fra1/part1
Writing disk header: done
Instantiating disk: done

Escaneamos discos en el segundo nodo.

[root@racnode2]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "DATA1"
Instantiating disk "CRS1"
Instantiating disk "FRA1"
[root@racnode2]# oracleasm listdisks
CRS1
DATA1
FRA1

11.- Tareas Pre-Instalación Oracle Grid Infraestructure
Esta configuración solo se debe realizar en uno de los dos nodos del RAC.

Descargamos el siguiente software desde aquí
Oracle Database 11g Release 2 (11.2.0.1.0) for Linux x86-64
Oracle Grid Infrastructure 11g Release 2 (11.2.0.1.0) for Linux x86-64

Descomprimimos el software de Grid con el usuario grid, y el software de Database con el usuario Oracle.

12.- Tareas Pre-Instalación Oracle Grid Infraestructure
Esta configuración se debe realizar en los dos nodos del RAC.

Es necesario instalar el paquete del sistema operativo cvuqdisk en ambos nodos del RAC. Si no instalamos este paquete la utilidad de verificación del clúster no podrá descubrir los discos compartidos.
Hemos descomprimido el software de grid en la ruta "/home/grid/software".
Instalamos el paquete "cvuqdisk".

[grid@racnode1 software]$ cd grid/rpm
[grid@racnode1 rpm]$ pwd
/home/grid/software/grid/rpm

Copiamos al racnode2 el paquete para instalarlo también.

[grid@racnode1 rpm]$ scp cvuqdisk-1.0.7-1.rpm grid@racnode2:/home/grid

Nos logueamos como root y exportamos la siguiente variable de entorno.

[grid@racnode1 rpm]$ su -
Contraseña:
[root@racnode1 rpm]# export CVUQDISK_GRP=oinstall

[grid@racnode2 ~]$ su -
Contraseña:
[root@racnode2 ~]# cd /home/grid/
[root@racnode2 grid]# export CVUQDISK_GRP=oinstall

[root@racnode1 rpm]# rpm -iv cvuqdisk-1.0.7-1.rpm
Preparando paquetes para la instalación...
cvuqdisk-1.0.7-1

[root@racnode2 grid]# rpm -iv cvuqdisk-1.0.7-1.rpm
Preparando paquetes para la instalación...
cvuqdisk-1.0.7-1

13.- Instalación Oracle Grid Infraestructure for a Cluster
Esta configuración se debe realizar en uno de los dos nodos del RAC.

Antes de empezar con la instalación vamos a hacer un "pequeño truco" para evitar un error al finalizar la instalación. Como estamos haciendo una instalación de test y la vamos a hacer sin ningún servidor DNS o GNS, como se puede ver mas adelante, el instalador al acabar hace una validación y falla. Vamos a hacer una solución un tanto casera, vamos a modificar el nslookup para que piense que el nombre racnode-cluster-scan lo resuelve via servidor dns en lugar de resolverlo via /etc/hosts.

Renombramos el nslookup

[root@racnode1 ~]# mv /usr/bin/nslookup /usr/bin/nslookup.original

Creamos un script que se llama nslookup con el siguiente código. Imaginemos que nuestro servidor DNS es 192.168.1.100


#!/bin/bash


HOSTNAME=${1}


if [[ $HOSTNAME = "racnode-cluster-scan" ]]; then


    echo "Server:          192.168.1.100"


    echo "Address:         192.168.1.100#53"


    echo "Non-authoritative answer:"
    echo "Name:    racnode-cluster-scan"


    echo "Address:  10.0.9.230"


else
    /usr/bin/nslookup.original $HOSTNAME
fi


Le damos los permisos correctos.


[root@racnode1 ~]# chmod 755 /usr/bin/nslookup

Comprobamos que lo esta resolviendo correctamente.

[root@racnode1 ~]# nslookup racnode-cluster-scan
Server:          192.168.1.100
Address:         192.168.1.100#53
Non-authoritative answer:
Name:    racnode-cluster-scan
Address:  10.0.9.230

Empezamos con la instalación.

[grid@racnode1 grid]$ cd /home/grid/software/grid/
[grid@racnode1 grid]$ export DISPLAY=10.0.0.100:0.0
[grid@racnode1 grid]$ ./runInstaller









































































































Añadimos el racnode2 tal y como se muestra en la imagen, y configuramos el SSH introduciendo la contraseña del usuario grid del sistema operativo.

































Identificamos las redes de los nodos como Pública la que es pública y Privada la que se va a destinar para el uso privado.





























Creamos un grupo para el CRS con el volumen CRS1 que hemos creado anteriormente. Seleccionamos redundancia externa porque la protección en nuestro caso nos lo proporciona nuestro almacenamiento externo.























































































































































































Ejecutamos los scripts que nos pide para finalizar con la instalación, en los dos nodos del rac.

[root@racnode1 ~]# /u01/app/oraInventory/orainstRoot.sh
Cambiando permisos de /u01/app/oraInventory.
Agregando permisos de lectura y escritura para el grupo.
Eliminando permisos de lectura, escritura y ejecución para el público.

Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado

[root@racnode2 ~]# /u01/app/oraInventory/orainstRoot.sh
Creando el archivo de punteros del inventario de Oracle (/etc/oraInst.loc)
Cambiando permisos de /u01/app/oraInventory.
Agregando permisos de lectura y escritura para el grupo.
Eliminando permisos de lectura, escritura y ejecución para el público.

Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado


Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado
[root@racnode1 Server]# /u01/app/11.2.0/grid/root.sh
Running Oracle 11g root.sh script...


The following environment variables are set as:
    ORACLE_OWNER= grid
    ORACLE_HOME=  /u01/app/11.2.0/grid


Enter the full pathname of the local bin directory: [/usr/local/bin]:
   Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...




Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2012-07-12 16:34:26: Parsing the host name
2012-07-12 16:34:26: Checking for super user privileges
2012-07-12 16:34:26: User has super user privileges
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
  root wallet
  root wallet cert
  root cert export
  peer wallet
  profile reader wallet
  pa wallet
  peer wallet keys
  pa wallet keys
  peer cert request
  pa cert request
  peer cert
  pa cert
  peer root cert TP
  profile reader root cert TP
  pa root cert TP
  peer pa cert TP
  pa peer cert TP
  profile reader pa cert TP
  profile reader peer cert TP
  peer user cert
  pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
CRS-2672: Intentando iniciar ''ora.gipcd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.mdnsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gpnpd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssdmonitor'' en ''racnode1''
CRS-2676: El inicio de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.diskmon'' en ''racnode1''
CRS-2676: El inicio de ''ora.diskmon'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.ctssd'' en ''racnode1''
CRS-2676: El inicio de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente


ASM se ha creado e iniciado correctamente.


El grupo de discos CRS se ha creado correctamente.


clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-2672: Intentando iniciar ''ora.crsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-4256: Updating the profile
Successful addition of voting disk 3ab5ad5212924f10bf919e96d6983692.
Successfully replaced voting disk group with +CRS.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   3ab5ad5212924f10bf919e96d6983692 (ORCL:CRS1) [CRS]
Located 1 voting disk(s).
CRS-2673: Intentando parar ''ora.crsd'' en ''racnode1''
CRS-2677: La parada de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.asm'' en ''racnode1''
CRS-2677: La parada de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.ctssd'' en ''racnode1''
CRS-2677: La parada de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.cssdmonitor'' en ''racnode1''
CRS-2677: La parada de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.cssd'' en ''racnode1''
CRS-2677: La parada de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.gpnpd'' en ''racnode1''
CRS-2677: La parada de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.gipcd'' en ''racnode1''
CRS-2677: La parada de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.mdnsd'' en ''racnode1''
CRS-2677: La parada de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.mdnsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gipcd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gpnpd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssdmonitor'' en ''racnode1''
CRS-2676: El inicio de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.diskmon'' en ''racnode1''
CRS-2676: El inicio de ''ora.diskmon'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.ctssd'' en ''racnode1''
CRS-2676: El inicio de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.asm'' en ''racnode1''
CRS-2676: El inicio de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.crsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.evmd'' en ''racnode1''
CRS-2676: El inicio de ''ora.evmd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.asm'' en ''racnode1''
CRS-2676: El inicio de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.CRS.dg'' en ''racnode1''
CRS-2676: El inicio de ''ora.CRS.dg'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.registry.acfs'' en ''racnode1''
CRS-2676: El inicio de ''ora.registry.acfs'' en ''racnode1'' se ha realizado correctamente


racnode1     2012/07/12 16:38:54     /u01/app/11.2.0/grid/cdata/racnode1/backup_20120712_163854.olr
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
Updating inventory properties for clusterware
Iniciando Oracle Universal Installer...


Comprobando el espacio de intercambio: debe ser mayor que 500 MB.   Real 5951 MB    Correcto
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList' realizado correctamente.


14.- Comprobaciones sobre la instalación de Grid.
Esta comprobaciones se deben realizar en los dos nodos el RAC.

Ejecutaremos las siguientes comprobaciones con el usuario grid.


Check estado CRS.

[grid@racnode1 ~]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

Check de los recursos de Clusterware.
[grid@racnode1 ~]$ crs_stat -t -v
Name           Type           R/RA   F/FT   Target    State     Host
----------------------------------------------------------------------
ora.CRS.dg     ora....up.type 0/5    0/     ONLINE    ONLINE    racnode1
ora....ER.lsnr ora....er.type 0/5    0/     ONLINE    ONLINE    racnode1
ora....N1.lsnr ora....er.type 0/5    0/0    ONLINE    ONLINE    racnode1
ora.asm        ora.asm.type   0/5    0/     ONLINE    ONLINE    racnode1
ora.eons       ora.eons.type  0/3    0/     ONLINE    ONLINE    racnode1
ora.gsd        ora.gsd.type   0/5    0/     OFFLINE   OFFLINE
ora....network ora....rk.type 0/5    0/     ONLINE    ONLINE    racnode1
ora.oc4j       ora.oc4j.type  0/5    0/0    OFFLINE   OFFLINE
ora.ons        ora.ons.type   0/3    0/     ONLINE    ONLINE    racnode1
ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    racnode1
ora....E1.lsnr application    0/5    0/0    ONLINE    ONLINE    racnode1
ora....de1.gsd application    0/5    0/0    OFFLINE   OFFLINE
ora....de1.ons application    0/3    0/0    ONLINE    ONLINE    racnode1
ora....de1.vip ora....t1.type 0/0    0/0    ONLINE    ONLINE    racnode1
ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    racnode2
ora....E2.lsnr application    0/5    0/0    ONLINE    ONLINE    racnode2
ora....de2.gsd application    0/5    0/0    OFFLINE   OFFLINE
ora....de2.ons application    0/3    0/0    ONLINE    ONLINE    racnode2
ora....de2.vip ora....t1.type 0/0    0/0    ONLINE    ONLINE    racnode2
ora....ry.acfs ora....fs.type 0/5    0/     ONLINE    ONLINE    racnode1
ora.scan1.vip  ora....ip.type 0/0    0/0    ONLINE    ONLINE    racnode1

Check nodos del cluster.
[grid@racnode1 ~]$ olsnodes -n
racnode1        1
racnode2        2

Check del listener.
[grid@racnode1 ~]$ ps -ef|grep tns
grid      6686     1  0 09:11 ?        00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER_SCAN1 -inherit
grid      7577     1  0 09:24 ?        00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
grid      8833  8644  0 09:32 pts/1    00:00:00 grep tns
grid     30503     1  0 08:44 ?        00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit

Confirmación ASM funcionando para CRS.
[grid@racnode1 ~]$ srvctl status asm -a
ASM se está ejecutando en racnode1,racnode2
ASM está activada.

Check Oracle Cluster Registry
[grid@racnode1 ~]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
         Version                  :          3
         Total space (kbytes)     :     262120
         Used space (kbytes)      :       2404
         Available space (kbytes) :     259716
         ID                       :  864014600
         Device/File Name         :       +CRS
                                    Device/File integrity check succeeded

                                    Device/File not configured

                                    Device/File not configured

                                    Device/File not configured

                                    Device/File not configured

         Cluster registry integrity check succeeded

         Logical corruption check bypassed due to non-privileged user

Check voting disk.
[grid@racnode1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   9b71f02b34904fb0bf5f6ce2460dd50e (ORCL:CRS1) [CRS]
Located 1 voting disk(s).

Backup de root.sh

Oracle recomienda hacer backup del archivo root.sh por si se instala otro software en la misma ubicación, éste sobreescribiría el root.sh de esta instalación con el de la nueva instalación.

[root@racnode1 ~]# cd /u01/app/11.2.0/grid/
[root@racnode1 grid]# cp root.sh root.sh-BACKUP

[root@racnode2 ~]# cd /u01/app/11.2.0/grid/
[root@racnode2 grid]# cp root.sh root.sh-BACKUP

15.- Creación de volúmenes ASM para la base de datos.
Solo en uno de los dos nodos el RAC.

Hasta ahora sólo hemos creado un volúmen ASM, el +CRS, para almacenar los Oracle Clusterware Files y el voting disk, ahora debemos crear los otros dos grupos que vamos a necesitar para la base de datos, +DATA para almacenar todos los datos físicos como los datafiles, redo log, control files, archive logs... , y el volúmen +FRA, para la flash recovery area.


Con el usuario grid ejecutamos el asistente.



[grid@racnode1 ~]$ asmca &






















Pulsamos sobre el botón crear, para crear los nuevos grupos +DATA y +FRA.
































Para finalizar pulsamos sobre el botón salir.

16.- Instalación Oracle Database Software.
Solo en uno de los dos nodos el RAC.

La instalación se realizará desde el racnode1 con el usuario oracle, como en la instalación de Oracle Grid, el software se copiará automáticamente por SSH desde el racnode1 al racnode2.


Empezamos con la instalación.



[oracle@racnode1 database]$ ./runInstaller
Iniciando Oracle Universal Installer...





















































Seleccionamos la opción "Base de datos Real Application Clusters", escribimos la contraseña del usuario Oracle, pulsamos sobre "configurar", "probar" y "Siguiente".





















































Elegimos la versión que queramos para nuestra instalación.










































































































17.- Creación base de datos.
Solo en uno de los dos nodos el RAC.

La creación de la base de datos se lanzará desde uno de los dos nodos del rac, en nuestro caso lo haremos desde el racnode1.


[oracle@racnode1 ~]$ dbca &

Seleccionamos Base de datos Oracle Real Applications Cluster.

















































Seleccionamos "Personalizar base de datos".

























Configuramos el nombre de la BD y el SID, seleccionamos los dos nodos del RAC.

















































































































































Configuramos los parámetros según el hardware del que disponemos.

























Lo personalizamos a nuestro gusto, o según nuestras necesidades, como es una BD de test yo lo dejo todo por defecto.

























Terminamos creando la base de datos.

























Una vez nos salga la ventana informando que la instalación ha finalizado, ya podremos acceder a nuestra Base de datos con Enterprise Manager.


















Ya hemos acabado con la instalación!

18.- Configuración tnsnames.
Solo en el equipo cliente.

Para probar la infraestructura RAC que acabamos de finalizar es necesario que nos configuremos el tnsnames correctamente desde nuestro equipo cliente.

Contra el SCAN.

RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode-cluster-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RACDB.test)
    ))

Directamente contra los Nodos del cluster.


RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1522))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RACDB.test)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )


Es imprescindible que nuestro equipo sea capaz de resolver el nombre del scan, en este caso "racnode-cluster-scan", si no puede resolver este nombre nos aparecerá el error: "ORA-12545: Connect failed because target host or object does not exist".

Un saludo,