02 septiembre 2017

Batería de scripts útiles.


Algunas consultas SQL muy útiles para el administrador de Oracle (estado de la base de datos Oracle, parámetros generales, ficheros de control, conexiones actuales a Oracle, nombre del ejecutable que se utiliza, nombre del usuario, diccionario de datos, …)
Vista que muestra el estado de la base de datos:

Select * from v$instance;
Consulta que muestra si la base de datos está abierta
select status from v$instance;
Vista que muestra los parámetros generales de Oracle
select * from v$system_parameter;
Versión de Oracle
select value from v$system_parameter where name = 'compatible';
Ubicación y nombre del fichero spfile
select value from v$system_parameter where name = 'spfile';
Ubicación y número de ficheros de control
select value from v$system_parameter where name = 'control_files';
Nombre de la base de datos
select value from v$system_parameter where name = 'db_name';
Vista que muestra las conexiones actuales a Oracle Para visualizarla es necesario entrar con privilegios de administrador
select osuser, username, machine, program  order by osuser;
Vista que muestra el número de conexiones actuales a Oracle agrupado por aplicación que realiza la conexión
select program Aplication, count(program) Numero_Sesiones from v$session group by program order by Numero_Sesiones 
Vista que muestra los usuarios de Oracle conectados y el número de sesiones por usuario
select username Usuario_Oracle, count(username) Numero_Sesiones from v$session group by username order by Numero_Sesiones desc;
Propietarios de objetos y número de objetos por propietario
select owner, count(owner) Numero from dba_objects group by owner order by Numero desc 
Diccionario de datos (incluye todas las vistas y tablas de la Base de Datos)
select * from dictionary
select table_name from dictionary
Muestra los datos de una tabla especificada (en este caso todas las tablas que lleven la cadena "EMPLO"
select * from ALL_ALL_TABLES where upper(table_name) like '%EMPLO%' 
Tablas propiedad del usuario actual
select * from user_tables 
Todos los objetos propiedad del usuario conectado a Oracle
select * from user_catalog  
Consulta SQL para el DBA de Oracle que muestra los tablespaces, el espacio utilizado, el espacio libre y los ficheros de datos de los mismos:
select t.tablespace_name  "Tablespace",  t.status "Estado",                                                                                                                                                                                                                      
    ROUND(MAX(d.bytes)/1024/1024,2) "MB Tamaño",                                                                                                                                                                                                                                 
    ROUND((MAX(d.bytes)/1024/1024) -                                                                                                                                                                                                                                             
    (SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024),2) "MB Usados",                                                                                                                                                                                                            
    ROUND(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024,2) "MB Libres",                                                                                                                                                                                                        
    t.pct_increase "% incremento",                                                                                                                                                                                                                                               
    SUBSTR(d.file_name,1,80) "Fichero de datos"                                                                                                                                                                                                                                  
FROM DBA_FREE_SPACE f, DBA_DATA_FILES d,  DBA_TABLESPACES t                                                                                                                                                                                                                      
WHERE t.tablespace_name = d.tablespace_name  AND                                                                                                                                                                                                                                 
    f.tablespace_name(+) = d.tablespace_name                                                                                                                                                                                                                                     
    AND f.file_id(+) = d.file_id GROUP BY t.tablespace_name,                                                                                                                                                                                                                     
    d.file_name,   t.pct_increase, t.status ORDER BY 1,3 DESC;  
Productos Oracle instalados y la versión:
select * from product_component_version 
Roles y privilegios por roles:
select * from role_sys_privs  
Reglas de integridad y columna a la que afectan:
select constraint_name, column_name from sys.all_cons_columns  
Tablas de las que es propietario un usuario, en este caso "HR":
select table_owner, table_name from sys.all_synonyms where table_owner like 'HR'
Otra forma más efectiva (tablas de las que es propietario un usuario):
select DISTINCT TABLE_NAME                                                                                                                                                                                                                                                       
FROM ALL_ALL_TABLES                                                                                                                                                                                                                                                              
WHERE OWNER LIKE 'HR' 
Parámetros de Oracle, valor actual y su descripción:
select v.name, v.value value, decode(ISSYS_MODIFIABLE, 'DEFERRED',                                                                                                                                                                                                               
     'TRUE', 'FALSE') ISSYS_MODIFIABLE,  decode(v.isDefault, 'TRUE', 'YES',                                                                                                                                                                                                      
     'FALSE', 'NO') "DEFAULT",  DECODE(ISSES_MODIFIABLE,  'IMMEDIATE',                                                                                                                                                                                                           
     'YES','FALSE',  'NO',  'DEFERRED', 'NO', 'YES') SES_MODIFIABLE,                                                                                                                                                                                                             
     DECODE(ISSYS_MODIFIABLE, 'IMMEDIATE', 'YES',  'FALSE', 'NO',                                                                                                                                                                                                                
     'DEFERRED', 'YES','YES') SYS_MODIFIABLE ,  v.description                                                                                                                                                                                                                    
FROM V$PARAMETER v                                                                                                                                                                                                                                                               
WHERE name not like 'nls%'   ORDER BY 1
Usuarios de Oracle y todos sus datos (fecha de creación, estado, id, nombre, tablespace temporal,...):
select  * FROM dba_users
Tablespaces y propietarios de los mismos:
select owner, decode(partition_name, null, segment_name,                                                                                                                                                                                                                         
   segment_name || ':' || partition_name) name,                                                                                                                                                                                                                                  
   segment_type, tablespace_name,bytes,initial_extent,                                                                                                                                                                                                                           
   next_extent, PCT_INCREASE, extents, max_extents                                                                                                                                                                                                                               
from dba_segments                                                                                                                                                                                                                                                                
Where 1=1 And extents > 1 order by 9 desc, 3 
Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó:
select distinct vs.sql_text, vs.sharable_mem,                                                                                                                                                                                                                                    
  vs.persistent_mem, vs.runtime_mem,  vs.sorts,                                                                                                                                                                                                                                  
  vs.executions, vs.parse_calls, vs.module,                                                                                                                                                                                                                                      
  vs.buffer_gets, vs.disk_reads, vs.version_count,                                                                                                                                                                                                                               
  vs.users_opening, vs.loads,                                                                                                                                                                                                                                                    
  to_char(to_date(vs.first_load_time,                                                                                                                                                                                                                                            
  'YYYY-MM-DD/HH24:MI:SS'),'MM/DD  HH24:MI:SS') first_load_time,                                                                                                                                                                                                                 
  rawtohex(vs.address) address, vs.hash_value hash_value ,                                                                                                                                                                                                                       
  rows_processed  , vs.command_type, vs.parsing_user_id  ,                                                                                                                                                                                                                       
  OPTIMIZER_MODE  , au.USERNAME parseuser                                                                                                                                                                                                                                        
from v$sqlarea vs , all_users au                                                                                                                                                                                                                                                 
where (parsing_user_id != 0)  AND                                                                                                                                                                                                                                                
(au.user_id(+)=vs.parsing_user_id)                                                                                                                                                                                                                                               
and (executions >= 1) order by   buffer_gets/executions desc  
Todos los ficheros de datos y su ubicación:
select * from V$DATAFILE   
Ficheros temporales:
select * from V$TEMPFILE  
Tablespaces:
select * from V$TABLESPACE  
Otras vistas muy interesantes:
select * from V$BACKUP; 
select * from V$ARCHIVE; 
select * from V$LOG;   
select * from V$LOGFILE;
select * from V$LOGHIST; 
select * from V$ARCHIVED_LOG; 
select * from V$DATABASE; 
Memoria Share_Pool libre y usada
select name,to_number(value) bytes                                                                                                                                                                                                                                               
from v$parameter where name ='shared_pool_size'                                                                                                                                                                                                                                  
union all                                                                                                                                                                                                                                                                        
select name,bytes                                                                                                                                                                                                                                                                
from v$sgastat where pool = 'shared pool' and name = 'free memory'   
Cursores abiertos por usuario
select b.sid, a.username, b.value Cursores_Abiertos                                                                                                                                                                                                                              
      from v$session a,                                                                                                                                                                                                                                                          
           v$sesstat b,                                                                                                                                                                                                                                                          
           v$statname c                                                                                                                                                                                                                                                          
      where c.name in ('opened cursors current')                                                                                                                                                                                                                                 
      and   b.statistic# = c.statistic#                                                                                                                                                                                                                                          
      and   a.sid = b.sid                                                                                                                                                                                                                                                        
      and   a.username is not null                                                                                                                                                                                                                                               
      and   b.value >0                                                                                                                                                                                                                                                           
      order by 3 
Aciertos de la caché (no debe superar el 1 por ciento)
select sum(pins) Ejecuciones, sum(reloads) Fallos_cache,                                                                                                                                                                                                                         
trunc(sum(reloads)/sum(pins)*100,2) Porcentaje_aciertos                                                                                                                                                                                                                          
from v$librarycache                                                                                                                                                                                                                                                              
where namespace in ('TABLE/PROCEDURE','SQL AREA','BODY','TRIGGER');  
Sentencias SQL completas ejecutadas con un texto determinado en el SQL
select c.sid, d.piece, c.serial#, c.username, d.sql_text                                                                                                                                                                                                                         
FROM v$session c, v$sqltext d                                                                                                                                                                                                                                                    
WHERE  c.sql_hash_value = d.hash_value                                                                                                                                                                                                                                           
and upper(d.sql_text) like '%WHERE CAMPO LIKE%'                                                                                                                                                                                                                                  
ORDER BY c.sid, d.piece   
Una sentencia SQL concreta (filtrado por sid)
select c.sid, d.piece, c.serial#, c.username, d.sql_text                                                                                                                                                                                                                         
FROM v$session c, v$sqltext d                                                                                                                                                                                                                                                    
WHERE  c.sql_hash_value = d.hash_value                                                                                                                                                                                                                                           
and sid = 105                                                                                                                                                                                                                                                                    
ORDER BY c.sid, d.piece                                                                                                                                                                                                                                                          
Tamaño ocupado por la base de datos  
select sum(BYTES)/1024/1024 MB from DBA_EXTENTS
Tamaño de los ficheros de datos de la base de datos
select sum(bytes)/1024/1024 MB from dba_data_files
Tamaño ocupado por una tabla concreta sin incluir los índices de la misma
select sum(bytes)/1024/1024 MB from user_segments                                                                                                                                                                                                                               
 where segment_type='TABLE' and segment_name='NOMBRETABLA' 
Tamaño ocupado por una tabla concreta incluyendo los índices de la misma
select sum(bytes)/1024/1024 Table_Allocation_MB from user_segments                                                                                                                                                                                                               
 where segment_type in ('TABLE','INDEX') and                                                                                                                                                                                                                                     
(segment_name='NOMBRETABLA' or segment_name in                                                                                                                                                                                                                                   
select index_name from user_indexes where table_name='NOMBRETABLA')) 
Tamaño ocupado por una columna de una tabla
select sum(vsize('NOMBRECOLUMNA'))/1024/1024 MB from NOMBRETABLA 
Espacio ocupado por usuario
select owner, SUM(BYTES)/1024/1024 FROM DBA_EXTENTS MB group by owner; 
Espacio ocupado por los diferentes segmentos (tablas, índices, undo, rollback, cluster, ...)
select SEGMENT_TYPE, SUM(BYTES)/1024/1024 FROM DBA_EXTENTS MB                                                                                                                                                                                                                    
group by SEGMENT_TYPE 
Espacio ocupado por todos los objetos de la base de datos, muestra los objetos que más ocupan primero
select SEGMENT_NAME, SUM(BYTES)/1024/1024 FROM DBA_EXTENTS MB                                                                                                                                                                                                                    
group by SEGMENT_NAME                                                                                                                                                                                                                                                            
order by 2 desc  
Obtener todas las funciones de Oracle: NVL, ABS, LTRIM, ...
select distinct object_name                                                                                                                                                                                                                                                      
FROM all_arguments                                                                                                                                                                                                                                                               
WHERE package_name = 'STANDARD'  
order by object_name





