Creación de servicios en bases de datos Oracle
16/07/2014 -
Los servicios de bases 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:
1
2
3
4
5
6
7
8
9
10
11
12
|
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.test dbtest2.avanttic.test 23/01/14 5 dbtest1XDB dbtest1XDB 09/01/14 6 dbtest1.avanttic.test dbtest1.avanttic.test 09/01/14 6 filas seleccionadas. |
A continuación, creamos un servicio y comprobamos el listener:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
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.test" 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.test" 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.test, pid: 12246> (ADDRESS=(PROTOCOL=tcp)(HOST=centos1)(PORT=9739)) Service "dbtest1_DGB.avanttic.test" 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.test" 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.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "dbtest1XDB.avanttic.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "dbtest1_DGB.avanttic.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "servicio1.avanttic.test" 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
[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.test" 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.test" 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.test, pid: 12246> (ADDRESS=(PROTOCOL=tcp)(HOST=centos1)(PORT=9739)) Service "dbtest1_DGB.avanttic.test" 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.test" 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.test" 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.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "dbtest1XDB.avanttic.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "dbtest1_DGB.avanttic.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "servicio1.avanttic.test" has 1 instance(s). Instance "dbtest1" , status READY, has 1 handler(s) for this service... Service "servicio2.avanttic.test" 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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.test dbtest2.avanttic.test 23/01/14 5 dbtest1XDB dbtest1XDB 09/01/14 6 dbtest1.avanttic.test dbtest1.avanttic.test 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:
- El script crsstat.sh es un shellscript que facilita la consulta de los recursos, no viene con la instalación de Oracle.
- La documentación sobre el uso de DBMS_SERVICE está en http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_serv.htm
- La documentación sobre el uso de SRVCTL está en http://docs.oracle.com/cd/E11882_01/server.112/e25494/restart.htm#ADMIN12726