05 noviembre 2017

¿Qué podemos hacer con una bbdd stand física?





Está claro que podemos hacer este tipo de maniobras si no tenemos Oracle Golden Gate, ¿Y quien no lo tiene a estas alturas?

Aparte de ser usadas para sofocar un desastre, podemos sacarle otras posibilidades:
  
  •     Origen de información de nuestras herramientas de elaboración de informes.
  •     Laboratorio de pruebas (ante nuevas aplicaciones, modificaciones en las   existentes.)
  •     Recuperación ante errores "humanos" en los entornos de producción.
  •     Copias de seguridad.
Todo ello sin que perdamos la funcionalidad de la BBDD standby y en la mayoría de casos sin perder la protección que esta nos brinda en ningún momento. Hoy nos centraremos en los dos últimos casos, recuperación ante errores y pruebas.


Introducción

Las BBDD standby son replicas de nuestros productivos bit a bit, copias exactas que se mantienen normalmente en ubicaciones remotas y que inicialmente se destinan a protección ante desastres.

En caso que la ubicación física en la que tenemos los servidores principales se vea inutilizada por inundaciones, incendios, averías, cortes de comunicaciones o otros tipos de desastres se realiza un “failover” a la ubicación remota, empezando a trabajar en esta en un tiempo mínimo (unos pocos minutos). El problema es que normalmente se tarda mucho más en decidir pasar a la ubicación de respaldo que en la operación misma (si bien se puede automatizar, la mayoría de gente la tiene en modo manual).

También se usan en caso de querer realizar mantenimientos en la ubicación principal, en este caso realizaremos un “switchover” (un fallback controlado), con el que aseguramos no perder ningún dato y que nos permite volver a la ubicación principal fácilmente (mediante otro “switchover”).

El conjunto de BBDD principal / standby disponen de una serie de procesos y herramientas:

  • Data Guard: gestionan el estado de la replicación, la configuración, los cambios de rol (switchover/failover) y facilitan su gestión y control. 
  • Estos procesos y herramientas disponen de una interfaz gráfica (Database Control y/o Grid Control) y de línea de comandos (DGMGRL).

Hands on!

  • Apertura solo lectura
Supongamos que alguien, el cuñado del director de la compañía, ha eliminado/modificado algún objeto/s de la BBDD (código PLSQL, datos, tablas, una vista, ...) y nos planteamos restaurar una copia de seguridad de la BBDD para recuperar estos objetos, esto pueden ser horas de trabajo, de cintas ocupadas, de disponibilidad de servidores… y sobre todo saber que el zarpas nos ha arruinado la tarde y hay Champions, ¿Como nos puede ayudar una "standby"? ¿Veremos el partido o mataremos al "zarpas"?

Necesitaremos es tener una standby y que esta no este “al día”, esto es, que la standby aplique los cambios con un cierto retraso (no tanto como el del cuñado del director, claro). Esto implica que los cambios en la principal se envían inmediatamente a la standby, pero esta no los aplica en el momento de su llegada, espera un margen de tiempo a aplicarlos, estos ficheros quedan en el esacio de redo de la BBDD standby.

Si aplicamos los cambios de esta manera, la standby nos sigue dando seguridad (los cambios se han enviado al site remoto) y nos brinda la posibilidad de abrirla y ver una imagen de la principal de “hace un cierto tiempo”.

El parámetro de la configuración de Data Guard a modificar para conseguir un retardo en la aplicación del redo es el “DelayMins”, en este caso lo tenemos a 180 minutos:

DGMGRL> show database verbose sbtest;

Database
Name:            sbtest
Role:            PHYSICAL STANDBY
Enabled:         YES
Intended State:  ONLINE
Instance(s):
sbrsocial

Properties:
InitialConnectIdentifier        = 'sbtest'
ObserverConnectIdentifier       = ''
LogXptMode                      = 'SYNC'
Dependency                      = ''
DelayMins                       = '180'
Binding                         = 'OPTIONAL'
MaxFailure                      = '0'
MaxConnections                  = '1'
ReopenSecs                      = '300'
NetTimeout                      = '180'
LogShipping                     = 'ON'
PreferredApplyInstance          = ''
ApplyInstanceTimeout            = '0'
ApplyParallel                   = 'AUTO'
StandbyFileManagement           = 'AUTO'

Modificamos  el parámetro desde las herramientas graficas o mediante línea de comandos con la sentencia:
DGMGRL> EDIT DATABASE 'sbtest' SET PROPERTY 'DelayMins'=180;