29 agosto 2017

¿Hay vida más allá de Oracle? Hoy presentamos PrestoDB

Este artículo está hecho para que los posibles administradores y usuarios finales sepan qué esperar de Presto.


Definición

Presto es un motor de consulta SQL distribuido diseñado para consultar conjuntos de datos grandes distribuidos sobre una o más fuentes de datos heterogéneas.


Lo que no es Presto DB en la actualidad

Debido a que Presto está siendo llamado una base de datos por muchos miembros de la comunidad, tiene sentido comenzar con una definición de lo que Presto no es.

No confunda el hecho de que Presto entiende SQL con él que proporciona las características de una base de datos estándar. Presto no es una base de datos relacional de uso general. No es un reemplazo para bases de datos como MySQL, PostgreSQL u Oracle. Presto no fue diseñado para procesar transacciones en línea (OLTP). Esto también es cierto para muchas otras bases de datos diseñadas y optimizadas para data warehouse o análisis de datos.

¿Qué es Presto?

Presto es una herramienta diseñada para consultar eficientemente grandes cantidades de datos mediante consultas distribuidas. Si trabaja con terabytes o petabytes de datos, es probable que utilice herramientas que interactúen con Hadoop y HDFS. Presto fue diseñado como una alternativa a las herramientas que consultan HDFS usando tuberías de trabajos de MapReduce como Apache Hive o Pig, pero Presto no se limita a acceder a HDFS. Presto puede ser ampliado para operar sobre diferentes tipos de fuentes de datos, incluyendo bases de datos relacionales tradicionales y otras fuentes de datos como Cassandra.

