Saltar al contenido

¿Cómo usar Timestamp_to_scn y Scn_to_timestamp en Oracle?

Te recomendamos que revises esta solución en un ambiente controlado antes de pasarlo a producción, saludos.

Solución:

Estás tratando de mirar demasiado atrás. Solo puede convertir hacia y desde SCN que se encuentran en la ventana de rehacer/flashback mantenida por su sistema. Una vez que caducan los cambios, se pierde la asignación.

Esto se explica en la documentación:

La base de datos recuerda la asociación entre un SCN y una marca de tiempo cuando se genera el SCN durante un período de tiempo limitado. Este período es el máximo del período de retención de deshacer ajustado automáticamente, si la base de datos se ejecuta en el modo de administración de deshacer automático, y los tiempos de retención de todos los archivos flashback en la base de datos, pero no menos de 120 horas. El tiempo para que la asociación se vuelva obsoleta transcurre solo cuando la base de datos está abierta. Se devuelve un error si el SCN especificado para el argumento a SCN_TO_TIMESTAMP es demasiado viejo

Tenga en cuenta que estos son parte del mecanismo interno de Oracle y, por lo tanto, son de uso limitado para nosotros; aunque son útiles para consultas de flashback, por supuesto, nuevamente dentro de la misma ventana.

SCN_TO_TIMESTAMP usa algunos algoritmos internos para hacer el mapeo entre SCN y TIME cuando ocurre algún evento y hace el trabajo con una buena aproximación. Pero hay un límite. No puede ir demasiado lejos en el pasado si los datos de UNDO no cubren su período.

En ese caso, hay una forma complicada de crear nuestro propio mapeo cuando alcanza un límite de datos de deshacer. No será tan bueno como SCN_TO_TIMESTAMP pero proporcionará una aproximación según sus datos.

Todo lo que necesita hacer es encontrar una tabla con inserciones constantes. Yo uso la tabla de auditoría sys.aud$. Puede usar el suyo propio, pero la tabla debe tener un archivo de tiempo que indique cuándo se insertaron las filas. Y si tiene SCN y DATE, puede mapear SCN y DATE con otra tabla.

si vas a usar sys.aud$ Manten eso en mente:

  1. Es posible que necesite su dba para otorgarle acceso o para crear una vista simple con dos campos ora_rowscn y ntimestamp#
  2. Cuanta más actividad haya en la base de datos, más preciso será el mapeo. Por lo general, al usar la tabla sys.aud$, puedo mapear la edición de datos antiguos que ocurrió hace un año con una precisión de aproximadamente 60-120 minutos.
  3. si la auditoría está desactivada, scn_time no devolverá ninguna fila y deberá buscar otra tabla para la asignación.

La consulta utiliza sys.aud$. Reemplace la [YOU_TABLE] con la tabla donde necesita encontrar la fecha de inserción o actualización

-- get scn to date interval [begin..end] mapping from audit table      
with scn_time as
 (
     select sc sc_start, 
            lead(sc) over(order by sc) sc_end,
            start_time,
            lead(end_time) over(order by sc) end_time_sc
     from 
      (
        select n.ora_rowscn sc, 
        min( cast(from_tz(ntimestamp#,'00:00') at local as date) ) start_time,
        max( cast(from_tz(ntimestamp#,'00:00') at local as date) ) end_time
            from sys.aud$ n
            -- if audit log is big you need to select only a part of the table
            -- to make query faster
            --where ntimestamp# > sysdate - 365
           group by  n.ora_rowscn 
      ) order by sc 
  )
-- map scn from you table to scn_mapping  
select *
  from (
          select t.ora_rowscn sc, t.*
          from [YOU_TABLE] t
       ) table_inspect
 inner join scn_time s
    on (table_inspect.sc between s.sc_start and s.sc_end)
 -- to filter out bit intervals    
 where (end_time_sc-start_time) < 1

Utilicé la forma de restaurar la información cuando se insertó una fila si se insertó hace más de un año.

Establezca UNDO_MANAGEMENT en AUTO y UNDO_RETENTION en un valor que cubra el período de su consulta más larga en el tiempo. Configure también GARANTÍA DE RETENCIÓN para evitar que se sobrescriba UNDO.

Para Oracle 10g, no puede retroceder más de 5 días. Este es un límite codificado de forma rígida. Para Oracle 11g no hay limitación.

Agradecemos que desees añadir valor a nuestro contenido cooperando tu experiencia en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *