Mengingat versi Oracle apa pun:
- Bagaimana cara menemukan SCN saya saat ini?
- Berapa SCN maksimum yang mungkin?
Mengingat versi Oracle apa pun:
Jawaban:
Oracle 9i:
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g ke atas:
SELECT current_scn
FROM V$DATABASE;
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).
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 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.
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;
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.
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.