it-swarm.asia

كيف أجد SCN الحالي؟

بالنظر إلى أي إصدار من Oracle:

  • كيف أجد SCN الحالي؟
  • ما هو الحد الأقصى الممكن لـ SCN؟
14
Nick Chammas

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 ). سوف يستغرق دهورًا لقاعدة بيانات أوراكل لتتغلب على هذا العدد من المعاملات وتسبب مشاكل - أو هكذا قد تعتقد.

الحد الناعم

يُستمد الحد الأدنى من حساب بسيط للغاية مثبت على نقطة زمنية قبل 24 عامًا: خذ عدد الثواني منذ 00:00:00 01/01/1988 واضرب هذا الرقم في 16،384 . إذا كانت قيمة SCN الحالية أقل من ذلك ، فكل شيء على ما يرام وتستمر المعالجة كالمعتاد. لوضع هذا بعبارات بسيطة ، يفترض الحساب أن قاعدة البيانات تعمل باستمرار منذ 01/01/1988 ، معالجة 16384 معاملة في الثانية ، لا يمكن أن توجد في الواقع.

فحص حد SCN

سيتحقق هذا النص البرمجي (Oracle 10g والإصدارات الأحدث) من مقدار الحدود الصلبة واللينة التي استنفدتها. بفضل روب لاستدعاء الحد الناعم.

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

فيما يلي استعلام توصلت إليه للتحقق من قواعد البيانات الخاصة بي من أجل التعقل فيما يتعلق بمسألة خطأ 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 ، ولكن على الأقل لم نجد قاعدة بيانات أعلى بكثير من غيرها أو قريبة من الحد.

6
David Mann

281،474،976،710،656 هو الحد الثابت. ستحتاج إلى معرفة ما هو الحد الأدنى ، لأن هذه هي القيمة التي تضرب رأسك عليها أولاً. يتم حساب الحد الأدنى (تقريبًا) بعدد الثواني المنقضية منذ 1 يناير 1988 × 16384.

2
Rob