Bagaimana cara menemukan SCN saya saat ini?

14

Mengingat versi Oracle apa pun:

  • Bagaimana cara menemukan SCN saya saat ini?
  • Berapa SCN maksimum yang mungkin?
Nick Chammas
sumber
Pertanyaan ini terinspirasi oleh artikel ini . Mungkin ada banyak orang Oracle mencari angka-angka ini sekarang. :)
Nick Chammas
Sepertinya tautan dari komentar saya sebelumnya rusak. Saya percaya bahwa halaman telah dipindahkan di sini: infoworld.com/article/2618409/…
Nick Chammas

Jawaban:

16

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 dikenakan secara artifisial 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 ). Diperlukan waktu ribuan tahun untuk database Oracle untuk melampaui jumlah transaksi dan menyebabkan masalah - atau mungkin Anda berpikir demikian.

Batas lunak

Batas lunak berasal dari perhitungan yang sangat sederhana yang dipusatkan 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. Singkatnya, 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;
Nick Chammas
sumber
2
Saya melihat Anda memiliki jawaban Anda. Anda juga harus membaca artikel Riyaj
Niall Litchfield
Terima kasih untuk referensi! Jika ada orang lain yang ingin membacanya, artikel tersebut sekarang ada di orainternals.wordpress.com/2012/01/19/scn-apa-mengapa-dan-bagaimana
Magnus Reftel
6

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 terus 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.

David Mann
sumber
2

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

rampok
sumber
Saya tidak tahu bagaimana jawaban lama melewatkan batas lunak (yang disebutkan dalam artikel yang dihubungkan oleh Nick) - jadi itu adalah ide yang baik untuk menambahkan detail yang hilang.
dezso