Si las modificaciones erróneas no han llegado a aplicarse a los ficheros de la standby, solo tenemos que abrirla y recuperar la información perdida (mediante un DBLink desde la principal por ejemplo).

Al tener una base de datos standby controlada con Data Guard en MAXPERFORMANCE, para abrirla en modo solo lectura solo tenemos que ejecutar en la línea de comandos:
[SRVTEST_BD1_ORACLE: oracle@srvtest dbs]$ dgmgrl
DGMGRL for Linux: Version 10.2.0.4.0 - 64bit Production

Copyright (c) 2000, 2005, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
DGMGRL> connect /
Connected.
DGMGRL> EDIT DATABASE sbtest SET STATE='READ-ONLY';
Succeeded.

Con esto ya tenemos la BBDD standby abierta, podemos realizar consultas en ella y lo más importante, no se deja de enviar redo de la principal a la standby con lo que mantenemos la protección.
Una vez recuperados los datos necesarios volvemos al estado anterior (BBDD montada y aplicando cambios con el retardo programado)

[SRVtest_BD1_ORACLE: oracle@srvtest dbs]$ dgmgrl
DGMGRL for Linux: Version 10.2.0.4.0 - 64bit Production

Copyright (c) 2000, 2005, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
DGMGRL> connect /
Connected.
DGMGRL> edit database sbtest set state='ONLINE';
Succeeded.

Como se puede comprobar la complejidad y el tiempo necesario para realizar la operación son mínimos y las ventajas que nos aporta muchas (en mi opinión).
  • Apertura lectura/escritura
Ahora tenemos otro caso, para imaginar, una nueva aplicación entrará en producción o queremos modificar una de las existentes con cambios importantes que afectan múltiples esquemas. Las pruebas en test o desarrollo, no son posibles/fiables (por no interferir en los equipos de desarrollo o por ser estos entornos sensiblemente más pequeños que el productivo) en consecuencia nos vemos en la obligación de montar un entorno nuevo para estas pruebas.

Una vez más la BBDD standby  nos puede ayudar, en este caso la abriremos en modo lectura/escritura, realizaremos modificaciones y pruebas pertinentes y finalmente descartaremos las modificaciones y la devolveremos a su estado inicial. La BBDD “test” es la principal mientras que la “sbtest” es la standby.


El primer requisito para realizar estas acciones es tener la Flash Recovery Area (FRA) configurada en la BBDD standby, en caso de no disponer de esta, la configuramos:

[oracle@srvtest source]$ mkdir /soft/oracle/oradata/sbtest/flash_recovery_area

SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string
db_recovery_file_dest_size           big integer 0
recovery_parallelism                 integer     0

SQL> alter system set db_recovery_file_dest_size=10G scope=both;

Sistema modificado.

SQL> alter system set db_recovery_file_dest='/soft/oracle/oradata/sbtest/flash_recovery_area' scope=both;

Sistema modificado.

En caso de estar en modo de protección MAXAVAILABILITY pasamos a MAXPERFORMANCE:
[SRVTEST_BD1_ORACLE: oracle@srvtest dbs]$ dgmgrl
DGMGRL for Linux: Version 10.2.0.4.0 - 64bit Production

Copyright (c) 2000, 2005, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
DGMGRL> connect /
Connected.
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXPERFORMANCE;
Succeeded.
Paramos el aplicado del redo en la standby:

DGMGRL> edit database sbtest set state='APPLY-OFF';.
Succeeded.

Necesitaremos crear un punto de recuperación:

  • A partir de este momento la BBDD standby guardará todos los cambios en un fichero creado a tal propósito en la FRA (el Flashback log), usará este “log de cambios” para deshacerlos una vez terminadas las pruebas.

SQL> CREATE RESTORE POINT Standby_flashback_testing GUARANTEE FLASHBACK DATABASE;

Punto de restauración creado.
SQL> select NAME,SCN,TIME from v$restore_point;

NAME
--------------------------------------------------------------------------------
SCN
----------
TIME
---------------------------------------------------------------------------
STANDBY_FLASHBACK_TESTING
8151200819
11/03/10 12:37:53,000000000
Paramos el envío de archivado a la BBDD standby. Forzamos el envió del último log online y paramos el transporte. Es importante comprobar que este archivado que hemos enviado ha quedado archivado en la standby.
[SRVTEST_BD1_ORACLE: oracle@srvtest dbs]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Mar 11 12:32:47 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

SQL> connect / as sysdba
Connected.
SQL> alter system archive log current;

System altered.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
Comprobamos que el redo log se ha archivado en la BBDD standby:
-rw-r----- 1 oracle oinstall  2548224 Mar 15 11:45 arch1_69_709240912.dbf
-rw-r----- 1 oracle oinstall    28160 Mar 15 11:47 arch1_70_709240912.dbf
[oracle@sbtest dbs]$
Paramos el transporte de redo:
[SRVTEST_BD1_ORACLE: oracle@srvtest dbs]$ dgmgrl /
DGMGRL for Linux: Version 10.2.0.4.0 - 64bit Production

Copyright (c) 2000, 2005, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected.
DGMGRL> EDIT DATABASE test SET STATE=Log-Transport-Off;
Succeeded.
DGMGRL> exit

Paramos el broker en la standby:

SQL> show parameter dg

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1               string      /soft/oracle/dbtest/dbs/d
r1sbtest.dat
dg_broker_config_file2               string      /soft/oracle/dbtest/dbs/d
r2sbtest.dat
dg_broker_start                      boolean     TRUE
SQL> alter system set dg_broker_start=false;

Sistema modificado
Cambiamos el modo del fichero de control de STANDBY  a CURRENT
[oracle@srvtest flashback]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on Jue Mar 11 12:40:16 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

SQL> connect / as sysdba
Conectado.
SQL> select CONTROLFILE_TYPE from v$database;

CONTROL
-------
STANDBY

SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;

Base de datos modificada.

SQL> select CONTROLFILE_TYPE from v$database;

CONTROL
-------
CURRENT


Y finalmente abrimos la BBDD

SQL> ALTER DATABASE OPEN; Base de datos modificada. SQL> select status from v$instance; STATUS ------------ OPEN

Al finalizar nuestras pruebas, deshacemos los cambios, cerramos la BBDD, la abrimos en mount y realizamos el Flashback:
SQL> shutdown immediate
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.
SQL> startup mount
Instancia ORACLE iniciada.

Total System Global Area 1610612736 bytes
Fixed Size                  2084296 bytes
Variable Size             419430968 bytes
Database Buffers         1174405120 bytes
Redo Buffers               14692352 bytes
Base de datos montada.
SQL> FLASHBACK DATABASE TO RESTORE POINT Standby_flashback_testing ;

Flashback terminado.
Reconvertimos a STANDBY:
SQL> select controlfile_type from v$database;

CONTROL
-------
BACKUP

SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

Base de datos modificada.

Activamos nuevamente el broker de Data Guard en la standby

SQL> alter system set dg_broker_start=true;

Sistema modificado.

SQL> shutdown immediate;
ORA-01507: base de datos sin montar

Instancia ORACLE cerrada.
SQL> startup mount
Instancia ORACLE iniciada.

Total System Global Area 1610612736 bytes
Fixed Size                  2084296 bytes
Variable Size             419430968 bytes
Database Buffers         1174405120 bytes
Redo Buffers               14692352 bytes
Base de datos montada.
Reactivamos el trasporte y aplicado de redo
[SRVTEST_BD1_ORACLE: oracle@srvtest dbs]$ dgmgrl /
DGMGRL for Linux: Version 10.2.0.4.0 - 64bit Production

Copyright (c) 2000, 2005, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected.
DGMGRL> EDIT DATABASE sbtest SET STATE=online;
Succeeded.
DGMGRL> EDIT DATABASE test SET STATE=online;
Succeeded.
Y para acabar, si hemos cambiado el modo de protección lo volvemos a dejar como estaba:

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;
Succeeded.

02 noviembre 2017

As in the Phillip K. Dick essay: Do Oracle Dreams of Electronic Coins?

¿Sueña Oracle con monedas electrónicas?

Blockchain es una base de datos distribuida, formada por cadenas de bloques diseñadas para evitar su modificación una vez que un dato ha sido publicado usando un sellado de tiempo confiable y enlazando a un bloque anterior. Por esta razón es especialmente adecuada para almacenar de forma creciente datos ordenados en el tiempo y sin posibilidad de modificación ni revisión. Este enfoque tiene diferentes aspectos:
  • Almacenamiento de datos.- Se logra mediante la replicación de la información de la cadena de bloques
  • Transmisión de datos.- Se logra mediante peer-to-peer
  • Confirmación de datos.- Se logra mediante un proceso de consenso entre los nodos participantes. El tipo de algoritmo más utilizado es el de prueba de trabajo en el que hay un proceso abierto competitivo y transparente de validación de las nuevas entradas llamada minería.