Presto fue diseñado para manejar data warehousing y análisis: análisis de datos, agregando grandes cantidades de datos y produciendo reportes. Estas cargas de trabajo se clasifican a menudo como procesamiento analítico en línea (OLAP).

¿Quién usa Presto?


Presto es un proyecto de código abierto que funciona bajo los auspicios de Facebook. Fue inventado en Facebook y el proyecto continúa siendo desarrollado por los desarrolladores internos de Facebook y un número de desarrolladores de terceros en la comunidad. En mi último trabajo se usó para sustituir a la base de datos que soportaba el modelo de datawarehouse, debido a coste económico del mantenimiento.

Presto es un sistema distribuido que se ejecuta en un grupo de máquinas. Una instalación completa incluye un coordinador y varios trabajadores. Las consultas se envían desde un cliente como la CLI Presto al coordinador. El coordinador analiza, analiza y planifica la ejecución de la consulta, luego distribuye el procesamiento a los trabajadores.

Requisitos

Presto tiene algunos requisitos básicos: 
  • Linux o Mac OS X
  • Java 8, 64 bits
  • Python 2.4+



Conectores

Presto admite conectores enchufables que proporcionan datos para consultas. Los requisitos varían según el conector.

HADOOP / HIVE

Presto admite la lectura de datos de cola de las siguientes versiones de Hadoop: 
    • Apache Hadoop 1.x
    • Apache Hadoop 2.x
    • Cloudera CDH 4
    • Cloudera CDH 5

Se admiten los siguientes formatos de archivo: Texto, Archivo secuencial, RCFile, ORC y Parquet.

Además, se requiere un metastore remoto de colmena. No se admite el modo local o incorporado. Presto no usa MapReduce y por lo tanto sólo requiere HDFS.

