it-swarm.com.de

Wie finde ich meinen aktuellen SCN?

Bei jeder Version von Oracle:

  • Wie finde ich meinen aktuellen SCN?
  • Was ist der maximal mögliche SCN?
14
Nick Chammas

Aktuelle SCN

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g und höher:

SELECT current_scn
FROM V$DATABASE;

SCN-Grenzwerte

SCN hat eine harte Grenze, die durch sein Format auferlegt wird, und eine weiche Grenze, die künstlich von Oracle auferlegt wird, wie hier beschrieben . Ich habe die relevanten Teile unten zitiert (Hervorhebung hinzugefügt).

Harte Grenze

Die Architekten der Flaggschiff-Datenbankanwendung von Oracle müssen sich bewusst gewesen sein, dass der SCN eine massive Ganzzahl sein muss. Es ist: eine 48-Bit-Nummer ( 281.474.976.710.656 ). Es würde Äonen dauern, bis eine Oracle-Datenbank diese Anzahl von Transaktionen verdunkelt und Probleme verursacht - so könnte man meinen.

Soft Limit

Die weiche Grenze ergibt sich aus einer sehr einfachen Berechnung, die zu einem Zeitpunkt vor 24 Jahren verankert war: Nehmen Sie die Anzahl der Sekunden seit 00:00:00 01/01/1988 und multiplizieren Sie diese Zahl mit 16.384 . Wenn der aktuelle SCN-Wert darunter liegt, ist alles in Ordnung und die Verarbeitung wird normal fortgesetzt. Vereinfacht ausgedrückt geht die Berechnung davon aus, dass eine Datenbank seit dem 01.01.1988 konstant läuft. Die Verarbeitung von 16.384 Transaktionen pro Sekunde kann in der Realität nicht existieren.

SCN-Grenzwertprüfung

Dieses Skript (Oracle 10g und höher) überprüft, wie viel von den harten und weichen Grenzen Sie ausgeschöpft haben. Vielen Dank an Rob für das Ausrufen des Soft Limits.

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;
16
Nick Chammas

Hier ist eine Abfrage, die ich erstellt habe, um meine Datenbanken auf Fehler in Bezug auf das SCN-Fehlerproblem zu überprüfen:

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

Die meisten meiner Datenbanken, die DB-Links verwenden, sind zu 3,5% erschöpft und können problemlos über 50 Jahre lang mit der aktuellen Rate betrieben werden. Dies bedeutet nicht, dass ich vor jemandem sicher bin, der den SCN-Fehler kitzelt, aber zumindest haben wir keine Datenbank gefunden, die viel höher als die anderen oder nahe am Limit war.

6
David Mann

281.474.976.710.656 ist die harte Grenze. Sie möchten wissen, wie hoch das weiche Limit ist, da dies der Wert ist, auf den Sie zuerst Ihren Kopf schlagen würden. Die weiche Grenze wird (ungefähr) durch die Anzahl der Sekunden berechnet, die seit dem 1. Januar 1988 x 16384 vergangen sind.

2
Rob