Si quieres saber más de como poder implementar una base de datos de tipo Blockchain mira el artículo de Julián Dontcheff. En este articulo Julián habla de una base de datos  llamada BigChainDB, en  su web podrás obtener mas información.

Entre sus características destacan:

  • Soporte nativo de multi ajustes: Sin una moneda nativa en BigchainDB, se puede emitir cualquier activo, token o moneda.
  • Personalizable: Diseña tu propia red privada con activos personalizados, transacciones, permisos y transparencia.
  • Permisos: Establezca permisos a nivel de transacción para garantizar una separación clara de tareas y hacer cumplir el acceso selectivo.
  • Modelo de consenso de la federación: El control descentralizado a través de una federación de nodos de votación crea una red P2P super-par.
  • Open Source: Abierto de origen a la comunidad para que todos puedan usarlo y construir sus propias aplicaciones en la parte superior.
  • Público o privado: Implemente sus propias redes públicas o privadas para casos de uso específicos de la industria.
  • Consulta: Aproveche las capacidades eficientes de consulta de big data listas para usar.
Un blockchain es un sistema para mantener los libros contables distribuidos de una manera que permite a las organizaciones que tal vez no confíen plenamente unas en otras acordar las actualizaciones del libro mayor. En lugar de utilizar un tercero central o un proceso de reconciliación fuera de línea, Blockchain utiliza protocolos de igual a igual. Como un libro mayor distribuido, blockchain proporciona un registro casi en tiempo real e indeleble que se replica entre los participantes.

Blockchain tiene el potencial de transformar fundamentalmente la forma en que se realizan las transacciones comerciales globales. Actualmente, algunas transacciones de empresa a empresa se enrutan a través de terceros para garantizar su integridad y protección. Estos terceros pueden presentar retrasos y agregar costos. La tecnología de Blockchain permite a los participantes en una red de negocios de confianza realizar transacciones directamente, a la vez que garantiza la validez y el no rechazo de sus transacciones. Una vez que las transacciones propuestas se validan y se llega a un acuerdo sobre sus resultados, los participantes de la cadena de bloques las registran en bloques vinculados criptográficamente que no pueden ser repudiados.

Esta tecnología puede ayudar a abordar muchos desafíos de los límites de la empresa, tales como:

  • Permitir la confianza en transacciones B2B entre pares, al tiempo que se evitan los costos y riesgos de los intermediarios
  • Reducir el intercambio de información manual y propenso a errores y los procesos a través de los límites de la empresa
  • Evitar el costo y los retrasos de las conciliaciones fuera de línea
  • Disminuir el costo y el alto riesgo de fraude de las transacciones entre empresas
  • Mejorar la visibilidad de la información en tiempo real dentro de un ecosistema de comercio

Industrias con casos de uso de Blockchain emergentes


Bancos y finanzas

En mi experiencia sería ideal para procesar masivamente transacciones bancarias contra listas negras y blancas:
  • Watchlist
  • AML (Anti money laundry)
  • KYC (Know your customer)
  • Compensación y liquidación 
  • Financiamiento comercial
  • Pagos nacionales y transfronterizos, 
  • Originación de préstamos y automatización posterior a la financiación
Seguros
Procesamiento transaccional entre aseguradores e inversores, automatización de reclamos y sobre todo la reducción de reclamaciones fraudulentas.

Fabricación
Diseñe la protección IP, el seguimiento del historial de productos, la garantía del proceso de producción y la gestión de retiros.

Educación
Transcripción y transferencia de transcripciones de estudiantes, credencialización de educadores y pago de fondos estatales o subvenciones privadas.

Medios de comunicación
Pago directo a creadores de contenido, seguridad de activos digitales y conozca a su cliente.

Gobierno y Sector Público
Mejore la distribución del bienestar, mitigue la doble imposición, obtenga protección de la infraestructura y registro de propiedad.

Comercio minorista y Comercio electrónico
Aumente la transparencia de los historiales de los productos, la reducción de productos falsificados, la adjudicación de garantías y la modernización de la gestión de la cadena de suministro.

Asistencia sanitaria y farmacéutica
Seguimiento / rastreo serializado de medicamentos, presentación regulatoria digital, gestión de ensayos clínicos, y privacidad e intercambio de registros de salud del paciente.
Logística
Financiamiento de la cadena de suministro, seguimiento y rastreo del punto de origen, transferencia de la propiedad, supervisión del cumplimiento.

Utilidades
Gestión de activos, certificación de energías renovables y derechos de emisión, y medición y facturación del consumo de electricidad.

Servicio en la nube de Oracle Blockchain

