ORA-26672: timeout occurred while stopping STREAMS process string

Otro problemilla de streams, al intentar parar el procesod e catura con el siguiente commando

EXECUTE DBMS_CAPTURE_ADM.STOP_CAPTURE('STRMADMIN_CAPTURE');
 

Me aparece el error ORA-26672

Error: ORA-26672: timeout occurred while stopping STREAMS process string

Se agota el tiempo de espera para parar el proceso en concreto, la solución es simple, esperar un poco y volverlo a intentar un par de veces más al final siempre se logra. Si el error persiste para el proceso con la opción FORCE

ORA-26687: no instantiation SCN provided for …

Cómo siempre streams me vuelve loca, estos días tenía que resincronizar la base de datos y me encontrado con el siguiente error en el proceso de apply:  ORA-26687: no instantiation SCN provided for…. Después de revisar la documentación del error:

Causa:

El objeto SCN no está definido.

Acción:

Definir  SCN  utilizando DBMS_APPLY_ADM.SET_%_INSTANTIATION_SCN

 No entendía por qué no se había definido el objeto SCN, después de darle muchas vueltas a mi procedimiento me di cuenta de un pequeño detalle a la hora de hacer el export estaba utilizando corta y pega había un salto de línea entre la primera y la segunda línea con lo cual no cogía los parámetros de la segunda, por tanto no está especificando OBJECT_CONSISTENT=Y esto provoca que el SCN no se defina.

exp “‘/ as sysdba'” owner=”MMOADSL” FILE=schemas.dmp GRANTS=Y ROWS=Y LOG=exportSchemas.log OBJECT_CONSISTENT=Y STATISTICS=NONE

STREAMS

Introducción:

Streams es una nueva funcionalidad añadida en oracle 9 que permite propagar información de una base de datos a otra. Oracle streams nos permite colocar la información en flujos y controlar como estos se van a encargar de transmitir la información de una base de datos a otra. El primer paso sería configurar la información que queremos compartir y basándonos en estas especificaciones streams captura y aplica los eventos de forma automática, procesando tanto sentencias DML como DDL.

Los pasos que realiza streams serían los siguientes:

  1. Capturar los cambios en la base de datos. Se configura el proceso de captura en background para capturar los cambios realizados en tablas., esquemas, o en toda la base de datos. El proceso de captura .obtiene los cambios de los redo log y los transforma en LCR (Logical, change record).
  2. Se encolan los eventos. En una cola de streams se pueden almacenar dos tipos de eventos LCR o mensajes de usuario.
  3. Propagar los eventos de una cola a otra.
  4. Descolar los eventos
  5. Aplicar los eventos de una base de datos a otra

 

Para la base de datos de compra la solución es que una de las bases de datos se encargará de la provisión y ambas de las compras. Y se propagarán los datos entre ambas. En caso de caída de una de las bases de datos encargada de la provisión habría que redirigir todos los servicios a la segunda base de datos y activar los procesos propagación de esta información.

Ventajas 

  • No requiere licencia
  • Streams aparece en la versión 9 de Oracle, y se está evolucionando bastante por este lado en versiones posteriores.
  • Permitiría tener dos bases de datos trabajando en modo asíncrono y cada x tiempo enviar la información de una base datos a otra.

 

Incovenientes

  • Los datos son diferentes entre los periodos de tiempo que se produce la propagación, hay conflicto de datos
  • Necesita más trabajo de mantenimiento, por un lado es necesario un dba en planta capacitado para solucionar conflictos y por otro es necesario llevar mantenimientos especifico para cada una de las  bases de datos ya que algunos de las sentencias no se propagan.
  • No esta recomendada para un sistema con múltiples updates, consume excesivos recursos en estos entornos.
  • Existen tipo de datos que la aplicación esta utilizando que no se pueden propagar.
  • 

Elementos a tener en cuenta la hora de la implantación:

Estos son los principales conflictos de datos que pueden aparecer y habría que buscar distintas soluciones para ellos:

            1.         Actualizaciones:

             Dos o más sentencias DML se aplican sobre  el mismo registro en diferentes ubicaciones antes de que el registro pueda ser propagado.

            2.         Problemas de unicidad:

            Se produce la inserción de un registro en más de una ubicación y clave única esta repetida en varias localizaciones.

            3          Conflictos en el borrado:

            Un registro se borra de uno de los entornos, mientras en otro entorno es actualizado. O se produce el borrado del mismo registro en los diferentes entornos.