CASSANDRA

Se requiere Cassandra 2.x. Este conector es completamente independiente del conector Hive y sólo requiere una instalación de Cassandra existente.

TPC-H

El conector TPC-H genera dinámicamente datos que pueden utilizarse para experimentar y probar Presto. Este conector no tiene requisitos externos.

Despliegue

Consulte Implementación de Presto para obtener instrucciones completas de implementación.

Ejecución de consultas

Puede ejecutar consultas utilizando la Interfaz de línea de comandos después de implementar Presto.
La CLI de Presto proporciona un shell interactivo basado en terminal para ejecutar consultas. La CLI es un archivo JAR que se ejecuta automáticamente, lo que significa que actúa como un ejecutable normal de UNIX.

Descargar presto-cli-0.183-ejectable.jar, renombrarlo a presto, hacerlo ejecutable con chmod + x, luego ejecutarlo:

./presto --server localhost: 8080 --cambio de catálogo --schema default

Ejecute la CLI con la opción --help para ver las opciones disponibles.


De forma predeterminada, los resultados de las consultas se paginan utilizando el programa menos que está configurado con un conjunto cuidadosamente seleccionado de opciones. Este comportamiento se puede sobreescribir estableciendo la variable de entorno PRESTO_PAGER al nombre de un programa diferente como, por ejemplo, más o establecerlo en un valor vacío para desactivar completamente la paginación.

28 agosto 2017

Entender Oracle Data Guard

En este artículo, escribiré sobre la solución de recuperación de desastres de Oracle (recuperación de desastres). Voy a dar la terminología básica en una breve información sobre el Data Guard. Como gestores de datos, estamos obligados a tomar las medidas necesarias antes de que ocurran estos desastres. También hay que considerar tomar las acciones necesarias que son muy importantes. Estos son;
  • RPO (Recovery Point Objective) - ¿Cuántos datos puede permitirse perder?
  • RTO (Recovery Time Objective) - Sin acceso a los datos, ¿Cuanto tiempo puedes soportar?

De acuerdo con las respuestas de estas preguntas debemos establecer el sistema de copia de seguridad. No estamos satisfechos con la instalación de nuestro sistema, y ​​debemos monitorear nuestro sistema.

Ahora, veamos la solución que Oracle propone:  Oracle Data Guard.

Oracle Data Guard es la solución de recuperación de desastres. Protege nuestra base de datos de producción de los desastres, reduciendo la carga de trabajo sobre ella y su uso más efectivo. Technology, introducida por primera vez mediante el establecimiento de la base de datos de reserva manualmente con Oracle 7. Apareció como un Data Guard con Oracle 8i. 

Evolución histórica de Oracle Data Guard
Si examinamos las características de un Data Guard desde el pasado hasta el presente;
  • ORACLE 8i
    • Base de datos en espera de sólo lectura
    • Recuperación gestionada
    • Archivo de registro de rehacer archivos remotos
  • ORACLE 9i
    • Integración "Pérdida de datos cero"
    • Data Guard Broker y Data Guard Manager GUI
    • Operaciones de Switcover y Failover
    • Sincrónico automático
    • Base de datos de espera lógica
    • Protección máxima
  • ORACLE 10g
    • Aplicación en tiempo real
    • Soporte forzado para Oracle RAC
    • Failover de arranque rápido
    • Transferencia asíncrona de rehacer
    • Base de datos Flashback
  • ORACLE 11g
    • Base de datos de espera activa (Active Data Guard)
    • Instantánea de la instantánea
    • Soporte de plataforma heterogénea (Producción -Linux, Standby - Windows)
  • ORACLE 12C
    • Funciones comunes a Redo Apply y SQL Apply
    • Funciones especificas a Redo Apply
    • Funciones especificas a  SQL Apply




FLUJO DE DATOS: PHYSICAL STANDBY
Vamos a entender cómo los datos fluyen en la configuración de Oracle Data Guard mostrada arriba en ocho puntos:


  • En la base de datos principal, se inician las transacciones. Todos los bloqueos de caché del búfer (bloqueos exclusivos) que se requieren para la transacción se obtienen.
  • En la base de datos principal, los bloques de rehacer que describen los cambios (o los vectores de cambio) se generan y almacenan en el Área Global del Programa (PGA) de los procesos. Después de adquirir con éxito el bloqueo de rehacer asignación, el espacio se asigna en el búfer de registro de rehacer. El redo generado se copia de PGA de los procesos en el búfer de registro de rehacer.
  • En la base de datos primaria, el proceso de primer plano de oracle le indica a LGWR que limpie los búferes de registro de rehacer en el disco. Recuerde que los bloques de base de datos de la base de datos aún no se han actualizado con los cambios DML. El LGWR descarga los buffers de redo al ORL y reconoce la finalización de la sesión. En este punto, la transacción es persistente en el disco. No se ha cometido hasta el momento.