Oracle Blockchain Cloud Service es una nueva oferta que forma parte de la cartera completa de plataforma como servicio (PaaS) de Oracle. Presentado por el proveedor de plataforma de procesamiento de transacciones distribuido más escalable del mundo, Oracle Blockchain Cloud Service es la plataforma en nube de contabilidad distribuida más completa.

El servicio en la nube de Oracle Blockchain proporciona capacidades de blockchain de nivel empresarial y es capaz de acelerar la innovación para ERP local y clientes SaaS y PaaS basados ​​en la nube.

Con el servicio en la nube de Oracle Blockchain, puede acelerar los ingresos, crear nuevas fuentes de ingresos y reducir los costos y los riesgos mediante la extensión segura de sus aplicaciones y procesos comerciales a la vez que agiliza las transacciones en el ecosistema de su socio.

29 octubre 2017

DBA WARS: "It's an older code sir, but it checks out."


En esta entrada del blog vamos a dar salida a varios còdigos SQL Y PL/SQL, antiguos pero todavía válidos.

Problemas con de PL / SQL Developer de Allround Automations

Al usar este IDE e su versión 11.X, una consulta interna toma muchos ciclos de CPU en el servidor de la base de datos (100% de una CPU).
¿Es este tu problema?  Por favor, compruebe si hay una consulta al lanzar el editor con el siguiente formato de consulta:
select s.synonym_name object_name, o.object_type
from sys.all_synonyms s, sys.all_objects o where s.owner in ('PUBLIC', user) and o.owner = s.table_owner and o.object_name = s.table_name and o.object_type in ('TABLE', 'VIEW', 'PACKAGE','TYPE', 'PROCEDURE', 'FUNCTION', 'SEQUENCE');
Se debe a la opción Describir contexto del asistente de código. Para deshabilitar:
Mira en: Tools> Preferences> Code Assistant y deshabilitar la opción "Describe Context".
O comprarles la versión 12.X que ya está resuelto.


Depurar papelera de reciclaje anterior a ...


Tiene la papelera de reciclaje de la base de datos llena o su tamaño es considerablemente grande, pero no quiere hacer un "Borrado" completo?
¿Quieres eliminar solo más de x días (como más de 90 días)?

Una buena forma de hacerlo es:

# 90 días
Select 'purge table '||owner||'."'||OBJECT_NAME||'";' from dba_recyclebin where type='TABLE' and to_date(droptime,'YYYY-MM-DD:HH24:MI:SS')<sysdate-90;
# 90 minutos
Select 'purge table '||owner||'."'||OBJECT_NAME||'";' from dba_recyclebin where type='TABLE' and to_date(droptime,'YYYY-MM-DD:HH24:MI:SS')<sysdate-(90/(24*60));

Mirar esta nota de Metalink (Doc ID 1596147.1) por si teneis alguna qe otra duda.


Purga mejorada de la papelera de reciclaje Oracle

Desde que en la versión 10g de la base de datos , se introdujo el 'reciclaje' para segmentos. Si se establece el parámetro recyelebin = on, y se descarta una tabla, en realidad no se descarta; se renombra a un nombre generado por el sistema. Esto realmente puede ayudar en situaciones donde una tabla se cae accidentalmente, ya que se puede recuperar fácilmente. Sin embargo, sin monitorearlo, puede terminar causando problemas de muchos tipos, porque puede terminar hinchando el número total de segmentos en la base de datos a muchas veces más de lo que era antes.
Oracle solo tiene 4 métodos publicados para descartar lotes de objetos reciclados; siendo:

  • El comando SQL> PURGE RECYCLE BIN emitido por un propietario de segmento, que purga todos los segmentos reciclados para ese usuario.,
  • El comando SQL> PURGE DBA_RECYCLEBIN, emitido por un DBA, que purga todos los objetos reciclados en la base de dato.
  • El comando SQL> PURGE TABLESPACE <tablespace_name> USER <schema_name>; que purga objetos propiedad del propietario dado.
  • El comando SQL> PURGE TABLESPACE uwdata USUARIO uwclass; que purga los objetos propiedad del propietario y el espacio de tabla dados.
No hay comandos incorporados que permitan que solo los segmentos de papeleras de reciclaje se realicen antes de cierto tiempo, o que solo reciclen objetos de la papelera con más de un cierto número de versiones recicladas de la misma tabla. Es relativamente fácil crear un procedimiento almacenado para manejar estos casos; esto explica cómo se puede hacer eso.

En PL/SQL, tenemos:


