Configure the Network Environment to Allow Connections to Multiple Databases

1. Documentación en Tahiti -> Masters Book List -> Net Services Administrator’s Guide -> 9 Configuring and Administering Oracle Net Listener

Documentación en Tahiti -> Masters Book List -> Administrator’s Guide -> 2 Creating and Configuring an Oracle Database ->
Creating a Database with the CREATE DATABASE Statement

2. En este objetivo, basicamente no están pidiendo que configuramos el LISTENER para que redirija peticiones a varias BD distintas. Para hacer la prueba vamos a crear una BD manualmente (que también es interesante que hagamos este ejercicio) y veremos como el LISTENER que hemos creado puede atender peticiones para las dos BBDD (OCM y OCMTEST).

3. Creamos la BD OCMTEST.

# Definimos las variables de sesión
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=OCMTEST

# Creamos el archivo de configuración a partir del ejemplo de la documentación
# · http://docs.oracle.com/cd/E11882_01/server.112/e25494/create005.htm#CIAGFFIE
vi $ORACLE_HOME/dbs/initOCMTEST.ora
# Introducimos estas lineas
db_name='OCMTEST'
memory_target=300M
processes = 150
audit_file_dest='/u01/app/oracle/admin/OCMTEST/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='/u01/app/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = '/u01/app/oracle/oradata/OCMTEST/control01.ctl','/u01/app/oracle/flash_recovery_area/OCMTEST/control02.ctl'
compatible ='11.2.0'
-- Nos conectamos a la Instancia con SQL*Plus "sqlplus / as sysdba" para crear el SPFILE
CREATE SPFILE FROM PFILE;
# Creamos los directorios que hemos configurado en el SPFILE y otros que necesitaremos más adelante
mkdir -p /u01/app/oracle/admin/OCMTEST/adump
mkdir -p /u01/app/oracle/oradata/OCMTEST
mkdir -p /u02/app/oracle/oradata/OCMTEST
mkdir -p /u01/app/oracle/flash_recovery_area/OCMTEST/

# Levantamos la instancia en modo NOMOUNT
# Este comando nos va a dar un error (ORA-845) ya que tenemos que aumentar el FS temporal (tmpfs)
# Para ampliarlo temporalmente (para este ejercicio) debemos ejecutar como root el siguiente comando:
mount -o remount,size=1G /dev/shm
-- Ahora ya podemos levantar la instancia
STARTUP NOMOUNT

-- Creamos la BD
-- Para ello, adaptamos el ejemplo de la documentación
-- Modificamos Passwords, Rutas, Juego de Caracteres y TBS de UNDO
CREATE DATABASE OCMTEST
   USER SYS IDENTIFIED BY *************
   USER SYSTEM IDENTIFIED BY *************
   LOGFILE GROUP 1 ('/u01/app/oracle/oradata/OCMTEST/redo101.log','/u02/app/oracle/oradata/OCMTEST/redo102.log') SIZE 100M BLOCKSIZE 512,
           GROUP 2 ('/u01/app/oracle/oradata/OCMTEST/redo201.log','/u02/app/oracle/oradata/OCMTEST/redo202.log') SIZE 100M BLOCKSIZE 512,
           GROUP 3 ('/u01/app/oracle/oradata/OCMTEST/redo301.log','/u02/app/oracle/oradata/OCMTEST/redo302.log') SIZE 100M BLOCKSIZE 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET AL32UTF8
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/u01/app/oracle/oradata/OCMTEST/system01.dbf' SIZE 325M REUSE
   SYSAUX DATAFILE '/u01/app/oracle/oradata/OCMTEST/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/u01/app/oracle/oradata/OCMTEST/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/u01/app/oracle/oradata/OCMTEST/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs1
      DATAFILE '/u01/app/oracle/oradata/OCMTEST/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

-- Creamos el Diccionario de Datos
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
CONNECT SYSTEM
@?/sqlplus/admin/pupbld.sql
-- Estamos haciendo una instalación mínima de Oracle. Si comparamos con la instalación con DBCA, se instalan entre otros estos paquetes:
-- Tenemos una descripción de que hace cada uno en la documentación (http://docs.oracle.com/cd/E11882_01/server.112/e25513/scripts.htm#REFRN005)
-- @/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/catblock.sql;
-- @/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/catoctk.sql;
-- @/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/owminst.plb;
-- connect "SYSTEM"/"systemPassword"
-- @/u01/app/oracle/product/11.2.0/dbhome_1/sqlplus/admin/help/hlpbld.sql helpus.sql;

-- Activaremos los modos ARCHIVELOG y FLASHBACK
CONN / AS SYSDBA
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG
ALTER DATABASE FLASHBACK ON
ALTER DATABASE OPEN

4. Sin hacer ninguna modificación, el proceso PMON de la nueva BD (OCMTEST) registrará los servicios dinámicamente en el LISTENER que ya tenemos. Esto se debe a que tenemos el LISTENER en el puerto por defecto en el interfaz asociado al hostname de la máquina. Si cambiaramos algunos de estos parámetros, tendríamos que configurar una entrada en el fichero tnsnames.ora que apunte a ese LISTENER concreto y añadir la entrada al parámetro LOCAL_LISTENER de la instancia OCMTEST.

# Comprobamos que tras un minutos al haber levantado la instancia OCMTEST se registra en el LISTENER
lsnrctl services
# Veremos como el servicio OCMTEST tiene el status READY.

# Podemos añadir el servicio de forma estática en la configuración del listener.ora (pero no es necesario)
# Para ello modificamos la entrada SID_LIST_LISTENER del fichero $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = OCM)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = OCM)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = OCMTEST)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = OCMTEST)
    )
  )
# Recargamos la configuración del LISTENER
lsnrctl reload

5. Ahora, para completa la configuración de red, es buena práctica añadir la entrada del servicio OCMTEST en el fichero tnsnames.ora.

# Añadimos las siguientes lineas al fichero $ORACLE_HOME/network/admin/tnsnames.ora
OCMTEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ocm.dbajunior.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = OCMTEST)
    )
  )
# Probamos la configuración
sqlplus system@OCMTEST

6. Ahora deshacemos todos los cambios y borramos la BD.

# Borramos la entrada OCMTEST del fichero tnsnames.ora
OCMTEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ocm.dbajunior.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = OCMTEST)
    )
  )

# Editamos la entrada de SID_LIST_LISTENER del fichero listener.ora de la siguiente forma
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = OCM)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = OCM)
    )
  )
# Recargamos la configuración del LISTENER
lsnrctl reload

# Borramos la BD "con cuidado" 😉
# Comprobamos el ORACLE_SID = OCMTEST
echo $ORACLE_SID
# Entramos a la instancia con SQL*Plus
sqlplus / as sysdba
-- Procedemos a borrar la BD comprobando que es la que queremos borrar (OCMTEST) en la máquina OCM
SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;
-- Tenemos que poner la BD en modo MOUNT, EXCLUSIVE y RESTRIC (casi nada)
STARTUP MOUNT EXCLUSIVE RESTRICT FORCE
-- Ejecutamos el DROP
DROP DATABASE;
# Por último, borramos los directorios y archivos innecesarios
rm -Rf /u01/app/oracle/admin/OCMTEST
rm -Rf /u01/app/oracle/oradata/OCMTEST
rm -Rf /u02/app/oracle/oradata/OCMTEST
rm -Rf /u01/app/oracle/flash_recovery_area/OCMTEST
rm $ORACLE_HOME/dbs/*OCMTEST*