Inicio > Database > Creación de servicios en bases de datos Oracle

Creación de servicios en bases de datos Oracle

Los servicios de base de datos permiten agrupar lógicamente las sesiones que se conectan a nuestra base de datos. Cada grupo presentará atributos, umbrales de nivel de servicio y prioridades comunes. De esta manera, se les puede aplicar diferentes políticas de recursos y perfiles a cada grupo. En una única BBDD podemos tener definidos múltiples servicios, que se ajusten a los diferentes tipos de aplicaciones que accedan a ella.

Las solicitudes de conexión a base de datos pueden incluir un nombre de servicio, vinculando todas las sesiones que usen esa conexión a ese servicio concreto.

Para gestionar servicios se puede utilizar el paquete DBMS_SERVICE. Aunque hay que tener en cuenta que si se tiene un entorno con alta disponibilidad que hace uso de clusterware, como RAC o Grid Infrastructure, es recomendable utilizar SRVCTL. En concreto, al dar un servicio de alta con DBMS_SERVICE no se actualiza el registro de cluster y éste, al desconocer la existencia del nuevo servicio, no lo puede gestionar (arrancar/parar junto con la BBDD), si lo creamos mediante SRVCTL el servicio queda registrado como un recurso mas a gestionar por el software de cluster.

A continuación vamos a poner un ejemplo de creación de dos servicios en una base de datos 11gR2 gestionada por Oracle Grid Infrastructure sobre ASM, uno de ellos con DBMS_SERVICE y el otro con SRVCTL.

Se puede comprobar la relación de los servicios existentes consultando una vista de base de datos como DBA_SERVICES o ALL_SERVICES, y se puede validar su estado desde línea de comando con la herramienta de control del listener ‘lsnrctl’.

Mediante DBMS_SERVICE se puede crear un servicio con el procedimiento CREATE_SERVICE y a continuación se puede arrancar con el procedimiento START_SERVICE.

En primer lugar comprobamos los servicios existentes:


SQL> select service_id, name, network_name, creation_date from dba_services;

SERVICE_ID NAME                 NETWORK_NAME         CREATION
---------- -------------------- -------------------- --------
         1 SYS$BACKGROUND                            24/08/13
         2 SYS$USERS                                 24/08/13
         3 dbtest2XDB           dbtest2XDB           23/01/14
         4 dbtest2.avanttic.com dbtest2.avanttic.com 23/01/14
         5 dbtest1XDB           dbtest1XDB           09/01/14
         6 dbtest1.avanttic.com dbtest1.avanttic.com 09/01/14

6 filas seleccionadas.

A continuación, creamos un servicio y comprobamos el listener:

SQL> exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'servicio1', NETWORK_NAME=>'servicio1')

Procedimiento PL/SQL terminado correctamente.

SQL> exec dbms_service.START_SERVICE('servicio1');

Procedimiento PL/SQL terminado correctamente.

[oracle@centos1 ~]$ lsnrctl services

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 27-JUN-2014 13:36:01

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "dbtest1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "dbtest1XDB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: centos1.avanttic.com, pid: 12246>
         (ADDRESS=(PROTOCOL=tcp)(HOST=centos1)(PORT=9739))
Service "dbtest1_DGB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "servicio1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
The command completed successfully

[oracle@centos1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 27-JUN-2014 13:35:19

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                27-JUN-2014 01:33:37
Uptime                    0 days 3 hr. 1 min. 41 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/centos1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.93.128)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.93.130)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "dbtest1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "dbtest1XDB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "dbtest1_DGB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "servicio1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
The command completed successfully

 

Hay que tener en cuenta que si se realiza una parada y arranque de la base de datos los servicios creados con DBMS_SERVICE no arrancan automáticamente. Se puede solucionar mediante un trigger que los levante cuando la base de datos arranca.

Hemos creado el servicio, comprobamos que no aparece como recurso de cluster:


[oracle@centos1 ~]$ ./crsstat.sh
Resource Name             Type                      Target     State
-----------               ------                    -------    --------
ora.DATA.dg               ora.diskgroup.type        ONLINE     ONLINE on centos1
ora.DATOS.dg              ora.diskgroup.type        ONLINE     ONLINE on centos1
ora.FRA.dg                ora.diskgroup.type        ONLINE     ONLINE on centos1
ora.LISTENER.lsnr         ora.listener.type         ONLINE     ONLINE on centos1
ora.LISTENER_SCAN1.lsnr   ora.scan_listener.type    OFFLINE    OFFLINE
ora.asm                   ora.asm.type              ONLINE     ONLINE on centos1
ora.centos1.vip           ora.cluster_vip_net1.type ONLINE     ONLINE on centos1
ora.centos2.vip           ora.cluster_vip_net1.type ONLINE     INTERMEDIATE on centos1
ora.cvu                   ora.cvu.type              ONLINE     ONLINE on centos1
ora.dbtest1.db            ora.database.type         ONLINE     ONLINE on centos1
ora.gsd                   ora.gsd.type              OFFLINE    OFFLINE
ora.net1.network          ora.network.type          ONLINE     ONLINE on centos1
ora.oc4j                  ora.oc4j.type             ONLINE     ONLINE on centos1
ora.ons                   ora.ons.type              ONLINE     ONLINE on centos1
ora.scan1.vip             ora.scan_vip.type         OFFLINE    OFFLINE
orcl-vip                  app.appvip_net1.type      ONLINE     ONLINE on centos1
orcl.db                   cluster_resource          OFFLINE    OFFLINE   

Como siguiente paso, vamos a crear un segundo servicio mediante SRVCTL, que sí quedará registrado como recurso de cluster. Se puede crear un servicio con el comando:
srvctl add service -d db_unique_name -s service_name