En algún momento futuro, los buffers de base de datos que fueron cambiados previamente serán escritos en disco por el proceso de escritura de base de datos (DBWR) en el momento del punto de control. Este punto no está marcado en el diagrama anterior.
Tenga en cuenta que antes de que el proceso DBWR haya descargado los búferes de la base de datos a los discos, el proceso LGWR debe haber escrito ya los búferes de rehacer en el disco. Esta secuencia explícita es reforzada por el protocolo de registro anticipado.
También el proceso ARCH en la base de datos primaria archiva los ORL en archivos de registro de archivos. Este punto tampoco está marcado en el diagrama anterior.

  • En la base de datos primaria, el proceso LNS lee el redo recientemente descargado del búfer de registro de redo y envía los datos de rehacer a la base de datos en espera utilizando el destino de transporte redo (LOG_ARCHIVE_DEST_n) que definimos durante la creación de la base de datos en espera. Estamos utilizando el método de transporte ASYNC, por lo que el LGWR no espera ningún reconocimiento de la LNS para esta operación de envío de red. No se comunica con el LNS excepto para iniciarlo en la etapa de inicio de la base de datos y después de un fallo de una conexión en espera.
  • En la base de datos de espera, el RFS lee el flujo de rehacer desde el socket de red en los búferes de red y, a continuación, escribe este flujo de rehacer a la SRL.
  • En la base de datos de espera, el proceso ARCH archiva las SRL en archivos de registro de archivo cuando se produce un cambio de registro en la base de datos primaria. El archivo de registro de archivo generado se registra con el archivo de control de espera.
  • En la base de datos de espera, el proceso de recuperación real comienza en este paso. El proceso de recuperación administrado (MRP) leerá de forma asincrónica el rehacer de los SRL o de los registros de rehacer archivados (cuando la recuperación se reduce o no se aplica en tiempo real). Los bloques que requieren redo apply se analizan y se colocan en segmentos de mapa en memoria apropiados.
  • En la base de datos en espera, el proceso MRP envía rehacer a los esclavos de recuperación utilizando el marco de comunicación entre procesos de consulta en paralelo (PQ). Medios paralelos

Recuperación (PMR) hace que los bloques de datos requeridos sean leídos en la caché del búfer, y posteriormente redo se aplicará a estos búferes del búfer del búfer.


PROCESOS RELACIONADOS CON BASE DE DATOS EN ESPERA FÍSICA

En la base de datos primaria:
  • LGWR: El proceso de escritura de registros vacía los buffers de registro de los archivos SGA a Online Redo Log.
  • LNS: El servicio de red de LogWriter (LNS) lee el redo que es descargado de los almacenadores intermediarios del redo por el LGWR y envía el redo sobre red a la base de datos espera. El propósito principal del proceso LNS es liberar el proceso LGWR de realizar el rol redo transport. 
  • ARCH: El archivador procesa los archivos de ORL para archivar los archivos de registro. Pueden existir hasta 30 procesos ARCH, y estos procesos ARCH también se utilizan para satisfacer solicitudes de resolución de huecos. Tenga en cuenta que un proceso ARCH tiene un papel especial en que está dedicado al archivo de registro de redo local solo y nunca se comunica con una base de datos en espera.

En la base de datos de reserva:
  • RFS: El objetivo principal del proceso de servidor de archivos remotos es realizar una red de recepción de redo transmitida desde el sitio principal y, a continuación, escribe el búfer de red (rehacer datos) a los archivos de redo registro (SRL) en espera.
  • ARCH: Los procesos de archivo en el sitio en espera realizan las mismas funciones realizadas en el sitio principal, excepto que en el sitio en espera, un proceso ARCH genera archivos de registro archivados de las SRL.
  • MRP: el proceso de recuperación administrado coordina la administración de recuperación de medios. Recuerde que un modo de espera físico está en modo de recuperación perpetua.
Básicamente, podemos categorizar la base de datos de espera física en tres componentes principales:

Data Guard Redo Servicios de Transporte
Para transferir el redo generado por la base de datos primaria a la base de datos en espera.

Data Guard Aplicar Servicios
Para recibir y aplicar el redo enviado por Redo Transport Services a la base de datos en espera.

Data Guard servicios de gestión de roles
Para ayudar en los cambios de rol de la base de datos en los escenarios de conmutación y conmutación por error- Este servicio funciona en segundo plano y se ocupa de los escenarios de conmutación / conmutación por error

27 agosto 2017

Nueva versión de Oracle GoldenGate para Big Data 12.3.1.1



En este artículo vamos a ver, Lo que todo el mundo debe saber sobre Oracle GoldenGate Big Data 12.3.1.1 

Las principales características de esta versión incluyen las siguientes novedades
  • Como nuevos objetivos de Oracle GoldenGate 12c se encuentran los siguientes sistemas:
    • Amazon Kinesis
    • API de Integración Kafka o Kafka Connect Confluent.
    • Elasticsearch
  • El Motor de Oracle GoldenGate Core 12.3: soporta los formatos de base de datos Oracle Database 12.2 y más recientes
  • Nuevas Certificaciones:
    • Apache Hadoop 2.8,
    • CDH 5.10, 5.11,
    • Hive 2.x,
    • Kafka 0.10, 0.11,
    • Cassandra 3.11
    • ...
  • Mapeo de plantillas: define plantillas para resolver dinámicamente el nombre de secuencia y la clave de partición en tiempo de ejecución
  • Rendimiento: Rendimiento mejorado hasta el 20% en comparación con la versión anterior.



