<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9129007495884161248</id><updated>2011-04-21T17:11:45.489-05:00</updated><category term='encripcion'/><category term='desempeño'/><category term='seguridad'/><title type='text'>Juan Jose Martinez</title><subtitle type='html'>Stephen Hawking alguna vez dijo -The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge-

Asi que este Blog esta creado para compratir mis experiencias en el campo de Tecnologías de Información para las áreas de Base de Datos Oracle, Administración del Desempeño y Planeación de la Capacidad.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://juanjosemtz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://juanjosemtz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Juan J. Martínez</name><uri>http://www.blogger.com/profile/11063321011617085184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9129007495884161248.post-696897240826697238</id><published>2009-03-06T13:39:00.002-06:00</published><updated>2009-03-06T13:43:47.923-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='encripcion'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='desempeño'/><title type='text'>Transparent Data Encryption Parte 1 de 2</title><content type='html'>Recientemente me ha tocado estar involucrado en proyectos que requieren encripción de datos para cumplir con lineamientos internos o gubernamentales, por lo que se han decidido a implementar los productos ofrecidos por Oracle para su base de datos. Oracle ofrece el módulo de Advanced Security para la encripción de datos a nivel físico (TDE) y red (Network Encryption).&lt;br /&gt;&lt;br /&gt;En esta primera parte, analizaremos la opción TDE para 10gr2, la cual permite realizar la encripción de datos a nivel columna. Sin embargo, esta opción cuenta con varias limitaciones y no permite ser usada en los siguientes casos:&lt;br /&gt;&lt;br /&gt;   ■ Columnas con índices que no sean del tipo B-tree&lt;br /&gt;   ■ Tipos de datos LONG, BLOB, CLOB&lt;br /&gt;&lt;br /&gt;además de que pudiera causar serios problemas con el funcionamiento esperado de import/export normales así como en el desempeño de aplicaciones que utilicen búsquedas del tipo 'Range scan' a través de un índice.&lt;br /&gt;&lt;br /&gt;Para este artículo analizaremos este último punto y veremos como podría nuestra aplicación verse afectada si utilizamos queries que accesen a los datos a través de un 'Range Scan' en un índice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Comenzaremos por crear 2 tablas sencillas y del mismo formato, con la única diferencia de que una de ellas tendrá una de sus columnas encriptadas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; create table tabla_noenc(c1 number, c2 varchar2(10));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Table created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; insert into tabla_noenc values(1,'Juan');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    1 row created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; insert into tabla_noenc values(1,'Jose');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    1 row created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; insert into tabla_noenc values(1,'Martinez');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    1 row created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; create table tabla_enc as select * from tabla_noenc;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; alter table tabla_enc modify c2 encrypt using 'AES128' no salt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Ahora crearemos un índice en cada una de las tablas para el campo c2 y obtendremos sus estadísticas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; create index in_tabla_noenc_01 on tabla_noenc (c2);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Index created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; create bitmap index in_tabla_enc_01 on tabla_enc (c2);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Index created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; exec dbms_stats.gather_table_stats (ownname =&gt; 'user',tabname =&gt; 'TABLA_NOENC',estimate_percent =&gt; 100,cascade =&gt; true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    PL/SQL procedure successfully completed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; exec dbms_stats.gather_table_stats (ownname =&gt; 'user',tabname =&gt; 'TABLA_ENC',estimate_percent =&gt; 100,cascade =&gt; true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    PL/SQL procedure successfully completed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Ejecutamos una sencilla sentencia en la tabla sin columnas encriptadas que cuente el numero de registros y que accese a los datos a través del índice creado: &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; set autotrace on explain stat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; set linesize 120&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; select count(1) from user.tabla_noenc  where c2 like 'Ma%';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      COUNT(1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Execution Plan&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Plan hash value: 5644505&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ---------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    | Id  | Operation      | Name          | Rows  | Bytes | Cost (%CPU)| Time     |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ---------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |   0 | SELECT STATEMENT  |              |     1 |     7 |     1    (0)| 00:00:01 |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |   1 |  SORT AGGREGATE   |              |     1 |     7 |        |          |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |*  2 |   &lt;span style="color: rgb(51, 51, 255);"&gt;INDEX RANGE SCAN&lt;/span&gt;| IN_TABLA_NOENC_01 |     1 |     7 |     1    (0)| 00:00:01 |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ---------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Predicate Information (identified by operation id):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ---------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       2 - access("C2" LIKE 'Ma%')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           filter("C2" LIKE 'Ma%')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Statistics&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  recursive calls&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  db block gets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          1  consistent gets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  physical reads&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  redo size&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        411  bytes sent via SQL*Net to client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        400  bytes received via SQL*Net from client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          2  SQL*Net roundtrips to/from client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  sorts (memory)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  sorts (disk)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          1  rows processed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Ahora ejecutamos la misma sentencia en la tabla con la columna encriptada: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    SQL&gt; select count(1) from user.tabla_enc  where c2 like 'Ma%';&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-style: italic;"&gt;   COUNT(1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Execution Plan&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Plan hash value: 933087212&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    --------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    | Id  | Operation       | Name      | Rows  | Bytes | Cost (%CPU)| Time     |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    --------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |   0 | SELECT STATEMENT   |           |     1 |     7 |     3     (0)| 00:00:01 |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |   1 |  SORT AGGREGATE    |           |     1 |     7 |        |           |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    |*  2 |   &lt;span style="color: rgb(255, 0, 0);"&gt;TABLE ACCESS FULL&lt;/span&gt;| TABLA_ENC |     1 |     7 |     3     (0)| 00:00:01 |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    --------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Predicate Information (identified by operation id):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ---------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       2 - filter(INTERNAL_FUNCTION("C2") LIKE 'Ma%')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    Statistics&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    ----------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          1  recursive calls&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  db block gets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          3  consistent gets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  physical reads&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  redo size&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        411  bytes sent via SQL*Net to client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        400  bytes received via SQL*Net from client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          2  SQL*Net roundtrips to/from client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  sorts (memory)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          0  sorts (disk)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          1  rows processed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resultados&lt;/span&gt;&lt;br /&gt;Como podemos observar en los planes de ejecución, la sentencia en el punto 3 utiliza el índice creado en el plan de ejecución, tiene un costo 1 y presenta 1 consistent get. Sin embargo, la sentencia en el punto 4 realiza un Full Table Scan de la tabla, presenta un costo 3 y 3 consistent gets.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Por qué sucede esto?&lt;/span&gt;&lt;br /&gt;La respuesta es simple, esto sucedo porque los bloques de la tabla encriptada en el buffer cache son replicas de la tabla, por lo tanto la columkna c2 permanecerá encriptada en el buffer cache, lo cual producirá una degradación en el desempeño para aquellas sentencias que accesen a la información a través de un range scan del índice creado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusión&lt;/span&gt;&lt;br /&gt;Si contamos con Oracle 10gr2, se debe evaluar con mucho cuidado que columnas son las que serán encriptadas. Sin embargo muchas organizaciones no tienen opción alguna y deben optar por un desempeño menor con tal de cumplir con las regulaciones establecidas.&lt;br /&gt;&lt;br /&gt;En la siguiente parte de este artículo veremos como TDE 11gr1 ofrece una alternativa a este problema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9129007495884161248-696897240826697238?l=juanjosemtz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://juanjosemtz.blogspot.com/feeds/696897240826697238/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9129007495884161248&amp;postID=696897240826697238' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/696897240826697238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/696897240826697238'/><link rel='alternate' type='text/html' href='http://juanjosemtz.blogspot.com/2009/03/transparent-data-encryption-parte-1-de.html' title='Transparent Data Encryption Parte 1 de 2'/><author><name>Juan J. Martínez</name><uri>http://www.blogger.com/profile/11063321011617085184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9129007495884161248.post-7336843433575166907</id><published>2008-09-22T13:55:00.005-05:00</published><updated>2008-09-22T18:24:08.840-05:00</updated><title type='text'>Oracle RAC – Transparent Application Failover</title><content type='html'>&lt;div align="justify"&gt;Ahora toca el turno a las pruebas de alta disponibilidad que el ambiente Real Application Clucter nos ofrece, el cual es otro de los puntos clave que debemos entender para llevar a cabo una implementación exitosa de cualquier aplicación conectada a una base de datos Oracle en ambiente RAC.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Antecedentes&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;===========&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;Iniciaré con una breve explicación de que es Transparent Application Failover (TAF)...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;TAF es una característica que permite a los cliente de oracle reconectarse a otra instancia en caso de que ocurriera una falla en la instancia a la cual se encontraba conectado. El servidor envía una notificación para iniciar el proceso de 'failover' en el cliente.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;TAF puede operar en uno de dos tipos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sesion Failover.&lt;/strong&gt; Este modo recreará las conexiones perdidas y las sesiones.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Select Failover.&lt;/strong&gt; Este modo volvera a ejecutar los queries que estaban en progreso.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Que a su vez puede usar uno de dos métodos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Basic.&lt;/strong&gt; Establece la conexión al momento de llevar a cabo el 'failover'. Esta opción casi no requiere trabajo extra en el lado del servidor hasta que ocurre el 'failover'.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Preconnect.&lt;/strong&gt; Provee un 'failover' mucho más rápido pero requiere que la(s) instancia(s) de respaldo tengan de antemando la sesión creada, por lo que se requieren más recursos para soportar todas las conexiones.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;Habilitar TAF implica llevar a cabo ciertos pasos de configuración manual, ya sea a nivel cliente al configurar la cadena de conexión, o bien a nivel servidor configurando ciertos atributos. Si ambas opciones de configuración son utilizadas, la configuración del servidor supersede a la del cliente. &lt;/p&gt;&lt;p align="justify"&gt;A continuación se muestra un ejemplo de la cadena de conexión para configurar TAF en el cliente, cabe aclarar que existen otros parámetros o valores que pueden ser utilizados:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RAC10G =&lt;br /&gt;(DESCRIPTION =&lt;br /&gt;(ADDRESS = (PROTOCOL = TCP)(HOST = srvrac1vip.oratest.com)(PORT = 1521))&lt;br /&gt;(ADDRESS = (PROTOCOL = TCP)(HOST = srvrac2vip.oratest.com)(PORT = 1521))&lt;br /&gt;(LOAD_BALANCE=yes)&lt;br /&gt;(FAILOVER=yes)&lt;br /&gt;(CONNECT_DATA =&lt;br /&gt;(SERVER = DEDICATED)&lt;br /&gt;(SERVICE_NAME = rac10g.oratest.com)&lt;br /&gt;(FAILOVER_MODE=&lt;br /&gt;(TYPE=select)&lt;br /&gt;(METHOD=basic)&lt;br /&gt;)&lt;br /&gt;)&lt;br /&gt;)&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;La siguiente sentencia SQL nos permite ver el resultado de utilizar la cadena de conexión anterior:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SELECT MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER, COUNT(*)&lt;br /&gt;FROM V$SESSION&lt;br /&gt;GROUP BY MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;y obtendríamos el siguiente resultado similar al siguiente antes de realizar el 'failover':&lt;br /&gt;&lt;br /&gt;MACHINE FAILOVER_TYPE FAILOVER_METH FAILED_OVER COUNT(*)&lt;br /&gt;--------------- ----------------------- ---------------------------- -------------------- --------&lt;br /&gt;srvrac2 NONE NONE NO 29&lt;br /&gt;JUANJO-LAP SELECT BASIC NO 1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;la salida después de llevarse a cabo el 'failover', sería algo parecido a lo siguiente:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;MACHINE FAILOVER_TYPE FAILOVER_METH FAILED_OVER COUNT(*)&lt;br /&gt;-------------- ----------------------- ---------------------------- -------------------- ---------&lt;br /&gt;JUANJO-LAP SELECT BASIC YES 1&lt;br /&gt;srvrac1 NONE NONE NO 29&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Referencias&lt;br /&gt;=========&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Oracle® Database Net Services Administrator’s Guide&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pruebas&lt;br /&gt;======&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Ahora bien, describo las pruebas que realice:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Se tiene una base de datos Oracle(10.2.0.1.0) en RAC con dos nodos.&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;La arquitectura de ambos servidores es similar, la única diferencia es que el nodo 1 tiene 2GB RAM y el nodo 2 solamente cuenta con 1GB RAM.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Se relizaron pruebas simulando dos tipos de eventos: perdida de conectivadad por problemas de red (se desconecto el cable de red del nodo activo) y colapso de una instancia (ejecutando un shutdown abort en la instancia activa)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Se probaron las diferentes combinaciones entre tipos y metodos de TAF.&lt;/li&gt;&lt;li&gt;El cliente utilizado fue sqlplus(10.1.0.2.0)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Los resultados son los siguientes:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PRUEBA DE FAILOVER CON DESCONEXIÓN CABLE DE RED&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TYPE=SELECT Y METHOD=BASIC&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g2&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; set timing on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;En este momento se desconecto el cable de red del nodo 2&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;select instance_name from v$instance;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-03113: end-of-file on communication channel&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:18.92&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#000000;"&gt;Como se puede observar le casi 19 segundos darse cuenta de que la conexión ya no existía y mandar el error, sin embargo la sesión no se perdió ya que al volver a ejecutar la sentencia se obtuvo el siguiente resultado:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;br /&gt;Elapsed: 00:00:00.00&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;Otro punto interesante a comentar es que el comportamiento esperado con la opción TYPE=SELECT no ocurrió, ya que la sentencia ejecutada mostró un error (ORA-03113) y no el resultado de la misma. Debido a esto se decidió intentarlo nuevamente, reconectando el cable de red del nodo 2 y desconectando el cable de red del nodo 1, en el que actualmente nos encontrabamos. El resultado fue el siguiente:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:01:04.12&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#000099;"&gt;&lt;span style="color:#000000;"&gt;Como se puede observar, ahora le tomó mucho más tiempo en regresar el resultado, sin embargo no mostró error alguno.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TYPE=SELECT Y METHOD=PRECONNECT&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; set timing on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;En este momento se desconecto el cable de red del nodo 1.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;select instance_name from v$instance;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-03113: end-of-file on communication channel&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:19.04&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;p align="justify"&gt;&lt;span style="color:#000000;"&gt;Como se puede observar le tomo poco más de 19 segundos darse cuenta de que la conexión ya no existía y mandar el error, sin embargo la sesión no se perdió ya que al volver a ejecutar la sentencia se obtuvo el siguiente resultado:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g2&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;Elapsed: 00:00:00.01&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;Nuevamente se puede observar que el comportamiento esperado con TYPE=SELECT no ocurrió y el tiempo transcurrido para recibir el ORA-03113 fue similiar a la primer prueba realizada anteriormente. Debido a esto no pude encontrar una diferencia palpable entre los metodos BASIC y PRECONNECT así como, en primera instancia observé un comportamiento inestable en el tipo SELECT. &lt;/p&gt;&lt;p align="justify"&gt;Cabe aclarar que estos resultados pueden deberse a la naturaleza de las pruebas que se realizaron (Desconectar cables de red), aunque no pude probarlo, por lo que decidí cambiar el tipo de evento...&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PRUEBA DE FAILOVER CON SHUTDOWN ABORT&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TYPE=SESSION Y METHOD=BASIC &lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Averiguamos a que instancia estamos conectados:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; set timing on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este es el momento en el que se envía el 'shutdown abort' a la instancia rac10g1, justo al mismo tiempo que ejecutamos la siguiente sentencia SQL: &lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g2&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:05:12.85&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Como se puede observar, toma un poco mas de 5 segundos para que la sentencia regrese el resultado, el cual nos indica que nos encontramos en una instancia diferente a la original. En este caso, cabe aclarar que, aunque el tipo de failover es SESSION, el resultado se genera, en vez de el error (ORA-03113) que sería esperado, ya que probablemente primero ocurrio el ABORT y despues el SELECT una vez realizado el failover de la sesión. Sin embargo, lo interesante es obtener el tiempo que toma llevar a cabo el failover.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TYPE=SELECT Y METHOD=BASIC&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Averiguamos a que instancia estamos conectados:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; set timing on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este es el momento en el que se envía el 'shutdown abort' a la instancia rac10g1, justo al mismo tiempo que ejecutamos la siguiente sentencia SQL: &lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g2&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:04.43&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Como se puede observar, toma 4.43 segundos para que la sentencia regrese el resultado, el cual nos indica que nos encontramos en una instancia diferente a la original. Aqui el resultado es muy similar a la prueba anterior, lo cual nos indica que practicamente no existe impacto en el tiempo del failover si el tipo elegido es SELECT o SESSION.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TYPE=SELECT Y METHOD=PRECONNECT&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Averiguamos a que instancia estamos conectados:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; set timing on;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este es el momento en el que se envía el 'shutdown abort' a la instancia rac10g1, justo al mismo tiempo que ejecutamos la siguiente sentencia SQL: &lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;SQL&gt; select instance_name from v$instance;&lt;br /&gt;INSTANCE_NAME&lt;br /&gt;----------------&lt;br /&gt;rac10g2&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:03.51&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Como se puede observar, toma 3.51 segundos para que la sentencia regrese el resultado, el cual nos indica que nos encontramos en una instancia diferente a la original. El tiempo obtenido como resultado demuestra que el método PRECONNECT es alrededor de 1 segundo más rápido (En una red local 100Mbps con poco tráfico) que el método BASIC para efectuar el failover de la conexión pero requiere de una conexión existente desde el inicio a cada una de las instancias, por lo que el costo beneficio debe ser evaluado cuidadosamente.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conclusiones&lt;br /&gt;==========&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Al llevar a cabo una implementación de cualquier aplicación que se conecte a un ambiente de base de datos Oracle RAC, o bien, decidir migrar una instancia "standalone" a RAC, es necesario evaluar los requerimientos de negocio que la aplicación tendra que soportar, a fin de seleccionar los tipos y metodos de failover adecuados para cada aplicación.&lt;/li&gt;&lt;li&gt;El método PRECONNECT es solo un poco más rápido que el método BASIC y tiene un costo mayor de recursos al requerir sesiones preexistentes en cada una de los nodos que conforman el RAC.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9129007495884161248-7336843433575166907?l=juanjosemtz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://juanjosemtz.blogspot.com/feeds/7336843433575166907/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9129007495884161248&amp;postID=7336843433575166907' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/7336843433575166907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/7336843433575166907'/><link rel='alternate' type='text/html' href='http://juanjosemtz.blogspot.com/2008/09/oracle-rac-transparent-application.html' title='Oracle RAC – Transparent Application Failover'/><author><name>Juan J. Martínez</name><uri>http://www.blogger.com/profile/11063321011617085184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9129007495884161248.post-327729066435787496</id><published>2008-09-19T17:54:00.002-05:00</published><updated>2008-09-19T18:11:23.451-05:00</updated><title type='text'>Oracle RAC - Balanceo de Sesiones</title><content type='html'>&lt;div align="justify"&gt;&lt;span&gt;&lt;span&gt;Uno de los puntos clave para llevar a cabo una implementación exitosa de una aplicación conectada a una base de datos Oracle en Real Application Cluster es entender y configurar el balanceo de las sesiones y la alta disponibilidad que el ambiente RAC nos ofrece.&lt;br /&gt;&lt;br /&gt;Este post esta dedicado a entender el balanceo de sesiones. La configuración de Alta Disponibilidad será tratada en otro momento.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;Comunmente, pueden existir problemas debidos a las diferentes aplicaciones existentes y a su naturaleza de conexión con la base de datos. Entre los problemas más comunes que me ha tocado observar se encuentran los siguientes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Las aplicaciones no pueden conectarse al ambiente en modo RAC. Únicamente se pueden conectar a uno de los nodos.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Uno de los nodos es quien procesa la mayor parte de la carga mientras que el/los otros(s) nodo(s) prácticamente no realizan ningún trabajo.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;A continuación explicaré de que forma Oracle realiza el balanceo de carga en un entorno Real Application Clusters, y para ello partiré de las siguientes primicias:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Todos los tipos de balanceo disponibles (9i – 10g, ya que no he probado en 11g) ocurren al momento de iniciar la conexión.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Las buenas aplicaciones se conectan una sola vez y permanecen conectadas (El costo de establecer una conexión con la base de datos es muy alto).&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ahora bien, los diferentes tipos de balanceo existentes son:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Aleatorio.&lt;/strong&gt; Es configurado a nivel cliente en la cadena de conexión o mediante hardware de balanceo y aleatoriamente distribuyen la conexión a las diferentes instancias. La parte negativa de este método es que no se toma en cuenta la carga en el nodo seleccionado o bien si el nodo está disponible, por lo cual pudieran causarse 'timeouts' a nivel TCP/IP.&lt;br /&gt;Para confiugurar este método se debe crear una cadena de conexión como la siguiente:&lt;br /&gt;RAC10G =&lt;br /&gt;   (DESCRIPTION =&lt;br /&gt;      (ADDRESS = (PROTOCOL = TCP)(HOST = srvrac1vip.oratest.com)(PORT = 1521))&lt;br /&gt;      (ADDRESS = (PROTOCOL = TCP)(HOST = srvrac2vip.oratest.com)(PORT = 1521))&lt;br /&gt;      (LOAD_BALANCE=yes)&lt;br /&gt;      (CONNECT_DATA =&lt;br /&gt;           (SERVER = DEDICATED)&lt;br /&gt;           (SERVICE_NAME = rac10g.oratest.com)&lt;br /&gt;      )&lt;br /&gt;)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Basado en la carga del nodo&lt;/strong&gt;. El balanceo se realiza a nivel listener y es el método predefinido de Oracle. Este método redirige las conexiones dependiendo del perfil de carga que el PMON de cada una de las instancias reporta dinámicamente al listener. La frecuencia de actualización del valor del perfil de carga depende de la carga misma, es decir, entre mayor sea la carga mayor es la frecuencia con la que el PMON actualiza el perfil de carga. Sin embargo, lo anterior está basado en la carga total en el NODO, no en la carga de las sesiones.&lt;br /&gt;Este método puede resultar muy bueno para conexiones que tienen una vida corta pero puede degradar el desempeño para las conexiones persistentes cuando la carga cambia a través del tiempo, es decir, el balanco inicial puede resultar finalmente desbalanceado.&lt;br /&gt;Este metodo no se recomienda para servidores de aplicación o metodos de conexión a través de un 'pool' de conexiones.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Basado en el número de sesiones.&lt;/strong&gt; El balanceo se realiza a nivel listener y es utilizado para distribuir el número de conexiones en cada instancia tomando en cuenta únicamente el número de sesiones conectadas a cada uno de los nodos.&lt;br /&gt;Este método permite evitar las llamadas “tormentas de conexiones” las cuales no son más que muchas conexiones haciendo una operación de 'logon' en un intervalo muy pequeño de tiempo.&lt;br /&gt;PMON registra la información de carga de nodo aproximadamente cada 60 segundos en promedio y es por este motivo que las "tormentas de conexiones" no pueden ser bien balanceadas mediante el metodo basado en la carga del nodo. El impacto directo de las "tormentas de conexiones" es una gran pérdida de rendimiento en el nodo afectado y como consecuencia una pérdida general de rendimiento y escalabilidad del cluster.&lt;br /&gt;Para configurar este método es necesario definir el siguiente parámetro del listener.&lt;br /&gt;                  PREFER_LEAST_LOADED_NODE_&lt;listener_name&gt; =OFF &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ahora bien, entendamos como funciona el proceso de conexión a una base de datos en RAC:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;El cliente desea iniciar una conexión a la base de datos y busca en su cadena de conexión la dirección correspondiente a la instancia.&lt;br /&gt;Si la cadena de conexión tiene configurado un balanceo, aleatoriamente seleccionará uno de los destinos configurados y enviará la petición de conexión.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Cuando el listener recibe la petición de conexión a la instancia, verificará de acuerdo al método configurado (B o C) a cual de las instancias se debe asignar la conexión.&lt;/li&gt;&lt;li&gt;Si la instancia en el nodo local es la candidata para la conexión, entonces el listener inicia el proceso de autenticación.&lt;/li&gt;&lt;li&gt;Si la instacia candidata para la conexión se encuentra en otro nodo, el listener regresa la cadena de conexión hacia el listener correspondiente al que el cliente deberá intentar conectarse e iniciar el proceso de autenticación.&lt;/li&gt;&lt;/ol&gt;&lt;p align="justify"&gt;En conclusión, es necesario llevar a cabo un estudio en función del tipo de aplicaciones que se desplieguen en un entorno RAC y cuidadosamente seleccionar la opción a utilizar. Aquí, la recomendación por mi parte es utilizar una combinación de la opción A con alguna de las otras dos opciones (B o C).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Referencias&lt;br /&gt;=========&lt;br /&gt;&lt;/p&gt;&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Metalink nota 300903.1&lt;/li&gt;&lt;li&gt;Oracle® Database Net Services Administrator’s Guide&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9129007495884161248-327729066435787496?l=juanjosemtz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://juanjosemtz.blogspot.com/feeds/327729066435787496/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9129007495884161248&amp;postID=327729066435787496' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/327729066435787496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9129007495884161248/posts/default/327729066435787496'/><link rel='alternate' type='text/html' href='http://juanjosemtz.blogspot.com/2008/09/oracle-rac-balanceo-de-sesiones.html' title='Oracle RAC - Balanceo de Sesiones'/><author><name>Juan J. Martínez</name><uri>http://www.blogger.com/profile/11063321011617085184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry></feed>