[oracle@centos1 ~]$ srvctl add service -d dbtest1 -s servicio2
[oracle@centos1 ~]$ ./crsstat.sh
Resource Name              Type                      Target   State
-----------                ------                    -------  --------
ora.DATA.dg                ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.DATOS.dg               ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.FRA.dg                 ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.LISTENER.lsnr          ora.listener.type         ONLINE   ONLINE on centos1
ora.LISTENER_SCAN1.lsnr    ora.scan_listener.type    OFFLINE  OFFLINE
ora.asm                    ora.asm.type              ONLINE   ONLINE on centos1
ora.centos1.vip            ora.cluster_vip_net1.type ONLINE   ONLINE on centos1
ora.centos2.vip            ora.cluster_vip_net1.type ONLINE   INTERMEDIATE on centos1
ora.cvu                    ora.cvu.type              ONLINE   ONLINE on centos1
ora.dbtest1.db             ora.database.type         ONLINE   ONLINE on centos1
ora.dbtest1.servicio2.svc  ora.service.type          OFFLINE  OFFLINE
ora.gsd                    ora.gsd.type              OFFLINE  OFFLINE
ora.net1.network           ora.network.type          ONLINE   ONLINE on centos1
ora.oc4j                   ora.oc4j.type             ONLINE   ONLINE on centos1
ora.ons                    ora.ons.type              ONLINE   ONLINE on centos1
ora.scan1.vip              ora.scan_vip.type         OFFLINE  OFFLINE
orcl-vip                   app.appvip_net1.type      ONLINE   ONLINE on centos1
orcl.db                    cluster_resource          OFFLINE  OFFLINE           

El servicio recién creado aparece parado. Si se arranca y se comprueba el estado del listener, se puede ver que aparecen los dos servicios pero el clusterware solamente reconoce (y gestiona) uno de ellos, el creado con SRVCTL.


[oracle@centos1 ~]$ ./crsstat.sh
Resource Name              Type                      Target   State
-----------                ------                    -------  --------
ora.DATA.dg                ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.DATOS.dg               ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.FRA.dg                 ora.diskgroup.type        ONLINE   ONLINE on centos1
ora.LISTENER.lsnr          ora.listener.type         ONLINE   ONLINE on centos1
ora.LISTENER_SCAN1.lsnr    ora.scan_listener.type    OFFLINE  OFFLINE
ora.asm                    ora.asm.type              ONLINE   ONLINE on centos1
ora.centos1.vip            ora.cluster_vip_net1.type ONLINE   ONLINE on centos1
ora.centos2.vip            ora.cluster_vip_net1.type ONLINE   INTERMEDIATE on centos1
ora.cvu                    ora.cvu.type              ONLINE   ONLINE on centos1
ora.dbtest1.db             ora.database.type         ONLINE   ONLINE on centos1
ora.dbtest1.servicio2.svc  ora.service.type          ONLINE   ONLINE on centos1
ora.gsd                    ora.gsd.type              OFFLINE  OFFLINE
ora.net1.network           ora.network.type          ONLINE   ONLINE on centos1
ora.oc4j                   ora.oc4j.type             ONLINE   ONLINE on centos1
ora.ons                    ora.ons.type              ONLINE   ONLINE on centos1
ora.scan1.vip              ora.scan_vip.type         OFFLINE  OFFLINE
orcl-vip                   app.appvip_net1.type      ONLINE   ONLINE on centos1
orcl.db                    cluster_resource          OFFLINE  OFFLINE

[oracle@centos1 ~]$ lsnrctl services

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 27-JUN-2014 13:40:06

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "dbtest1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "dbtest1XDB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: centos1.avanttic.com, pid: 12246>
         (ADDRESS=(PROTOCOL=tcp)(HOST=centos1)(PORT=9739))
Service "dbtest1_DGB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "servicio1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "servicio2.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
The command completed successfully

[oracle@centos1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 27-JUN-2014 13:40:13

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                27-JUN-2014 01:33:37
Uptime                    0 days 3 hr. 6 min. 35 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/centos1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.93.128)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.93.130)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "dbtest1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "dbtest1XDB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "dbtest1_DGB.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "servicio1.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
Service "servicio2.avanttic.com" has 1 instance(s).
  Instance "dbtest1", status READY, has 1 handler(s) for this service...
The command completed successfully

Por último, comprobamos en la vista de base de datos que los dos servicios existen.

SQL> select service_id, name, network_name, creation_date from dba_services;

SERVICE_ID NAME                 NETWORK_NAME         CREATION
---------- -------------------- -------------------- --------
         1 SYS$BACKGROUND                            24/08/13
         2 SYS$USERS                                 24/08/13
         3 dbtest2XDB           dbtest2XDB           23/01/14
         4 dbtest2.avanttic.com dbtest2.avanttic.com 23/01/14
         5 dbtest1XDB           dbtest1XDB           09/01/14
         6 dbtest1.avanttic.com dbtest1.avanttic.com 09/01/14
         7 servicio1            servicio1            27/06/14
         8 servicio2            servicio2            27/06/14

8 filas seleccionadas.

 

Hemos visto dos formas diferentes de crear un servicio con implicaciones diferentes, pero una no tiene por qué ser mejor que la otra, dependerá de las necesidades de cada uno. Una vez se han creado los servicios, es posible configurar usuarios/aplicaciones para que utilicen uno u otro y poder realizar ajustes de base de datos a nivel de servicio. Pero esto es algo que veremos en otro momento.

Notas:

Categorías:Database Etiquetas: , ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: