現在のSCNを見つけるにはどうすればよいですか?


14

Oracleの任意のバージョンを考えます:

  • 現在のSCNを見つけるにはどうすればよいですか?
  • 可能な最大のSCNとは何ですか?

この質問は、この記事に触発されました。たぶん、これらの数字を調べているオラクルの人々はたぶんたくさんいるでしょう。:)
ニックチャマス

以前のコメントからのリンクが壊れているようです。:私は、そのページがここに移動されたと信じていinfoworld.com/article/2618409/...
ニックChammasを

回答:


16

現在のSCN

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g以降:

SELECT current_scn
FROM V$DATABASE;

SCNの制限

ここで説明するように、SCNにはその形式によって強い制限があり、Oracleによって人為的に強い制限があります。以下に関連する部分を引用しました(強調を追加)。

ハードリミット

Oracleの主力データベースアプリケーションの設計者は、SCNが巨大な整数である必要があることを十分に認識している必要があります。48ビットの数値(281,474,976,710,656)。Oracleデータベースがその数のトランザクションを食いつぶして問題を引き起こすには、何年もかかります。

ソフトリミット

ソフト制限は、24年前の時点に固定された非常に単純な計算から派生しています。1988年1月1日00:00:00からの秒数を取り、その数値に16,384を掛けます。現在のSCN値がそれより低い場合、すべてが正常であり、処理は通常どおり続行されます。これを簡単に言えば、計算では、1秒あたり16,384トランザクションを処理する1988年1月1日以降常に実行されているデータベースが実際には存在できないと仮定しています。

SCN制限チェック

このスクリプト(Oracle 10g以降)は、使い果たしたハード制限とソフト制限をチェックします。ソフト制限を呼び出してくれたRobに感謝します。

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;

2
答えがあると思います。あなたはまたでRiyajの記事をお読みくださいorainternals.com/2012/01/20/scn-what-why-and-how
ニールリッチフィールド

参照いただきありがとうございます!場合、誰が記事がで今、それを読みたいorainternals.wordpress.com/2012/01/19/scn-what-why-and-how
マグナスReftel

6

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;

DBリンクを使用する私のデータベースのほとんどは3.5%の枯渇マークにあり、問題なく50年以上現在のレートで継続できます。これは、SCNバグをくすぐる誰かから安全であるという意味ではありませんが、少なくとも、他のデータベースよりもはるかに高いデータベースや制限に近いデータベースは見つかりませんでした。


2

281,474,976,710,656がハードリミットです。ソフトリミットが何であるかを知る必要があります。これは、最初に頭にぶつかる値だからです。ソフト制限は(大体)1988年1月1日x 16384から経過した秒数で計算されます。


古い答えがどのようにソフト制限を逃したかはわかりません(ニックによるリンクの記事に記載されています)。したがって、不足している詳細を追加することをお勧めします。
dezso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.