복붙노트

[SQL] 어떻게 오라클에 Timestamp_to_scn 및 Scn_to_timestamp를 사용 하는가?

SQL

어떻게 오라클에 Timestamp_to_scn 및 Scn_to_timestamp를 사용 하는가?

나는 쿼리의 결과로이 있습니다 :

select cast(to_date(a.start_time,'mm/dd/yyyy hh:mi:ss pm') as timestamp) date_of_call,
ora_rowscn from calling_table a where rownum <= 10;

       DATE_OF_CALLING          ORA_ROWSCN

26-JUL-13 12.29.28.000000000 PM 8347567733892
26-JUL-13 12.29.35.000000000 PM 8347567733892
26-JUL-13 12.29.35.000000000 PM 8347567733892
26-JUL-13 12.29.38.000000000 PM 8347567733892
26-JUL-13 12.29.44.000000000 PM 8347567733892
26-JUL-13 12.29.47.000000000 PM 8347567733892
26-JUL-13 12.29.48.000000000 PM 8347567733892
26-JUL-13 12.29.48.000000000 PM 8347567733892
26-JUL-13 12.29.48.000000000 PM 8347567733892
26-JUL-13 12.29.56.000000000 PM 8347567733892

하지만 함수 timestamp_to_scn를 사용하여 SCN에이 타임 스탬프를 변환 할 때, 나는 다음과 같은 오류가 점점 오전 :

ORA-08180 : 더 스냅 샷은 지정된 시간에 근거를 찾을 수 없습니다 ORA-06512 : "SYS.TIMESTAMP_TO_SCN"에서, 라인 1 08180. 00000 - "더 스냅 샷은 지정된 시간에 근거를 찾을 수 없습니다" * 원인 : 매핑 테이블에서 SCN에 시간과 일치 할 수 없습니다. * 작업 : 더 큰 시간을 사용해보십시오.

내가 타임 스탬프에 해당 열을 변환 ora_rowscn에 scn_to_timestamp을 사용하고 때, 나는 다음과 같은 오류가 점점 오전 :

ORA-08181은 : 지정된 번호가 유효한 시스템 변경 번호가 아닙니다 ORA-06512 : "SYS.SCN_TO_TIMESTAMP"에서, 라인 1 08181. 00000 - "지정된 번호가 유효한 시스템 변경 번호가 아닙니다" * 원인 : 제공된 SCN 유효한 SCN의 경계를 넘어이었다. * 작업 : 올바른 SCN을 사용합니다.

내가 잘못을하고 오전 무엇입니까?

해결법

  1. ==============================

    1.당신은 너무 멀리 돌아 보면 위해 노력하고 있습니다. 당신은에 당신의 시스템에 의해 유지 리두 / 플래시백 창에있는 SCN을 변환 할 수 있습니다. 변경 후 밖으로 나이가되면 매핑이 손실됩니다.

    당신은 너무 멀리 돌아 보면 위해 노력하고 있습니다. 당신은에 당신의 시스템에 의해 유지 리두 / 플래시백 창에있는 SCN을 변환 할 수 있습니다. 변경 후 밖으로 나이가되면 매핑이 손실됩니다.

    이것은 문서에 설명되어 있습니다 :

    마음에 곰이 오라클의 내부 메커니즘의 일부입니다, 그래서 우리에게 제한적으로 사용된다; 그들은 물론 플래시백 쿼리에 유용하지만 - 다시 같은 창에서.

  2. ==============================

    2.SCN_TO_TIMESTAMP 어떤 사건이 일어 났을 때 SCN과 시간 사이의 매핑을 수행하는 일부 내부 알고리즘을 사용하며, 그것은 좋은 근사치로 작업을 수행합니다. 그러나 한계가있다. 실행 취소 데이터가 기간을 포함하지 않는 경우는 과거에 너무 멀리 갈 수 없다.

    SCN_TO_TIMESTAMP 어떤 사건이 일어 났을 때 SCN과 시간 사이의 매핑을 수행하는 일부 내부 알고리즘을 사용하며, 그것은 좋은 근사치로 작업을 수행합니다. 그러나 한계가있다. 실행 취소 데이터가 기간을 포함하지 않는 경우는 과거에 너무 멀리 갈 수 없다.

    이 경우 당신이 취소 데이터의 한계를 명중 할 때 우리 자신의 매핑을 만들 수있는 교묘 한 방법이있다. 그것은 SCN_TO_TIMESTAMP 좋은으로하지 않습니다하지만 데이터에 따라 근사 제공 할 것입니다.

    당신이해야 할 모든 일정 인서트에가는 표를 찾는 것입니다. 나는 감사 테이블 SYS.AUD의 $를 사용합니다. 당신은 자신을 사용할 수 있지만 테이블은 행이 삽입 된 경우 시간이 표시 제출해야합니다. 당신이 SCN을 가지고 DATE 경우 그리고 당신은 다른 테이블과 SCN과 날짜를 매핑 할 수 있습니다.

    당신이 마음에 SYS.AUD $의 킵를 사용할 경우 그 :

    쿼리는 SYS.AUD $를 사용합니다. 당신이 삽입 또는 업데이트의 날짜를 찾을 필요가 어디에 테이블과 [YOU_TABLE]을 교체

    -- 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
    

    나는 그것이 더 년 전에 비해 삽입 된 경우 행이 삽입 될 때 정보를 복원하는 방법을 사용했다.

  3. ==============================

    3.시간이 가장 긴 쿼리 다시 기간을 다룰 것입니다 값으로 설정 AUTO로 UNDO_MANAGEMENT 및 UNDO_RETENTION. 또한 덮어지지 않도록 UNDO에 RETENTION GARANTEE의 세트.

    시간이 가장 긴 쿼리 다시 기간을 다룰 것입니다 값으로 설정 AUTO로 UNDO_MANAGEMENT 및 UNDO_RETENTION. 또한 덮어지지 않도록 UNDO에 RETENTION GARANTEE의 세트.

    오라클은 10g에 들어 당신이하지 플래시백 이상 오일에 비해 수 있습니다. 이것은 하드 코딩 한계입니다. 오라클 11g에 대한 제한이 없습니다.

  4. from https://stackoverflow.com/questions/22681705/how-to-use-timestamp-to-scn-and-scn-to-timestamp-in-oracle by cc-by-sa and MIT license