Introduccion a los servicios de Oracle

Uno de los elementos mas potentes que introdujo Oracle en la versión 10g fué el uso de servicios.
Los servicios de Oracle no son otra cosa que una abstracción lógica de una instancia de base de datos. Aunque los servicios tienen mas sentido en entorno RAC, hoy vamos a ver como se configuran y para que pueden servir en un entorno de «single instance».

Supongamos tenemos una base de datos produccion en la que tenemos consolidados 4 entornos distintos ( Webfotos,Cargas,Contabilidad y Desarrollo ) que acceden a nuestra instancia con el mismo esquema,y desde servidores de aplicaciones que comparten máquina entre ellos, en el momento en que la base de datos tiene problemas nos es muy difícil el saber quien es quien.
Si pudiésemos discriminar las conexiones por una agrupación lógica, sería mas fácil el verlo, y , mas aún, si el EMC fuese capaz de separar las gráficas y estadísticas por esa agrupación.

Pues esto es exactamente lo que nos proporcionan los servicios Oracle.
En nuestro caso ficticio, vamos a crear los distintos servicios:

  • Webfotos
  • Cargas
  • Contabilidad
  • Desarrollo

De esta forma, cada conexión de estos 4 entornos usara un service_name distinto en su TNS_NAMES de cliente, y , la base de datos podrá identificar ( y limitar) a cada uno de ellos de manera separada.

Lo primero que tendremos que hacer es crear los servicios. Para esto tenemos dos maneras, o bien desde el srvctl ( en caso de RAC,Grid control u Oracle restart), o mediante el paquete DBMS_SERVICES , como nuestro caso es el de una «single instance», no nos va a quedar mas remedio que usar este paquete.
Mediante la función CREATE_SERVICE crearemos los servicios de la manera:

exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'webfotos', NETWORK_NAME=>'webfotos')
exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'cargas', NETWORK_NAME=>'cargas')
exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'contabilidad', NETWORK_NAME=>'contabilidad')
exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'desarrollo', NETWORK_NAME=>'desarrollo')

Una vez creados los servicios, los arrancaremos con la función

exec dbms_service.START_SERVICE('webfotos')
exec dbms_service.START_SERVICE('cargas')
exec dbms_service.START_SERVICE('contabilidad')
exec dbms_service.START_SERVICE('desarrollo')

Para comprobar si la creación de nuestros servicios ha funcionado, podemos chequear el parámetro service_names

SQL> select value from v$parameter where NAME='service_names';
VALUE
---------------------------
produccion,webfotos,cargas,contabilidad,desarrollo

O bien el listener con lsnrctl services