create or replace procedure purge_user_recyclebin(
  p_purge_before_date   in date default=NULL,
  p_purge_keep_versions in number default=NULL,
  p_test_only           in varchar2 := 'Y'
)
is
  cursor c_purge_before_date is
    select object_name
    from  user_recyclebin
    where droptime > p_purge_before_time
    and   can_purge = 'YES'
    order by droptime;

  cursor c_purge_before_version is
     select * from 
       (select original_name,
               type,
               object_name,
               droptime,
               rank() over (partition by original_name,type order by droptime desc) as obj_rank
         from   user_recyclebin
         where  can_purge = 'YES')
       where obj_rank > p_purge_keep_versions
       order by droptime;

  v_sql varchar2(1024);

  exception e_bad_parameters;
  exception e_38302;
  pragma exception_init(e_38302,-38302);  

  procedure runsql(p_object_name in varchar2) 
  is
  begin
    v_sql := 'purge '||p_object_name;
    if (p_test_only = 'N') then
      begin
        execute immediate v_sql;
      exception
         when e_38302 then 
           dbms_output.put_line('Cuidado, el objeto '||p_object_name||' no existe ignóralo');
         when others then
           dbms_output.put_line('Error borrando '||p_object_name);
           dbms_output.put_line(dbms_utility.format_error_backtrace);
      end;
    else
      dbms_output.put_line(v_sql);
    end if;
  end;

begin

  if p_purge_before_date is not null and
     p_purge_keep_versions is null then
     for r in c_purge_before_date loop
       runsql(r.object_name);
     end loop;
  elsif p_purge_before_date is null and
     p_purge_keep_versions is not null then
     for r in c_purge_before_version loop
       runsql(r.object_name);
     end loop;
  else
     raise e_bad_parameters;
  end if;

end purge_user_recylebin;
/

Cómo usarlo

Si desea probar para ver qué haría, sin purgar nada, simplemente pase el parámetro 'p_test' al valor 'Y', y establezca la salida del servidor en el tamaño 1000000. Esto mostrará una lista de los comandos que se ejecutarían. pero en realidad no los ejecuta.

Purgar todos los objetos de la papelera de reciclaje antes de una fecha determinada
Esto purgará todos los objetos de reciclaje reciclados antes del 1 de noviembre, a medianoche.

execute purge_user_recylebin(to_date('20150801 00:00:00','YYYYMMDD HH24:MI:SS'),NULL,'Y');

Esto, cuando se ejecuta como propietario de un esquema, ayuda a mantener la cantidad de objetos reciclados a un nivel razonable, a la vez que se conserva, la capacidad de recuperar segmentos perdidos más recientemente.




27 octubre 2017

Road to: Ser un DBA más valorado

La vida del DBA es una vorágine de solucionar problemas y estar al día de las tecnologías, que van aumentando cada día . A veces parece un trabajo digno de una prueba de Hércules.

Conoce el paisaje de la base de datos

La expansión de la base de datos está en aumento, especialmente desde departamentos como el marketing y las ventas que traen su propio software, lo que da como resultado bases de datos que no se mantienen, se respaldan y pueden no ser seguras.

Para evitar los problemas de rendimiento que esto puede crear, los administradores experimentados han de mantener un inventario actualizado de las instancias y bases de datos existentes en su compañía.

Idealmente, la recolección de inventario debe manejarse mediante un proceso automatizado que alimenta un repositorio de base de datos centralizado, pero eso no elimina la necesidad de verificaciones manuales para validar la precisión de la recopilación automática de datos.

Dentro de la base de datos, deberíamos de mantener un registro de:
  • Nombre, fecha de creación y propietario
  • Nombre de archivo lógico y su ubicación física,
  • Modelo de recuperación, completo,
  • Nivel de compatibilidad para cada base de datos, así como la limitación de tamaño máximo, tamaño actual y crecimiento de archivos.

También es imperativo conocer la unidad, el propósito y la disponibilidad de espacio, la versión y edición del servidor y la configuración del servidor.

Estandariza las configuraciones del sistema

No es secreto que el número de bases de datos y las instancias SQL se expanden constantemente. Eso significa una lista cada vez mayor de configuraciones de bases de datos para recordar.

Los DBA expertos realizan un seguimiento de las diferentes instancias al estandarizar los elementos de configuración siempre que sea posible: letras de unidad, opciones de configuración del servidor, configuración de la base de datos, mantenimiento de la base de datos, configuración de seguridad y más.

El resultado debe de ser:
  • Rendimiento optimizado.
  • Reducir la tasa de errores.