Oracle GoldenGate ofrece una arquitectura modular diseñada para un rendimiento extremo, tolerancia a fallos y flexibilidad. Oracle GoldenGate para Big Data se basa en la misma arquitectura para permitir soluciones extensibles para los grandes entornos de datos de los clientes.
Oracle GoldenGate captura datos de sistemas fuente heterogéneos incluyendo sistemas de mensajería basados en Java, de forma no invasiva y con gastos indirectos insignificantes. Almacena transacciones de base de datos en archivos planos y lo bombea al marco del Adaptador Java.

Oracle GoldenGate para Big Data incluye controladores para diferentes grandes tecnologías de datos, como HDFS, Hive, HBase, Flume, Kafka, NoSQL, JDBC, etc. También incluye tecnología de formateo conectable que puede usarse para transformar datos en formatos estándar como XML , JSON, Avro, Texto delimitado. Está construido utilizando la arquitectura Java extensible, que le permite entregar fácilmente a otros grandes sistemas de datos y soportar casos de uso específicos para satisfacer sus demandas empresariales.

Con la plataforma de streaming en tiempo real de Oracle GoldenGate, puede capturar desde el sistema de origen una vez y entregar todo o una parte de los datos modificados a múltiples destinos sobre cloud, híbridos e incluso bases de datos, sistemas de mensajería y entornos de datos grandes.



En siguientes entradas de blog haremos un ejemlo de uso de GoldenGate con Big Data.

31 julio 2017

Un DBA en la(s) Nube(s)

No es ningún secreto que los datos son el nuevo Rey Midas, una fuente de creación de riqueza a la par con el capital financiero, dicen algunos. Así que es un poco irónico que un grupo de personas que entienden mejor que nadie cómo administrar los datos se sienten cada vez más excluidos del partido.
Los administradores de bases de datos, o DBA, son y serán los expertos responsables del rendimiento y la seguridad de una creciente lista de tipos de base de datos:
  • Nuestras viejas amigas las bases de datos relacionales.
  • Las bases de datos en memoria.
  • Y las nuevas propuestas tecnológicas ya presentes en el mercado las bases de datos No SQL.

Estas bases de datos proporcionan la tecnología principal de las actividades empresariales digitales como el comercio electrónico, la informática móvil y las redes sociales, y son parte integral de tendencias como los grandes datos, la inteligencia artificial y la Internet de las Cosas. Pero aquí está el problema para los DBA:

 Los proveedores de la nube ahora ofrecen servicios de base de datos totalmente gestionados que asumen muchas de las tareas diarias de los DBA internos de una empresa.


En mi opinión, muchas de las tareas mundanas de un DBA se van ", incluyendo muchas de las tareas en las que los DBA estarían de guardia las 24 horas del día,”. Dichas tareas pueden incluir la aplicación de actualizaciones de software o la copia de seguridad de datos, que se automatizan con un servicio de nube de base de datos. Mientras tanto, las partes del trabajo que son más interesantes y más visibles para una línea de líderes empresariales, como el modelado de datos y la seguridad de los datos, sólo crecerán.
Según mi experiencia y hablando con otros DBA experimentados, existen varias maneras de reinventar la carrera del DBA en la era de la nube.


Dominar la migración hacia la nube
Las empresas en el mundo tardarán mucho tiempo en pasar de las bases de datos locales a un futuro de bases de datos totalmente administradas en la nube. Cuando el equipo de TI mueve una base de datos Oracle a infraestructuras en la nube como Amazon Web Services o Oracle Bare Metal infrastructure, sus bases de datos seguirán gestionadas principalmente por sus propios DBA. Sin embargo, con el tiempo, a medida que las empresas utilicen más aplicaciones basadas en la nube, la base de datos que utilizan será administrada por el proveedor de la nube.

Durante esta transición, hay muchas necesidades tácticas que los DBA pueden ayudar a cumplir. Cuando una empresa está trabajando con tecnología local y Nube, alguien necesita entender el entorno de esta, pero también cosas como acceso VPN, seguridad, principios básicos de infraestructura de redes y base de datos.
El DBA debe de asesorar a su empresa a entender qué aplicaciones deben ser trasladadas a la nube inmediatamente y que deben esperar. Sobre todo, aprovechar las oportunidades que brindan los proveedores de nube para hacer migraciones y pilotos de forma gratuita.


Crecer en nuevos roles tecnológicos
Los cambios son una constante en la carrera del DBA. Hemos visto esto antes en versiones anteriores de la base de datos cuando Oracle introdujo la automatización a un montón de tareas de DBA: administración de almacenamiento automatizada, repositorio automático de carga de trabajo y alguno se hizo la pregunta ¿Voy a perder mi trabajo? Bueno algún ejemplo de este tipo de profesionales si nos lo habremos encontrado, pero hasta ellos mismos se habrán reprendido por hacerse esta pregunta.
Los DBA decidimos aprendier a confiar en la automatización e invertimos nuestro tiempo hacia trabajos de mayor valor.

