Jak znaleźć mój obecny SCN?

14

Biorąc pod uwagę dowolną wersję Oracle:

  • Jak znaleźć mój obecny SCN?
  • Jaka jest maksymalna możliwa SCN?
Nick Chammas
źródło
To pytanie zostało zainspirowane tym artykułem . Prawdopodobnie wielu ludzi Oracle szuka teraz tych liczb. :)
Nick Chammas
Wygląda na to, że link z mojego poprzedniego komentarza jest teraz uszkodzony. Wierzę, że ta strona została przeniesiona tutaj: infoworld.com/article/2618409/...
Nick Chammas

Odpowiedzi:

16

Aktualny SCN

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g i nowsze:

SELECT current_scn
FROM V$DATABASE;

Limity SCN

SCN ma twardy limit narzucony przez swój format i miękki limit narzucony sztucznie przez Oracle, jak opisano tutaj . Cytowałem odpowiednie fragmenty poniżej (wyróżnienie dodane).

Hard Limit

Architekci flagowej aplikacji bazy danych Oracle musieli być świadomi, że SCN musi być ogromną liczbą całkowitą. Jest to: 48-bitowa liczba ( 281,474,976,710,656 ). Eony bazy danych Oracle zajęłyby eony i spowodowałyby problemy - a przynajmniej tak myślisz.

Soft Limit

Miękki limit wynika z bardzo prostego obliczenia zakotwiczonego w punkcie sprzed 24 lat: weź liczbę sekund od 00:00:00 01/01/1988 i pomnóż tę liczbę przez 16 384. Jeśli bieżąca wartość SCN jest poniżej tej wartości, wszystko jest w porządku, a przetwarzanie jest kontynuowane jak zwykle. Mówiąc prościej, obliczenia zakładają, że baza danych działająca nieprzerwanie od 01.01.1988 r., Przetwarzająca 16 384 transakcji na sekundę, w rzeczywistości nie może istnieć.

Kontrola limitu SCN

Ten skrypt (Oracle 10g i wyżej) sprawdzi, ile wyczerpałeś twardych i miękkich limitów. Dzięki Rob za wywołanie miękkiego limitu.

WITH limits AS (
  SELECT 
      current_scn
  --, dbms_flashback.get_system_change_number as current_scn -- Oracle 9i
    , (SYSDATE - TO_DATE('1988-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) * 24*60*60 * 16384 
        AS SCN_soft_limit
    , 281474976710656 AS SCN_hard_limit
  FROM V$DATABASE
)
SELECT
    current_scn
  , current_scn/scn_soft_limit*100 AS pct_soft_limit_exhausted
  , scn_soft_limit
  , current_scn/scn_hard_limit*100 AS pct_hard_limit_exhausted
  , scn_hard_limit
FROM limits;
Nick Chammas
źródło
2
Widzę, że masz swoją odpowiedź. Powinieneś także przeczytać artykuł Riyaja
Niall Litchfield
Dzięki za referencje! Na wypadek, gdyby ktokolwiek chciał go przeczytać, artykuł znajduje się teraz na stronie orainternals.wordpress.com/2012/01/19/scn-what-why-and-how
Magnus Reftel
6

Oto zapytanie, które wymyśliłem, aby sprawdzić, czy moje bazy danych są poczytalne w odniesieniu do problemu z błędem SCN:

# Show the amount of SCN keyspace we have used so far on this database
# By default the SCN max on a 10g/11g 
# instance is a 48-bit integer (281,474,976,710,656) 
SELECT NAME,  
   (current_scn/281474976710656)*100 as PCT_OF_SCN_KEYSPACE_USED,  
   ROUND(SYSDATE-CREATED) as DAYS_SINCE_DB_CREATION, 
   ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)) AS EST_DAYS_BEFORE_SCN_EXHAUSTED, 
   ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)/365) AS EST_YEARS_BEFORE_SCN_EXHAUSTED  
FROM v$database;

Większość moich baz danych, które używają łączy DB, jest na poziomie 3,5% wyczerpania i może kontynuować bez zmian w obecnym tempie przez ponad 50 lat. Nie oznacza to, że jestem bezpieczny przed kimś łaskoczącym błąd SCN, ale przynajmniej nie znaleźliśmy bazy danych, która była znacznie wyższa od innych lub zbliżona do limitu.

David Mann
źródło
2

281,474,976,710,656 to twardy limit. Będziesz chciał wiedzieć, jaki jest limit miękki, ponieważ jest to wartość, na którą najpierw uderzyłbyś głową. Limit miękki jest (z grubsza) obliczany na podstawie liczby sekund, które upłynęły od 1 stycznia 1988 x 16384.

Obrabować
źródło
Nie wiem, jak stare odpowiedzi przeoczyły miękki limit (o którym wspomina Nick) - więc dobrym pomysłem jest dodanie brakujących szczegółów.
dezso