Planificación de las contingencias más comunes

No puedes simplemente instalar una base de datos y alejarte. Debe ser continuamente ajustado y monitoreado. Lo que separa a los DBA de mejor rendimiento del paquete es qué tan proactivos son para anticipar los problemas y cuán preparados están para enfrentar los cortes de energía, los terremotos, las inundaciones, los incendios y los robos.

La planificación de contingencia implica desarrollar un plan de mantenimiento integral para todas las instancias de base de datos y siempre estar preparado para lo peor. Al monitorear proactivamente en intervalos regularmente programados, los DBA pueden identificar si el comportamiento del sistema y el uso de los recursos han cambiado.

La planificación de recuperación de desastres se facilita definiendo contratos de licencia de tiempo de inactividad y pérdida de datos para todas las bases de datos y todas las instancias de SQL, y estableciendo procesos de recuperación de pérdida de datos.

Resolver los problemas, está bien, pero hay que ir más allá

Debido a que los problemas de rendimiento pueden tomar tanto como el 60% del tiempo del DBA típico, es vital optimizar realmente cada base de datos e instancia.

El Repositorio Automático de Carga de Trabajo (AWR) de Oracle es la herramienta ideal de recopilación y generación de informes para identificar cambios en el rendimiento, ejecutar diagnósticos y comparar con frecuencia el rendimiento de la base de datos a lo largo del tiempo.

Si tenemos bases de datos antiguas (9i, 10g), que haberlas hailas, usar el statspack, dado que si no han migrado hasta ahora, no lo van a hacer.

Colabora estrechamente con los desarrolladores, son tus aliados

Ya lo dijo Maquiavelo: "Conoce a tu enemigo".

Ahora en serio, en lugar de considerar a los desarrolladores como un "mal necesario", los DBA de mejor desempeño ven a los desarrolladores como parte de un equipo de ganar-ganar. Una vez que los DBA y los desarrolladores entienden los objetivos, las prioridades y las preocupaciones de los demás, la tensión desaparece. Ya sea a través de la tutoría o la participación en equipos de proyectos conjuntos, la comprensión mutua es clave. Cuanto mejor los tengas aleccionados, menos trabajo te van a dar, se egoista.

Comprender el negocio

Esto es fundamental, no solo para un dba, si no para el ultimo de os becarios en el equipo. Un DBA, es especial, no funciona de forma aislada. Comprender la organización para la que trabaja, su mercado, sus productos y sus clientes, es imperativo, para sobrevivir. Los DBA que conocen el negocio se vuelven aún más eficientes una vez que entienden "el significado" de diferentes solicitudes y requisitos alrededor de la  base de datos.

Tus conocimientos han de estar frescos y actualizados: Nunca dejes de aprender

Nos vienen nuevos desafíos a los DBA, la nube, las bases de datos noSQL, esto implica nuevas materias que aprender, máquinas virtuales con prototipos a estudiar e implantar
Eso ocurre en el mundo actual del DBA: nueva base de datos, nuevas rutinas, más demandas de la compañía y más usuarios; la lista es interminable.

Has de  evitar el estancamiento y la rutina al buscar y practicar actividades nuevas y desconocidas. Cuando están equipados con una sed de conocimiento, experiencia y un conjunto de habilidades cada vez mayor, los DBA de mayor rendimiento abordan su trabajo no como un trabajo de rutina, sino como una aventura emocionante.

25 octubre 2017

ADR: Si el Dr House fuera DBA, usaría esto

House M. D. (Medical diagnostic) era una serie de televisión estadounidense de la cadena FOX. El personaje central es el Dr. Gregory House, un genio médico, irónico, satírico y poco convencional e inconformista, que encabeza un equipo de diagnóstico en el Hospital Universitario Princeton-Plainsboro de Nueva Jersey.

Pero ahora entremos en detalles mas interesantes, en el contexto de este blog:

En la versión 11g, de la base de datos Oracle, se introdujo un nuevo concepto para el repositorio de los archivos de diagnostico de la base de datos, llamado ADR (Automatic Diagnostic Repository por sus siglas en ingles) 

En versiones anteriores (10g, sí, todavía hay bases de datos de esta versión por el mundo ) se utilizaban los parámetros:
  • BACKGROUND_DUMP_DEST
  • CORE_DUMP_DEST
  • USER_DUMP_DEST 

