24 septiembre 2012

Ajustes de Rendimiento:Detectar sentencias SQL no compartidas en la Shared Pool




Una de las maneras de aumentar la escalabilidad y el rendimiento de una aplicación, consiste en velar el número de sentencias SQL que están en la Shared Pool, región de la SGA (Área Global del Sistema) es una estructura básica de memoria de Oracle que sirve para facilitar la transferencia de información entre usuarios y también almacena la información estructural de la base de datos, más frecuentemente requerida. En versiones anteriores a 10g de la vista V_$SQL_SHARED_CURSOR ayudaría a diagnosticar por qué sentencias SQL no estaban siendo compartidas. En la versión 10g de a base de datos hay un evento llamado CURSORTRACE que ayuda en el mismo.
 
Área de SQL Compartido, Shared SQL Pool
En esta zona se encuentran las sentencias SQL que han sido analizadas. El análisis sintáctico de las sentencias SQL lleva su tiempo y Oracle mantiene las estructuras asociadas a cada sentencia SQL analizada durante el tiempo que pueda para ver si puede reutilizarlas.
Antes de analizar una sentencia SQL, Oracle mira a ver si encuentra otra sentencia exactamente igual en la zona de SQL compartido. Si es así, no la analiza y pasa directamente a ejecutar la que mantiene en memoria. De esta manera se premia la uniformidad en la programación de las aplicaciones. La igualdad se entiende que es lexicográfica, espacios en blanco y variables incluidas.
La base de datos Oracle asigna memoria a la shared pool cuando una nueva instrucción sql se analiza. El tamaño de esta memoria depende de la complejidad de la instrucción. Si toda la shared pool ya ha sido asignada la base de datos Oracle puede liberar elementos de la shared pool hasta que haya suficiente espacio libre para nuevas sentencias. Al liberar un elemento de la shared pool el sql asociado debe ser recompilado y reasignado a otra área de sql compartida la próxima vez que se ejecute.



