Oracle'ın herhangi bir sürümü verildiğinde:
- Mevcut SCN'mi nasıl bulabilirim?
- Mümkün olan maksimum SCN nedir?
Oracle'ın herhangi bir sürümü verildiğinde:
Yanıtlar:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g ve üstü:
SELECT current_scn
FROM V$DATABASE;
SCN'nin biçimi tarafından dayatılan bir sert sınırı ve burada açıklandığı gibi Oracle tarafından yapay olarak uygulanan bir yumuşak sınırı vardır . Aşağıdaki ilgili bölümlerden alıntı yaptım (vurgu eklendi).
Oracle'ın amiral gemisi veritabanı uygulamasının mimarları, SCN'nin büyük bir tamsayı olması için gereken farkında olmalıdır. 48 bitlik bir sayıdır ( 281,474,976,710,656 ). Bir Oracle veritabanının bu sayıda işlemi tutması ve sorunlara neden olması eons sürer - ya da düşünebilirsiniz.
Yumuşak sınır, 24 yıl önce zamana bağlanan çok basit bir hesaplamadan kaynaklanır: 00:00:00 01/01/1988 tarihinden bu yana geçen saniye sayısını alın ve bu rakamı 16.384 ile çarpın. Mevcut SCN değeri bunun altındaysa, her şey yolunda demektir ve işleme normal şekilde devam eder. Basit bir ifadeyle, hesaplama 01/01/1988 tarihinden beri sürekli çalışan ve saniyede 16,384 işlem gerçekleştiren bir veritabanının gerçekte var olamayacağını varsayar.
Bu komut dosyası (Oracle 10g ve üstü), zor ve yumuşak sınırların ne kadarını tükettiğinizi kontrol edecektir. Yumuşak sınırı çağırdığı için Rob'a teşekkürler.
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;
İşte SCN hata sorunu ile ilgili aklıma veritabanlarımı kontrol etmek için geldi bir sorgu:
# 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 bağlantıları kullanan veritabanlarımın çoğu% 3,5 bitkin işaretindedir ve 50'den fazla yıl boyunca geçerli hızda sorun yaşamadan devam edebilir. Bu, SCN hatasını gıdıklayan birinden güvenli olduğum anlamına gelmez, ancak en azından diğerlerinden çok daha yüksek veya sınıra yakın bir veritabanı bulamadık.
281,474,976,710,656 zor sınırdır. Yumuşak limitin ne olduğunu bilmek isteyeceksiniz, çünkü bu ilk önce başınıza vurduğunuz değerdir. Yumuşak sınır (kabaca) 1 Ocak 1988 x 16384'ten bu yana geçen saniye sayısı ile hesaplanır.