{"id":548,"date":"2013-05-16T21:10:53","date_gmt":"2013-05-16T19:10:53","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=548"},"modified":"2014-12-23T10:54:35","modified_gmt":"2014-12-23T09:54:35","slug":"introduccion-a-los-servicios-de-oracle","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/introduccion-a-los-servicios-de-oracle\/","title":{"rendered":"Introduccion a los servicios de Oracle"},"content":{"rendered":"<p>Uno de los elementos mas potentes que introdujo Oracle en la versi\u00f3n 10g fu\u00e9 el uso de servicios.<br \/>\nLos servicios de Oracle no son otra cosa que una abstracci\u00f3n l\u00f3gica 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 <em>\u00absingle instance\u00bb<\/em>.<\/p>\n<p>Supongamos tenemos una base de datos <b>produccion<\/b> 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\u00e1quina entre ellos, en el momento en que la base de datos tiene problemas nos es muy dif\u00edcil el saber quien es quien.<br \/> Si pudi\u00e9semos discriminar las conexiones por una agrupaci\u00f3n l\u00f3gica, ser\u00eda mas f\u00e1cil el verlo, y , mas a\u00fan, si el EMC fuese capaz de separar las gr\u00e1ficas y estad\u00edsticas por esa agrupaci\u00f3n.<\/p>\n<p>Pues esto es exactamente lo que nos proporcionan los servicios Oracle.<br \/>\nEn nuestro caso ficticio, vamos a crear los distintos servicios:<\/p>\n<ul>\n<li> Webfotos\n<li> Cargas\n<li> Contabilidad\n<li> Desarrollo\n<\/ul>\n<p>De esta forma,  cada conexi\u00f3n de estos 4 entornos usara un <em>service_name<\/em> distinto en su <em>TNS_NAMES<\/em> de cliente, y , la base de datos podr\u00e1 identificar ( y limitar) a cada uno de ellos de manera separada.<\/p>\n<p>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 <em>\u00absingle instance\u00bb<\/em>, no nos va a quedar mas remedio que usar este paquete.<br \/>\nMediante la funci\u00f3n CREATE_SERVICE crearemos los servicios de la manera:<\/p>\n<pre>\r\nexec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'webfotos', NETWORK_NAME=>'webfotos')\r\nexec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'cargas', NETWORK_NAME=>'cargas')\r\nexec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'contabilidad', NETWORK_NAME=>'contabilidad')\r\nexec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'desarrollo', NETWORK_NAME=>'desarrollo')\r\n<\/pre>\n<p>Una vez creados los servicios, los arrancaremos con la funci\u00f3n<\/p>\n<pre>\r\nexec dbms_service.START_SERVICE('webfotos')\r\nexec dbms_service.START_SERVICE('cargas')\r\nexec dbms_service.START_SERVICE('contabilidad')\r\nexec dbms_service.START_SERVICE('desarrollo')\r\n<\/pre>\n<p>Para comprobar si la creaci\u00f3n de nuestros servicios ha funcionado, podemos chequear el par\u00e1metro service_names<\/p>\n<pre>\r\nSQL> select value from v$parameter where NAME='service_names';\r\nVALUE\r\n---------------------------\r\nproduccion,webfotos,cargas,contabilidad,desarrollo\r\n<\/pre>\n<p>O bien el listener con <em> lsnrctl services<\/em><\/p>\n<pre>\r\n[oracle@blog] [$lsnrctl services\r\n\r\nLSNRCTL for Linux: Version 11.2.0.2.0 - Production on 17-MAY-2013 13:31:06\r\n\r\nCopyright (c) 1991, 2011, Oracle.  All rights reserved.\r\n\r\nConnecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))\r\nServices Summary...\r\nService \"PLSExtProc\" has 1 instance(s).\r\n  Instance \"PLSExtProc\", status UNKNOWN, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:0 refused:0\r\n         LOCAL SERVER\r\nService \"produccion\" has 1 instance(s).\r\n  Instance \"XE\", status READY, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:34 refused:0 state:ready\r\n         LOCAL SERVER\r\nService \"webfotos\" has 1 instance(s).\r\n  Instance \"XE\", status READY, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:34 refused:0 state:ready\r\n         LOCAL SERVER\r\nService \"contabilidad\" has 1 instance(s).\r\n  Instance \"XE\", status READY, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:34 refused:0 state:ready\r\n         LOCAL SERVER\r\nService \"desarrollo\" has 1 instance(s).\r\n  Instance \"XE\", status READY, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:34 refused:0 state:ready\r\n         LOCAL SERVER\r\nService \"cargas\" has 1 instance(s).\r\n  Instance \"XE\", status READY, has 1 handler(s) for this service...\r\n    Handler(s):\r\n      \"DEDICATED\" established:34 refused:0 state:ready\r\n         LOCAL SERVER\r\nThe command completed successfully\r\n<\/pre>\n<p>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.<\/p>\n<p>\u00bfque beneficios nos aporta todo esto?<\/p>\n<ul>\n<li><b>Trazabilidad<\/b>: Nos va a ser sencill\u00edsimo encontrar quien es el que esta haciendo algo ya que en un primer vistazo encontraremos al culpable \u00ablogico\u00bb del problema, una vez tenemos el origen del problema es mas sencillo abordarlo.\n<li><b>Accounting<\/b>: Vamos a poder ser capaces de ver los consumos de cada aplicacion\/grupo l\u00f3gico en la base de datos, lo que nos puede ser muy bueno a la hora de derivar costes o limitar recursos\n<li><b>control de accesos<\/b>: Si en un momento espec\u00edfico queremos asegurarnos de que un elemento l\u00f3gico no acceda a la aplicacion, podemos detener el servicio y el resto funcionar\u00eda correctamente.Esto puede ser muy \u00fatil por ejemplo, para evitar cargas en horario diurno, o para controlar los equipos de desarrollo\n<\/ul>\n<p>Hasta ahora lo hemos visto todo muy f\u00e1cil, pero .. \u00bfque ocurre cuando reinicias la base de datos?.<br \/>\nPara que la instancia levante los servicios al arrancar deber\u00e1n de estar en el init.ora con la sintaxsis:<\/p>\n<pre>\r\n\r\nservice_names='produccion','webfotos','cargas','desarrollo'\r\n<\/pre>\n<p>Si no es as\u00ed , 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.<br \/>\nLa soluci\u00f3n como os dec\u00eda la principio es hacerlo desde el <em>srvctl<\/em>, pero &#8230;<br \/>\n<b> \u00bfcomo lo hacemos si no tenemos RAC,Grid  u Oracle restart?<\/b><br \/>\nLa respuesta es brutalmente sencilla.<\/p>\n<pre>\r\n[oracle@blog] [$sqlplus \"\/as sysdba\"\r\nSQL*Plus: Release 11.2.0.2.0 Production on Vie May 17 13:09:11 2013\r\nCopyright (c) 1982, 2011, Oracle.  All rights reserved.\r\n\r\nConnected to:\r\nOracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production\r\nSQL> alter system set service_names='produccion,webfotos,cargas,contabilidad,desarrollo';\r\nSystem altered.\r\n<\/pre>\n<p>Tan sencillo como acab\u00e1is de ver, simplemente hemos de conectarnos desde el <em>sqlplus<\/em> y hacer un ALTER SYSTEM para el par\u00e1metro <em>service_names<\/em> poniendo nuestros servicios separados por comas.<\/p>\n<p>Como siempre, para  mas informaci\u00f3n, tenemos la documentaci\u00f3n de Oracle del paquete<a href=\"-- http:\/\/docs.oracle.com\/cd\/B19306_01\/appdev.102\/b14258\/d_serv.htm\">DBMS_SERVICES<\/a> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno de los elementos mas potentes que introdujo Oracle en la versi\u00f3n 10g fu\u00e9 el uso de servicios. Los servicios de Oracle no son otra cosa que una abstracci\u00f3n l\u00f3gica de una instancia de base de datos. Aunque los servicios &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/introduccion-a-los-servicios-de-oracle\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,51],"tags":[249,253,20,90,88,91,89,28],"class_list":["post-548","post","type-post","status-publish","format-standard","hentry","category-11g","category-cliente","tag-11g","tag-cliente","tag-consumer-group","tag-dbms_service","tag-service","tag-service_names","tag-servicio","tag-spfile"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/comments?post=548"}],"version-history":[{"count":15,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/548\/revisions"}],"predecessor-version":[{"id":1115,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/548\/revisions\/1115"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=548"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}