Ahora puedes explorar herramientas de código abierto como Docker o Ansible, y aprender a usar los servicios REST. Ahora estamos creciendo de nuevo. Es posible que hayas estado haciendo lo mismo durante los últimos 10 años, y ahora está abriendo el libro O'Reilly y leyendo sobre la infraestructura como código y automatización en entornos dela nube. Eso es genial. Eso es crecimiento de carrera tanto como DBA como persona.


Hacerse responsable de asegurar los datos correctos para impulsar una estrategia empresarial
Esta es a mi modo de ver la opción más desafiante y a la que me quiero enfocar.
Hay miles de millones de datos en línea de servicios sociales y de intercambio de datos e IoT. Así que existe ya el papel de poner los datos a disposición de sus usuarios de negocios, y ese papel los DBA lo debemos de hacer nuestro,

Sabemos cómo se mueven los datos es una actividad natural para gente como nosotros. Por ejemplo, si una compañía cualquiera, puede querer analizar datos de múltiples fuentes, lo que requiere es de un DBA que entiende los formatos de datos y puede reunirlos. Un DBA puede ofrecer aún más valor al trabajar para entender el modelo de negocio de la empresa y asesorar sobre qué datos son más valiosos para el negocio.

Seamos sinceros un DBA no es un doctor en Estadística, pero pueden hacer que el papel de científico de datos sea mucho más valioso al conseguir que los datos sean más rápidos y más eficientes y al proporcionar una comprensión real de las diferentes fuentes de datos.

Hay mucho más que los DBA necesitan saber además de cómo administrar una o varias instancias de una base de datos. El DBA necesita tener un pensamiento crítico, necesita tener habilidades de comunicación con el equipo de usuarios del dato, necesita aportar su experiencia en resolución de problemas, bajo presión. El DBA de Oracle con los dedos en el teclado ya no tiene lugar, en cambio tienes que entender como los líderes empresariales quieren utilizar sus datos.
Has de empezar tomando contacto con los analistas de negocios de las distintas líneas de negocio para entender lo que esperan obtener de nuevas fuentes de datos y de la agilidad que proporciona la nube.


Otra competencia del DBA que no va a desaparecer es la de la seguridad de los datos. Alguien tiene que preocuparse por la seguridad de los datos a medida que el negocio amplía el acceso a todas estas formas y fuentes de datos. El proveedor de la nube podrá cifrarlos, pero ni sabe lo que es, ni quiere hacerlo o puede que ni lo ofrezca. Alguien en el lado del cliente de la nube, necesita entender y  clasifica el modelo de privilegios que tienen para quién puede acceder a los datos.

¿Que os parece el futuro de los DBA bajo la nube?

Oracle Database 12c R1: TDE en Pluggable Databases (PDBs)

La base de datos Oracle 12c introdujo una nueva forma de administrar almacenes de claves claves cifradas y datos a securizar mediante el comando:
  • ADMINISTER KEY MANAGEMENT. 

Esto reemplaza los comandos:
  • ALTER SYSTEM SET ENCRYPTION KEY
  • ALTER SYSTEM SET ENCRYPTION WALLET 

para la administración de claves y wallets de versione anteriores La terminología de la documentación mezcla libremente los términos wallet y keystore, pero la intención parece ser pasar al término keystore, de acuerdo con la terminología de Java.

La arquitectura de múltiples terminales complica un poco la gestión de claves, ya que el contenedor raíz necesita un almacén de claves abierto con una clave de cifrado principal activa. El almacén de claves CDBs se utiliza para almacenar claves de cifrado para todos los PDB asociados, pero cada uno necesita su propia clave de cifrado principal. La clave de cifrado maestro para el PDB se debe exportar antes de una operación de desenchufado, por lo que se puede importar después de una operación de complemento posterior.

Aquí vamos a describir las operaciones de administración de claves básicas que se relacionan con Transparent Data Encryption (TDE). Algunas de las funcionalidades del keystore que vamos a ver en el presente artículo son:
  • Localización del Almacén de claves
  • Como crear un Almacén de claves
  • Usar el Keystore para  implementar la opción TDE
  • Usar PDBs Con la opción TDE
  • Auto-Login en Almacenes de claves
Localización del Almacén de claves
Se debe crear un almacén de claves para mantener la clave de cifrado. El orden de búsqueda para encontrar el almacén de claves es el siguiente.
  • Si está presente, la ubicación especificada por el parámetro ENCRYPTION_WALLET_LOCATION en el archivo "sqlnet.ora".
  • Si está presente, la ubicación especificada por el parámetro WALLET_LOCATION en el archivo "sqlnet.ora".
  • La ubicación predeterminada para el almacén de claves. Si se establece $ ORACLE_BASE, esto es "$ ORACLE_BASE / admin / DB_UNIQUE_NAME / wallet", de lo contrario es "$ ORACLE_HOME / admin / DB_UNIQUE_NAME / wallet", donde DB_UNIQUE_NAME proviene del archivo de parámetros de inicialización.
Los almacenes de claves no se deben compartir entre los CDB, por lo que si se ejecutan varios CDB desde el mismo ORACLE_HOME, debe realizar una de las siguientes acciones para mantenerlos separados.
  • Utilice la ubicación predeterminada keystore, por lo que cada base de datos CDB tiene su propia almacén de claves.
  • Especifique la ubicación mediante el método $ ORACLE_SID