Tipos de datos y sentencias no soportadas:

Algunos de estos tipos de datos se están utilizando por la aplicación y esta información no se podría propagar.

  1. Tipos de datos no soportados:

                        LOB, NCLOB, CLOB, LONG, LONG RAW, BFILE, ROWID y UROWID.

       2.   Sentencias DDL no soportadas:

                        ALTER DATABASE

                        CREATE CONTROLFILE

                        CREATE DATABASE

                        CREATE PFILE

                        CREATE SPFILE

                        ALTER MATERIALIZED VIEW

                        ALTER MATERIALIZED VIEW LOG

                        CREATE DATABASE LINK

                        CREATE SCHEMA AUTHORIZATION

                        CREATE MATERIALIZED VIEW

                        CREATE MATERIALIZED VIEW LOG

                        DROP DATABASE LINK

                        DROP MATERIALIZED VIEW

                        DROP MATERIALIZED VIEW LOG

                        RENAME

    3. Objetos no soportados:

                        VISTAS MATERIALIZADAS

Verificaciones básicas de streams

  1. Comprobar que el proceso de captura está enable
      SELECT STATUS
      FROM DBA_CAPTURE
      WHERE CAPTURE_NAME = 'STRMADMIN_CAPTURE';

              En caso de que no este enable, se debe intentar reiniciar. Para averiguar porque el proceso de captura esta desable, revisar el alert y ficheros de trazas en el BACKGROUND_DUMP_DEST.

               Como reiniciar el proceso de captura:

          EXECUTE DBMS_CAPTURE_ADM.START_CAPTURE('STRMADMIN_CAPTURE');
 

              Como parar el proceso de captura:

          EXECUTE DBMS_CAPTURE_ADM.STOP_CAPTURE('STRMADMIN_CAPTURE');
 

        2.    Comprobar que el proceso de captura usa la cola de origen y de destino correcta.

       COLUMN SOURCE_QUEUE HEADING 'Source Queue' FORMAT A35
       COLUMN DESTINATION_QUEUE HEADING 'Destination Queue' FORMAT A35
       SELECT   p.SOURCE_QUEUE_OWNER||'.'||
                p.SOURCE_QUEUE_NAME||'@'||
                g.GLOBAL_NAME SOURCE_QUEUE,
                p.DESTINATION_QUEUE_OWNER||'.'||
                p.DESTINATION_QUEUE_NAME||'@'||
                p.DESTINATION_DBLINK DESTINATION_QUEUE
               FROM DBA_PROPAGATION p, GLOBAL_NAME g;
        Source Queue                        Destination Queue
       ----------------------------------- -----------------------------------
       STRMADMIN.STREAMS_QUEUE@ORIGEN       STRMADMIN.STREAMS_QUEUE@DESTINO

         3.  Comprobar que el job de propagación está enable

  SELECT p.DESTINATION_DBLINK,
       DECODE(s.SCHEDULE_DISABLED,
                'Y', 'Disabled',
                'N', 'Enabled') SCHEDULE_DISABLED,
       s.PROCESS_NAME,
       s.FAILURES,
       s.LAST_ERROR_TIME,
       s.LAST_ERROR_MSG
  FROM DBA_QUEUE_SCHEDULES s, DBA_PROPAGATION p
  WHERE  p.DESTINATION_DBLINK = s.DESTINATION
  AND s.SCHEMA = p.SOURCE_QUEUE_OWNER
  AND s.QNAME = p.SOURCE_QUEUE_NAME;

                  Duration Next        Latency                   Number of
Start Date        in Seconds Time     in Seconds Status   Process   Failures
----------------- ---------- -------- ---------- -------- -------- ---------
16:11:35 02/02/10                             60 Enabled  J000             0

 

En caso de que este desable se debe reprogramar.

EXECUTE DBMS_AQADM.UNSCHEDULE_PROPAGATION(queue_name => 'STREAMS_QUEUE',destination => 'HOLA');
EXECUTE DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name =>'STREAMS_QUEUE',destination  => 'HOLA'); 

4.  Comprobar que el proceso de apply está enable:

SELECT STATUS FROM DBA_APPLY;

5.  Comprobar que no hay errores en el proceso de apply:

select APPLY_NAME, ERROR_MESSAGE from dba_apply_error;