it-swarm.asia

Bagaimana cara menemukan SCN saya saat ini?

Mengingat versi Oracle apa pun:

  • Bagaimana cara menemukan SCN saya saat ini?
  • Berapa SCN maksimum yang mungkin?
14
Nick Chammas

SCN saat ini

Oracle 9i:

SELECT dbms_flashback.get_system_change_number as current_scn 
FROM DUAL;

Oracle 10g ke atas:

SELECT current_scn
FROM V$DATABASE;

Batas SCN

SCN memiliki batas keras yang ditentukan oleh formatnya dan batas lunak yang diberlakukan secara buatan oleh Oracle, seperti dijelaskan di sini . Saya telah mengutip bagian yang relevan di bawah ini (penekanan ditambahkan).

Batas keras

Arsitek aplikasi basis data andalan Oracle pastilah sangat menyadari bahwa SCN perlu menjadi bilangan bulat besar. Ini adalah: nomor 48-bit ( 281.474.976.710.656 ). Butuh ribuan tahun untuk database Oracle untuk Eclipse bahwa jumlah transaksi dan menyebabkan masalah - atau jadi Anda mungkin berpikir.

Batas lunak

Batas lunak diperoleh dari perhitungan yang sangat sederhana yang tertambat ke titik waktu 24 tahun yang lalu: Ambil jumlah detik sejak 00:00:00 01/01/1988 dan kalikan angka itu dengan 16.384 . Jika nilai SCN saat ini di bawah itu, maka semuanya baik-baik saja dan pemrosesan berlanjut seperti biasa. Untuk menempatkannya dalam istilah sederhana, perhitungan mengasumsikan bahwa database berjalan terus-menerus sejak 01/01/1988, memproses 16.384 transaksi per detik, tidak bisa ada dalam kenyataan.

Pemeriksaan Batas SCN

Skrip ini (Oracle 10g dan lebih tinggi) akan memeriksa berapa banyak batasan keras dan lunak yang Anda gunakan. Terima kasih kepada Rob karena telah memanggil batas lunak.

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

Berikut ini adalah pertanyaan yang saya buat untuk memeriksa database saya untuk kewarasan tentang masalah bug 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;

Sebagian besar basis data saya yang menggunakan tautan DB berada pada batas kelelahan 3,5% dan dapat melanjutkan pada tingkat saat ini selama 50+ tahun tanpa masalah. Ini tidak berarti saya aman dari seseorang yang menggelitik bug SCN, tetapi setidaknya kami tidak menemukan database yang jauh lebih tinggi daripada yang lain atau mendekati batas.

6
David Mann

281.474.976.710.656 adalah batas keras. Anda pasti ingin tahu apa batas lunaknya, karena itulah nilai yang akan Anda dapatkan terlebih dahulu. Batas lunak dihitung (secara kasar) dengan jumlah detik yang berlalu sejak 1 Januari 1988 x 16384.

2
Rob