ENCRYPTION_WALLET_LOCATION =
  (SOURCE =(METHOD = FILE)(METHOD_DATA =
    (DIRECTORY = /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore/)
  • Tenga un "sqlnet.ora" por separado para cada base de datos, asegurándose de que la variable TNS_ADMIN está establecida correctamente.

Independientemente de dónde coloque el almacén de claves, asegúrese de no perderlo. Oracle 12c es extremadamente sensible a la pérdida del keystore. Si lo pierdes o cometes un error tendrás que tener que recrear la instancia limpia una y otra vez.

Crear un Almacén de claves
Debemos de editar el fichero sqlnet.ora, añadiendo la siguiente entrada al fichero:

ENCRYPTION_WALLET_LOCATION =
  (SOURCE =(METHOD = FILE)(METHOD_DATA =
    (DIRECTORY = /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore/)
Crea el directorio para mantener el almacén de claves.

mkdir -p /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore


Conecta al contenedor raíz y crea el almacén de claves


CONN / AS SYSDBA

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/cdb1/encryption_keystore/' IDENTIFIED BY myPassword;

HOST ls /u01/app/oracle/admin/cdb1/encryption_keystore/
ewallet.p12

SQL>
Puedes abrir y cerrar el almacén de claves desde el contenedor raiz usando los siguientes comandos. 

Para abrir:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword CONTAINER=ALL;

Para cerrar:
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY myPassword CONTAINER=ALL;


Es necesario crear y activar una clave maestra en el contenedor de raíz y una en cada una de las bases de datos conectables. Utilizar la cláusula CONTAINER = ALL lo hace en un solo paso. Si se omite la cláusula CONTAINER = ALL, sólo se realizará en el contenedor actual y se deberá volver a realizar para cada PDB individualmente. La información sobre la clave maestra se muestra usando la vista V $ ENCRYPTION_KEYS.

ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY myPassword WITH BACKUP CONTAINER=ALL;

SET LINESIZE 100
SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- ------------------------------------------------------------------------------
         0 AdaYAOior0/3v0AoZDBV8hoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
         0 AYmKkQxl+U+Xv3UHVMgSJC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

SQL>

La información sobre el almacén de claves se muestra usando la vista V $ ENCRYPTION_WALLET.

SET LINESIZE 200
COLUMN wrl_parameter FORMAT A50
SELECT * FROM v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                      STATUS                         WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID
-------------------- -------------------------------------------------- ------------------------------ -------------------- --------- --------- ----------
FILE                 /u01/app/oracle/admin/cdb1/encryption_keystore/    OPEN                           PASSWORD             SINGLE    NO                 0

SQL>

Conectar al PDB. Si no creó la clave en el paso anterior, cree una nueva clave maestra para el PDB.

CONN sys@pdb1 AS SYSDBA



SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- ------------------------------------------------------------------------------
         0 DSrc9RAE//v/jcxEDSGIEEEEEEEEEEEEEEEEEEEEEEEEEEE

SQL>

Usar el Almacén de claves con la opción TDE


Ahora debe ser capaz de crear una tabla con una columna cifrada en el PDB.

CONN test/test@pdb1

-- Encrypted column
CREATE TABLE tde_test (
  id    NUMBER(10),
  data  VARCHAR2(50) ENCRYPT
);

INSERT INTO tde_test VALUES (1, 'This is a secret!');
COMMIT;
También podemos crear tablespaces cifrados

CONN sys@pdb1 AS SYSDBA

CREATE TABLESPACE encrypted_ts
DATAFILE SIZE 128K
AUTOEXTEND ON NEXT 64K
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);

ALTER USER test QUOTA UNLIMITED ON encrypted_ts;

CONN test/test@pdb1

CREATE TABLE tde_ts_test (
  id    NUMBER(10),
  data  VARCHAR2(50)
) TABLESPACE encrypted_ts;

INSERT INTO tde_ts_test VALUES (1, 'This is also a secret!');
COMMIT;
Si se reinicia el PDB, el almacén de claves debe abrirse en el PDB antes de que se pueda acceder a los datos.

CONN sys@pdb1 AS SYSDBA

SHUTDOWN IMMEDIATE;
STARTUP;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword;

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1 This is a secret!

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 This is also a secret!

SQL>

Si se reinicia el CDB, el almacén de claves debe estar abierto tanto en el CDB como en los PDB.

CONN / AS SYSDBA

SHUTDOWN IMMEDIATE;
STARTUP;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword CONTAINER=ALL;

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1 This is a secret!

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 This is also a secret!

SQL>

Auto-Login en Almacenes de claves

La creación de un almacén de claves de inicio automático significa que ya no es necesario abrir explícitamente el almacén de claves después de reiniciarlo. La primera referencia a una clave hace que el almacén de claves se abra automáticamente, como se muestra a continuación.

CONN / AS SYSDBA
ADMINISTER KEY MANAGEMENT CREATE LOCAL AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/admin/cdb1/encryption_keystore/' IDENTIFIED BY myPassword;

SHUTDOWN IMMEDIATE;
STARTUP

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1  Esto es un texto secreto

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 Esto es otro texto secreto

SQL>