en estos lugares podíamos ver los archivos que nos ayudaban a hacer un diagnostico de errores de la base de datos. A partir de la versión 11g, se introdujo la variable DIAGNOSTIC_DEST, en donde Oracle esta tratando de estandarizar la estructura de directorios para manejar los archivos relacionados a fallas y alertas. La estructura del repositorio ADR para la base de datos, tanto en servidor como en el cliente, en la versión 12.1.0.2, es de la siguiente manera:

Estructura de directorios en servidor:


Estructura de directorios en cliente:



Un cambio muy importante que se da en 11g es que el formato del archivo de alertas de la base de datos es en formato .xml, ya que lo puedes ahora visualizar de una mejor manera en OEM, pero tambien lo puedes encontrar en su formato anterior. Si quieres ver como tienes la estructura en tu base de datos, lo puedes hacer con el siguiente query:

DBATEST> SELECT * FROM V$DIAG_INFO;

INST_ID NAME VALUE

1 Diag Enabled TRUE
1 ADR Base /mount/dump01/oracle/DBATEST
1 ADR Home /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST
1 Diag Trace /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace
1 Diag Alert /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/alert
1 Diag Incident /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/incident
1 Diag Cdump /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/cdump
1 Health Monitor /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/hm
1 Default Trace File /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace/DBATEST_ora_18035.trc
1 Active Problem Count 1

1 Active Incident Count 75

De la misma manera, Oracle trae ahora una herramienta muy util llamada adrci, esta herramienta te permite manejar el repositorio ADR,muy importante, es que antes de mandar a llamar a la herramienta, las variables de entorno ORACLE_HOME,PATH y ADR_HOME estén bien iniciadas. Puedes ver el archivo de alertas de la base de datos de la siguiente manera:


adrci> SHOW ALERT -TAIL 5
2011-07-17 18:04:41.207000 -04:00
Archived Log entry 4735 added for thread 1 sequence 4735 ID 0xffffffffb7363f82 dest 1:
2011-07-17 21:00:49.339000 -04:00
Thread 1 advanced to log sequence 4737 (LGWR switch)
Current log# 3 seq# 4737 mem# 0: /mount/u01/oracle/DBATEST/log/redo03a.log
Current log# 3 seq# 4737 mem# 1: /mount/u01/oracle/DBATEST/log/redo03b.log
Archived Log entry 4736 added for thread 1 sequence 4736 ID 0xffffffffb7363f82 dest 1:

También podemos ver un incidente de la siguiente manera, usando ADR:


adrci> show incident

ADR Home = /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-------------------- ----------------------------------------------------------- ----------------------------------------
2041 ORA 4031 2016-11-14 05:58:35.042000 -05:00
2105 ORA 4031 2016-11-14 05:58:35.272000 -05:00
2017 ORA 4031 2016-11-14 05:58:35.272000 -05:00
1873 ORA 4031 2016-11-14 05:58:35.279000 -05:00
2153 ORA 4031 2016-11-14 05:58:35.280000 -05:00
37051 ORA 4031 2017-10-16 21:51:03.983000 -04:00
37027 ORA 4031 2017-10-16 21:51:04.239000 -04:00
36707 ORA 4031 2017-10-16 21:51:18.575000 -04:00
37019 ORA 4031 2017-106-16 21:51:22.650000 -04:00
37052 ORA 4031 2017-10-16 21:51:29.050000 -04:00
10 rows fetched

Una vez que visualizas los errores, puedes ver el detalle de ellos, así como la traza generada:


adrci> SHOW INCIDENT -MODE DETAIL -P "INCIDENT_ID=57052"

ADR Home = /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST:
*************************************************************************

**********************************************************
INCIDENT INFO RECORD 1
**********************************************************
INCIDENT_ID 37051
STATUS ready
CREATE_TIME 2017-10-16 21:51:03.9830000 -04:00
.
.
.
KEY_NAME Client ProcId
KEY_VALUE oracle@localhost.33449_1
KEY_NAME SID
KEY_VALUE 151.3
OWNER_ID 1
INCIDENT_FILE /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/incident/incdir_57051/DBATEST_dw03_13299_i57052.trc
OWNER_ID 1
INCIDENT_FILE /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace/DBATEST_dw03_66699.trc
1 rows fetched


Esta herramienta te permite crear un paquete y si así lo necesitas lo envias a Oracle, 
esto te evita el trabajo de andar buscando los archivos que necesitas enviar a Oracle Metalink, perdón  MOS.
Una vez, explicado el mecanismo y el uso de esta utilidad, espero que nos sirva para solucionar, 
alguno de esos errores terribles, que de vez en cuando aparecen en nuestras vidas  como DBA.