El contenido de la zona de SQL compartido es:

  • Las sentencias SQL y PL/SQL (texto de la sentencia
  • Plan de ejecución de la sentencia SQL.
  • Lista de objetos referenciados.

Los pasos de procesamiento de cada petición de análisis de una sentencia SQL son:

  • Comprobar si la sentencia se encuentra en el área compartida.
  • Comprobar si los objetos son los mismos
  • Comprobar si el usuario tiene acceso a dichos objetos. En caso negativo, la sentencia es nueva, se analiza y los datos de análisis se almacenan de nuevo en la zona de SQL compartida.

Creamos un usuario Dummy para ilustrar nuestra explicación con un ejemplo:


SQL> create user dummy identified by dummy;
Usuario creado.
SQL> create table dummy.t (col1 varchar2(20) not null);
Tabla creada. 

Una vez creadas las tablas que nos servirán de ejemplo. Realizamos una consulta sobre la tabla creada, a fin de que quede reflejada en la Shared Pool, en la sesión de sqlplus #1.

Conectado a:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options 
SQL> select count(*) from dummy.t;
 
  COUNT(*)
----------
         0



SQL> select sql_text, hash_value,address from v$sqlarea where sql_text like 'select count(*) from dummy.t%';

SQL_TEXT                      HASH_VALUE ADDRESS
------------                  ---------- --------
select count(*) from dummy.t  2598640170 261A0758


SQL>  select * from v$sql_shared_cursor where address = '261A0758';

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T

------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - -

B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
R L H P B
- - - - -
fsy6q4ydf86ja 261A0758 261A04C4            0 N N N N N N N N N N N N N N N N N N

N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
N N N N N
 
 Vemos el primer "hijo" de la sentencia SQL ejecutada

En la sesión de sqlplus #2
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter session set optimizer_mode='RULE';

Sesión modificada.

SQL> select count(*) from dummy.t;

  COUNT(*)
----------
         0

SQL>  select * from v$sql_shared_cursor where address = '261A0758';

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T

------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - -

B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
R L H P B
- - - - -
fsy6q4ydf86ja 261A0758 261A04C4            0 N N N N N N N N N N N N N N N N N N

N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
N N N N N

fsy6q4ydf86ja 261A0758 2F626944            1 N N N N N N N N N N N N N N N N N N

N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N Y N N N N N N N N N
N N N N N

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T

------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - -

B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
R L H P B
- - - - -


SQL> alter session set events 'immediate trace name cursortrace level 612, address 2598640170';

Sesi¾n modificada.

SQL> alter session set optimizer_mode='FIRST_ROWS_1';

Session altered.

SQL> select count(*) from dummy.t;

  COUNT(*)
----------
         0

 
Esta es una porción del fichero de trazas, que arroja luz de porqué la consulta no está compartida en memoria:
*************************************************************************
PARSING SQLTEXT=select count(*) from dummy.t
SQLHASH=2d5ea7a8
Checking for already pinned child.
No valid child pinned
Parent 1EA853E8(261A0758) ready for search
kksSearchChildList outside while loop
kksCheckCursor: next child is #1
kksCheckCursor: pinning child #1 in shared mode 1eb62650 1ba90164
Compilation environment difference Failed sharing : 0
optimizer_mode = first_rows_1 rule
sqlstat_enabled = false true
SQL pgadep:0 pgapls:0 user
Failed sharing : Compilation environment mismatch
kksUnlockChild: releasing child
*************************************************************************
 



18 septiembre 2012

¿Hay vida más allá de Oracle? El comando UNIX que destruyó la 'Estrella de la Muerte'





Esta es la sentencia que no deberías ejecutar nunca:

$>nohup kill -9 `ps -eaf|grep -v kill|awk '{print $2}'`
Esto realiza un kill -9 de todos los procesos del sistema. Esta sentencia nos tira el sistema, así que ejecútala un día de mucho stress y seguro que triunfas como la coca cola.

13 septiembre 2012

TIP: Oracle SQL Developer 3.2 y Msvcr71.dll


En este pequeño "tip"  del día de hoy vamos a contar como resolver un problema, relativo a trabajar con Oracle SQL Developer, concretamente con la última release de Oracle de 27 de Agosto del 2012.


Escenario:
  • PC Portatil DELL Latitude D630
  • Sistema Operativo: Windows XP v2002 SP3
  • Oracle SQL Developer 3.2.9.30 (27 Agosto 2012)
Problema:
Al instalar la versión que incluye la JDK 1.6.0.11 y ejecutar sqldeveloper.exe nos muestra un error al no poder encontrar la libreria Msvcr71.dll.

Solución:
Descargar las librerias msvcp71.dll y msvcr71.dll (preguntaselo a Google), y guardarlas en C:/windows/System32. veras como inmediatamente funciona y puedes disfrutar del IDE gratuito de Oracle para bases de datos

12 septiembre 2012

Oracle GoldenGate 11g R2 + Oracle Advanced Security Options



Dentro de los múltiples escenarios que podemos tener con Oracle Golden Gate tenemos la posibilidad de aunar la replicación con la seguridad de los datos en reposo. Esto es usar OGG con una de las  opciones de la edición Enterprise de Oracle 11g R2, la opción de seguridad avanzada (ASO), mas concretamente uno de sus pilares los tablespaces cifrados (Transparent Data Encryption; TDE)

Versiones mas antiguas.
Si bien es verdad que las bases de datos Oracle desde su versión 10g (10.2.0.5) hasta la versión 11g (11.2.0.2/3) tienen soporte integrado, simplemente para activarlo hay que ejecutar el siguiente scrip alojado en:

@$ORACLE_HOME/rdbms/admin/prvtclkm.plb
 


Recordar, eso si, que si tenemos una versión de Oracle Database Enterprise Edition  11.1.0.7 deberemos de ejecutar este script tras instalar el parche 9409423 (ADD TDE SUPPORT FOR USE WITH GOLDENGATE EXTRACT), una vez hecho esto ejecutar el mismo procedimiento para permitir que Oracle GoldenGate 11.1.1.1 para extraer datos cifrados de una base de datos Oracle.

Oracle GoldenGate 11g R2.
Si queremos que OGG11g R2 (11.2.x) trabaje con tablespaces cifrados (TDE) deberemos de subir nuestra versión de base de datos a Oracle 11.2.0.2 y además pasar el parche 10395645 (AUTO-LOGIN SUPPORT FOR DBMS_INTERNAL_CLKM FOR GOLDEN GATE) eso si solo para Linux-x86-64, Solaris (SPARC) y HP-UX Itanium, este parche se halla liberado desde la versión 10.2.0.5.0.

Crearemos el Oracle wallet (repositorio externo de claves de Oracle para trabajar con bases de datos y middleware) mediante el siguiente comando

  
mkstore -wrl ./ -createEntry ORACLE.SECURITY.CL.ENCRYPTION.ORACLEGG

Si estamos en una plataforma RAC hay que copiar el fichero ewalletp12 a los otros nodos (Si el cluster se esta ejecutando y la localización del wallet no está compartida) Así mismo hay que proporcionar el mismo fichero en las bases de datos stand by, si las hubiera.
Si quieres comprobar lo que has compartido, ejecuta el iguiente comando de  Oracle wallet
mkstore -wrl  /u01/app/oracle/wallet –viewEntry ORACLE.SECURITY.CL.ENCRYPTION.ORACLEGG


Crea el paquete dbms_internal_clkm:

@$ORACLE_HOME/rdbms/admin/prvtclkm.plb

Una vez creado le tenemos que dar a nuestro usuario de base dedatos de OGG permisos de ejecución sobre ese paquete, para ello abriremos una sesión SQL*PLUS e introduciremos la siguiente sentencia:


SQL> grant execute on dbms_internal_clkm to gguser;
Cifra la clave compartida
GGSCI> ENCRYPT PASSWORD “shared key”
Añade una entrada al fichero de parámetros del proceso EXTRACT, para descifrar la clave compartida:
DBOPTIONS DECRYPTPASSWORD “SHARED KEY”
Cierra y abre el wallet, si tienes el wallet habilitado con auto login (mediante el fichero cwallet.sso) deshabilítalo temporalmente para cerar y abrir el wallet.


11 septiembre 2012

Oracle GoldenGate 11g R2 nueva característica: Captura integrada



Al liberar Oracle su versión 11g R2 de GolgenGate (OGG), su equipo de desarrollo estaba bastante orgulloso de una de sus novedades: la captura integrada para plataformas Oracle. Esta captura integrada es única en el mercado. OGG soporta numerosas plataformas de bases de datos, con la adquisición de Oracle de este producto ha mejorado las prestaciones de OGG para la su plataforma. Esta nueva característica mueve las capacidades de captura de OGG al motor de base de datos.


Esta nueva característica de OGG no substituye a la captura tradicional que se explicó en anteriores artículos, si bien ambas están disponibles para el integrador, en plataformas de bases de datos Oracle..

La captura integrada esta basada en las nuevas características del log a nivel interno del motor de base de datos de Oracle, el conocimiento de estas características está solo disponible a nivel del fabricante, la propia Oracle Corporation.



¿Qué ventajas tiene la captura integrada?

Categoría
Descripción
Oracle Exadata database machine
Soporta capturas de Exadata Hybrid Columnar Compression (EHCC).
Compresión de datos
Soporta capturas de OLTP y compresión de segmentos.
Transacciones Distribuidas
  • XA-RAC 
  • PDML (DML paralelo)
Oracle RAC
Gestión del RAC simplificado
Nuevos tipos de datos
  • XML Object relational
  • XML binarios
Tipos de datos LOB
Lecturas parciales y completas de un LOB  (selective selects)
Procesamiento de de los REDO logs
Soporte lecturas multi hilo
Despliegue de la plataforma
Soporte a capturas Downstream y source
Comandos DDL
Captura tablas creadas con la especificación de password en columnas
Otras categorías
Soporte a Tablas OIT (index organizad tables) con la opción mapping

¿Que versiones de Oracle Database soporta la captura integrada?



Oracle GoldenGate 11g R2
Captura
tradicional
8i
Solo soportado en la versión 10.0 y en versiones mas antiguas de OGG
9i
Solo soportado en la versión 10.0 y en versiones mas antiguas de OGG
10.1
Solo soportado en la versión 10.0 y en versiones mas antiguas de OGG
10.2
Soportado
11.1.0.7
TDE/TSE (transparent Data encryption)
Soporte fetch para:
·          Secure files
·          ADT (abstract data type)
·          VARRAYS
·          Tablas anidadas (Nested Tables)
·          Tablas objeto (Object Tables)

11.2.0.2
TDE/TSE (transparent Data encryption)
Fetch support for SecureFiles, ADTs, VARRAYS, Nested Tables, Object Tables
11.2.0.3
TDE/TSE (transparent Data encryption)
Fetch support for SecureFiles, ADTs, VARRAYS, Nested Tables, Object Tables
Oracle GoldenGate 11g R2
Captura
integrada
8i
No soportado
9i
No soportado
10.1
No soportado
10.2*
Soportado
11.1.0.7*
Soporta TDE/TSE (transparent Data encryption)
11.2.0.2*
·          TDE/TSE (transparent Data encryption)
o         Para otras versiones de OGG, aplicar el patch  10395645 for Oracle 11.2.0.2.
·          XA-RAC
·          Compression
·          SecureFiles

Soporte fetch para:
·          ADT (abstract data type)
·          VARRAYS
·          Nested Tables
·          Object Tables

11.2.0.3
con el parche para el bug 13560925
·          TDE/TSE (transparent Data encryption)
o         Para otras versiones de OGG, aplicar el patch  13560925 for Oracle 11.2.0.3.
·          XA-RAC
·          Compression
·          SecureFiles
·          XML Object relational
·          XML binary

Soporte fetch para:
·          ADT (abstract data type)
·          VARRAYS
·          Nested Tables
·          Object Tables

* Solo soporta captura tipo downstream


El coste de licenciamiento de Oracle GoldenGate permanece inalterado según elijamos el tipo de captura, no tiene coste extra. Queda en manos de nosotros, los integradores, que opción elegir conforme las necesidades de nuestro proyecto.