[oracle@blog] [$lsnrctl services

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 17-MAY-2013 13:31:06

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
Service "produccion" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         LOCAL SERVER
Service "webfotos" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         LOCAL SERVER
Service "contabilidad" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         LOCAL SERVER
Service "desarrollo" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         LOCAL SERVER
Service "cargas" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         LOCAL SERVER
The command completed successfully

Ahora, solamente tendremos que modificar los respectivos TNSNAMES de los distntos entornos para que se conecten mediante SERVICE_NAME y no mediante SID y tendremos identificados cada una de la sesiones de oracle con el servicio.

¿que beneficios nos aporta todo esto?

  • Trazabilidad: Nos va a ser sencillísimo encontrar quien es el que esta haciendo algo ya que en un primer vistazo encontraremos al culpable «logico» del problema, una vez tenemos el origen del problema es mas sencillo abordarlo.
  • Accounting: Vamos a poder ser capaces de ver los consumos de cada aplicacion/grupo lógico en la base de datos, lo que nos puede ser muy bueno a la hora de derivar costes o limitar recursos
  • control de accesos: Si en un momento específico queremos asegurarnos de que un elemento lógico no acceda a la aplicacion, podemos detener el servicio y el resto funcionaría correctamente.Esto puede ser muy útil por ejemplo, para evitar cargas en horario diurno, o para controlar los equipos de desarrollo

Hasta ahora lo hemos visto todo muy fácil, pero .. ¿que ocurre cuando reinicias la base de datos?.
Para que la instancia levante los servicios al arrancar deberán de estar en el init.ora con la sintaxsis:


service_names='produccion','webfotos','cargas','desarrollo'

Si no es así , cuando se levante nuestra base de datos no se levantan los servicios, y esto hace que no funcione nada de lo que apunta a ellos.
La solución como os decía la principio es hacerlo desde el srvctl, pero …
¿como lo hacemos si no tenemos RAC,Grid u Oracle restart?
La respuesta es brutalmente sencilla.

[oracle@blog] [$sqlplus "/as sysdba"
SQL*Plus: Release 11.2.0.2.0 Production on Vie May 17 13:09:11 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> alter system set service_names='produccion,webfotos,cargas,contabilidad,desarrollo';
System altered.

Tan sencillo como acabáis de ver, simplemente hemos de conectarnos desde el sqlplus y hacer un ALTER SYSTEM para el parámetro service_names poniendo nuestros servicios separados por comas.

Como siempre, para mas información, tenemos la documentación de Oracle del paqueteDBMS_SERVICES

Problemas con glibc-devel instalando OEM 12c (crt1.o)

Hoy vamos a ver la solución a un problema en la instalación de OEM 12c bajo Oracle linux 6.4

Si miramos la documentación de la instalación en el apartado de paquetes tenemos que necesitamos los paquetes:

  • glibc-devel-2.5-49-i686 (This is a 32-bit package)
  • glibc-devel-2.5-49-x86_64 (This is a 64-bit package)

Sin embargo, si miramos lo que tenemos en la distribución,

[root@emc ~]# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})\n" | grep glibc-dev
glibc-devel-2.12-1.107.el6(x86_64)

Y a la hora de instalar otro glibc-devel nos dice que ya está instalado

[root@emc ~]# yum install glibc-devel-2.12-1.80.el6
Loaded plugins: security
Setting up Install Process
Package matching glibc-devel-2.12-1.80.el6.x86_64 already installed. Checking for update.
Nothing to do

Si intentamos instalar , llega aun punto en que nos da un error de linkado, y es que no encuentra la librería crt1.o


INFO: Salida final del proceso iniciado.
INFO: ----------------------------------
INFO: Excepción devuelta de la acción: make
Nombre de la Excepción: MakefileException
Cadena de la Excepción: Error al llamar al destino 'install' del archivo make '/oem/oem12c/oms/sqlplus/lib/ins_sqlplus.mk'. 
Consulte '/oraInventory/logs/installActions-XX.log' para obtener más información.
Gravedad de la Excepción: 1
INFO: POPUP WARNING:Error al llamar al destino 'install' del archivo make '/oem/oem12c/oms/sqlplus/lib/ins_sqlplus.mk'. Consulte '/oraInventory/logs/installActions-XX.log' para obtener más información.

Haga clic en  "Reintentar" para volver a intentarlo.
Haga clic en "Ignorar" para ignorar este error y continuar.
Haga clic en "Cancelar" para parar esta instalación.

Este error estaba en el proceso de linkado delsqlplus, con el error

/usr/bin/ld: crt1.o: No suxh file or directory

La solución es tremendamente sencilla, y pasa un poco por la comprension del Oracle Linux, y es que,debemos instalar una librería del formato i396 (i696 para Oracle Linux), el problema , es que, cuando ejecutamos el yum este no instala las librerias de i686 debido a que nuestro sistema es x64.

Así pues, hay que forzarle a que instale el paquete de i386 (i686) con el comando


yum install glibc-devel.i686

Con este comando, tendremos los dos paquetes instalados

[root@emc ~]# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})\n" 
 | grep glibc-dev

glibc-devel-2.12-1.107.el6(x86_64)
glibc-devel-2.12-1.107.el6(i686)

Y la instalación continuará sin problemas

Opatch, Parcheando la base de datos

Vamos de vuelta con las entradas «for dummies». Hoy vamos a ver la heraamienta de parcheado de Oracle, Opatch

Opatch es un binario que suele estar en el directorio $ORACLE_HOME/OPatch , este directorio no está en la ruta de los binarios, con lo que , probablemente si desde linea de comandos de oracle ejecutas «opatch» no encuentres nada.

Otra de las características mas importantes del Opatch es que es bastante independiente, es decir, al ahora de un parcheado, puedes instalar la ultima versión del Opatch sin interferir con la base de datos, podréis encontrar mas información de esto en soporte con la nota «How To Download And Install The Latest OPatch Version [ID 274526.1]», pero básicamente os adelanto que los pasos son:

  • Descargar el .tgz del ultimo opatch
  • Renombrar el subdirectorio actual ( mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch-fecha )
  • Descomprimir el nuevo opatch ( cd $ORACLE_HOME ; unzup /mnt/downloas/opatch.tgz )

Como decíamos al principio, Opatch es la herramienta que se utiliza para el parcheado de las bases de datos, su uso exacto está descrito en cada uno de los README.TXT del parche a aplicar, con lo que , SIEMPRE hay que seguir esos pasos, pero , en esta entrada vamos a ver la salida básica de algunos casos en los que se usa

Supongamos queremos instalar el parche 8730312, para ello lo descargaremos, y lo descomprimiremos en /home/oracle/parches/

    Comprobacion de prerequisitos de un parche

Lo primero que deberíamos de hacer es comprobar que no va ha haber ningún conflicto entre nuestro parche y la instalacion actual, para ello lanzaremos el Opatch con la opcion CheckConflictAgainstOHWithDetail

[oracle@pruebas1.pamplona.name] [$   ./opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /home/oracle/parches/
Invoking OPatch 11.1.0.6.6

Oracle Interim Patch Installer version 11.1.0.6.6
Copyright (c) 2009, Oracle Corporation.  All rights reserved.

PREREQ session

Oracle Home       : /opt/oracle/product/11.1/dbhome_1
Central Inventory : /oracle/oraInventory
   from           : /etc/oraInst.loc
OPatch version    : 11.1.0.6.6
OUI version       : 11.2.0.1.0
OUI location      : /opt/oracle/product/11.1/dbhome_1/oui
Log file location : /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch2013-03-07_18-45-30PM.log
Patch history file: /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch_history.txt
Invoking prereq "checkconflictagainstohwithdetail"
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
    Instalación del parche

Una vez tenemos claro que podemos aplicarlo, lo aplicamos siguiendo el README.txt del parche.
La salida del comando de aplicación será algo similar a esto.

 ./opatch apply /home/oracle/parches/8730312/
Invoking OPatch 11.1.0.6.6

Oracle Interim Patch Installer version 11.1.0.6.6
Copyright (c) 2009, Oracle Corporation.  All rights reserved.

Oracle Home       : /opt/oracle/product/11.1/dbhome_1
Central Inventory : /oracle/oraInventory
   from           : /etc/oraInst.loc
OPatch version    : 11.1.0.6.6
OUI version       : 11.2.0.1.0
OUI location      : /opt/oracle/product/11.1/dbhome_1/oui
Log file location : /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch2013-03-01_16-11-15PM.log
Patch history file: /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch_history.txt
ApplySession applying interim patch '8730312' to OH '/opt/oracle/product/11.1/dbhome_1'
Running prerequisite checks...
OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only.

Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/opt/oracle/product/11.1/dbhome_1')

Is the local system ready for patching? [y|n]  y
User Responded with: Y
Backing up files and inventory (not for auto-rollback) for the Oracle Home
Backing up files affected by the patch '8730312' for restore. This might take a while...
Backing up files affected by the patch '8730312' for rollback. This might take a while...

Patching component oracle.rdbms, 11.2.0.1.0...
Updating archive file "/opt/oracle/product/11.1/dbhome_1/lib/libserver11.a"  with "lib/libserver11.a/kewa.o"
Updating archive file "/opt/oracle/product/11.1/dbhome_1/lib/libserver11.a"  with "lib/libserver11.a/kewast.o"
Running make for target ioracle
ApplySession adding interim patch '8730312' to inventory

Verifying the update...
Inventory check OK: Patch ID 8730312 is registered in Oracle Home inventory with proper meta-data.
Files check OK: Files from Patch ID 8730312 are present in Oracle Home.

The local system has been patched and can be restarted.
OPatch succeeded.
    Ver los parches que tienes instalados

Una de las funcionalidades es el ver que parches tienes instalados, para ello, solamente hay que ir al directorio donde está el Opatch y ejecutar el comando con el flag lsinventory

[oracle@pruebas1.pamplona.name] [$ cd  $ORACLE_HOME/OPatch
[oracle@pruebas1.pamplona.name] [$ ./opatch lsinventory
Invoking OPatch 11.1.0.6.6
Oracle Interim Patch Installer version 11.1.0.6.6
Copyright (c) 2009, Oracle Corporation.  All rights reserved.
Oracle Home       :/opt/oracle/product/11.1/dbhome_1
Central Inventory : /oracle/oraInventory
   from           : /etc/oraInst.loc
OPatch version    : 11.1.0.6.6
OUI version       : 11.2.0.1.0
OUI location      : /opt/oracle/product/11.1/dbhome_1
Log file location : /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch2013-03-26_11-46-16AM.log

Patch history file: /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/opatch_history.txt

Lsinventory Output file location : /opt/oracle/product/11.1/dbhome_1/cfgtoollogs/opatch/lsinv/lsinventory2013-03-26_11-46-16AM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (1):

Oracle Database 11g                                                  11.2.0.1.0
There are 1 products installed in this Oracle Home.

Interim patches (1) :

Patch  8730312      : applied on Fri Mar 01 16:12:29 CET 2013
Unique Patch ID:  12177426
   Created on 7 Feb 2010, 06:41:26 hrs PST8PDT
   Bugs fixed:
     8730312
--------------------------------------------------------------------------------

OPatch succeeded.

Aquí podemos ver como tenemos aplicado el parche 8730312 , la fecha en la que se aplicó y el bug que soluciona.

Como siempre, mas información en soporte en las notas

  • 274526.1 How To Download And Install The Latest OPatch Version
  • 458485.1 How to find whether the one-off Patches will conflict or not?
  • 551394.1 What Are The MANDATORY Information Required To File A Merge Patch Request?.

Cambiar la base de datos del repositorio de el OEM12c

Hoy vamos a ver en una entrada rápida como cambiaríamos la base de datos del OEM12c de un equipo a otro.
Los pasos necesarios para llevar a cabo este cambio son:

  • Parar el OMS
  • Hacer un backup de la base de datos
  • Restaurar la base de datos en la nueva ubicacion
  • Reconfigurar el OEM12c
  • Arrancar el OEM12c

Veamos uno a uno los pasos

Parar el OMS

$AGENT_HOME/bin/emctl stop agent
$OMS_HOME/bin/emctl stop oms

Backup de la base de datos
Aquí llevaríamos a cabo un backup normal de la base de datos con RMAN

Recuperación de la base de datos
Al igual que el backup, se trata de un restore standard mediante RMAN

Reconfigurar el OEM12c
Este es el paso mas dificil de hacer, debemos de conocer los datos:

  • LISTENER_PORT Puerto del listener de la nueva BBDD
  • NUEVOSID SID de la base de datos (no tiene por que cambiar)
  • NUEVOHOST nombredel nuevo host (conviene que esté en el /etc/hosts del servidor)
  • NUEVOPASWD Password del respositorio ( si no se ha cambiado es el mismo que el de sysman anterior)

y con esto,simplemente debemos de ejecutar el cambio de repositorio con el comando

emctl config oms -store_repos_details -repos_port LISTENER_PORT -repos_sid NUEVOSID -repos_host NUEVOHOST -repos_user SYSMAN -repos_pwd NUEVOPASSWD
Oracle Enterprise Manager Cloud Control 12c Release 3
Copyright (c) 1996, 2013 Oracle Corporation.  All rights reserved.
Successfully updated datasources and stored repository details in Credential Store.
If there are multiple OMSs in this environment, run this store_repos_details command on all of them.
And finally, restart all the OMSs using 'emctl stop oms -all' and 'emctl start oms'.
 

Arrancar el OMS

$AGENT_HOME/bin/emctl start agent
$OMS_HOME/bin/emctl start oms

Instalación de Oracle Enterprise Manager 12c

Hola

Hoy vamos a ver como se hace la instalación de el OEM 12c en un servidor Linux.

Lo primero que haremos será el instalar un Oracle Linux 6.3 y una base de datos Enterprise (es un requerimiento del OEM 12c) que servirá de nuestro repositorio para el cloud. Después de esto, iremos a la web de descargas de Oracle para bajarnos el 12c.
Antes de empezar con la instalación, he de advertiros que, el OEM 12c tiene muchísimas restricciones de licenciamiento, con lo que, os conviene echarles un vistazo antes de instalarlo a la ligera.

Nosotros vamos a llevar a cabo la instalación según este documento http://docs.oracle.com/cd/E24628_01/install.121/e24089/toc.htm.

La instalación la vamos a llevar a cabo con el usuario emc y hemos reservado una particion de 15Gb bajo /oem , aunque pueda parecer una barbaridad de espacio, no nos va a sobrar tanto, por que, como vemos en el cuadro adjunto las necesidades de HW no son precisamente «pequeñas»

requisitos HW

requisitos HW

Además de esto, hemos de tener en cuenta que, nosotros ya tenemos binarios de Oracle instalados en este servidor, por que tenemos la base de datos instalada, por eso el directorio del inventario de oracle será común

[oem@emc fuentes]$ cat /etc/oraInst.loc 
inventory_loc=/oraInventory
inst_group=oinstall

Antes de la instalación deberemos de cerciorarnos que tenemos los siguientes paquetes:

  • make-3.81
  • binutils-2.17.50.0.6
  • gcc-4.1.1
  • libaio-0.3.106
  • glibc-common-2.3.4
  • libstdc++-4.1.1
  • libXtst-1.0.99.2-3.el6.x86_64.rpm
  • sysstat-5.0.5
  • glibc-devel-2.5-49-i686 (This is a 32-bit package)
  • glibc-devel-2.5-49-x86_64 (This is a 64-bit package)

Crearemos el usuario oem que asignaremos al grupo oinstall

Tras descomprimir los 3 ficheros de fuentes (ocupan unos 5 Gb) lanzaremos el comando

./runInstaller

Lo primero que nos solicitará es el usuario del metalink (soporte), nosotros le diremos que no queremos
Captura de pantalla 2013-03-03 a la(s) 18.48.38

Lo segundo es si queremos buscar nuevas actualizaciones, nuevamente le diremos que no

usuario metalnk

usuario metalnk

Tras esto, el instalador llevará a cabo las comprobaciones necesarias para la instalación, en caso de tener problemas con alguna de ellas, deberemos de solucionarlas.En nuestro caso, nos muestra un «warning» que podemos omitir.
prerequisitos

Este problema es debido a que necesitamos la instalación de una librería de 32 bits y nuestro sistema es de 64 bits, para solucionarlo solamente tenemos que hacer

yum install glibc-devel.i686

Con la instalacion de esta librería, la comprobación será correcta, y podremos seguir con la instalación.

Una vez pasado ese punto, nos indica que tipo de instalacion queremos hacer.
Tenemos una explicacion de cual es cual en http://docs.oracle.com/cd/E24628_01/install.121/e22624/install_em_exist_db.htm en Table 7-1 Differences Between Simple and Advanced Installation,y, como podeis ver, la instalacion básica se ajusta mas que de sobra a nuestras necesidades.

Captura de pantalla 2013-03-03 a la(s) 18.53.34

Antes de seguir en los siguientes pasos hay que tener unas pequeñas cosillas en cuenta:

  • El wizzard no puede lanzarse desde un host remoto, hay que instalar desde la máquina
  • No tenemos que tener variables ORACLE_HOME o ORACLE_SID
  • No hay que instalar el OEM en un link
  • OEM te va a instalar un Weblogic y el JDK 1.6
  • No trastees el weblogic, hay que dejarlo caer como lo va a dejar la instalacion de OEM
  • La instalación no debe de hacerse como root
  • La base de datos del repositorio debe de ser una versión Enterprise con particionamiento
  • La tarea de recolección de estadísticas debe de estar detenida

En nuestro caso, vamos a dejar la instalacion bajo la particion /oem

paths e instalacion

paths e instalacion

Le introducimos el password y la ubicacion de nuestra base de datos.

password e instancia

password e instancia

Importante: Hemos de tener en cuenta que este paso se «apropiará» de la cuenta de system de la instancia, con lo que se teníamos en Enterpise Control de la instancia nos tocará eliminarlo.

Tras este punto volveremos a tener las comprobaciones de rigor, y tras poner una contraseña acorde (en este punto no nos deja poner una trivial) , llegaremos a la pantalla de instalación.

instalaacion

El proceso de instalación es bastante largo,pero , siguiendo estos pasos finalizar la instalación es simplemente cuestion de tiempo y paciencia.