原文:https://www.enmotech.com/web/detail/1/847/1.html
自 2019年6月23日之後,關於 SCN 的問題不斷爆發,尤其是 2252 錯誤引發了很多緊急的故障。
我在上一篇文章中已經詳細描述了這個場景:
https://www.enmotech.com/web/detail/1/843/1.html
很多朋友進一步的在 墨天輪 提出問題,尋求解答。我再闡述幾個問題。
1.SCN 是Oracle 的系統時鐘,不斷向前,當前有一個最大允許值;
2.最大允許值受增長最大步長限制,這個限制在之前是 16K/s,自11.2.0.4之後缺省值是 32k/s,但是上限允許在 96k/s
我們現在來看一則錯誤信息:
*** CLIENT DRIVER:() 2019-08-14 08:59:43.883
*** ACTION NAME:() 2019-08-14 08:59:43.883[TOC00000]
Jump to table of contents
Dump continued from file: /oracle/diag/rdbms/trace/db1_ora_244966.trc
[TOC00001]
ORA-00600: internal error code, arguments: [ORA-00600: internal error code, arguments: [2252], [4183], [1370899101], [], [], [], [], []
], [], [], [], [], [], [], [], [], [], [], []
ORA-02063: preceding line from KZELORA-01403: no data found
我們現在由這一個錯誤信息做一點計算。
首先 2252 中拋出了 SCN 的兩部分信息:SCN_WRAP 和 SCN_BASE。
在 Oracle 12.2 之前 SCN 由 6 Bytes 組成,12.2 之後擴展了,參考文章:
https://www.eygle.com/archives/2018/03/oracle_122_bigscn_new_features.html
在舊版本中,SCN是一個6字節(48bit)的數字,其最大值爲281,474,976,710,656(2^48),在存儲上分爲2個部分:SCN_BASE 4字節(32bit),SCN_WRAP 2字節(16bit)的數字,當SCN_BASE達到其最大值(2^32 = 4294967296)時,SCN_WRAP增加1,SCN_BASE將被置0重新計數。
所以 SCN 的計算公式如下:
SCN =(SCN_WRAP * 4294967296)+ SCN_BASE
我們將錯誤信息中的: [2252], [4183], [1370899101] 計算一下就是
SCN = ( 4183 * 4294967296) + 1370899101 = 17,967,219,098,269
SQL> select 4294967296*4183 + 1370899101 scn from dual;
SCN
------------------------17,967,219,098,269
我們再根據時間計算一下這個時間點數據庫允許的最大 SCN(低版本是 16K/s )。
系統出錯的時間是:2019-08-14 08:59:43.883 .
數據庫的計算基準時間是 1988年1月1日零點零分零秒。計算公式如下:
https://www.eygle.com/archives/2012/05/oracle_rejection_scn_threshold.html
col scn for 999,999,999,999,999,999
select
(
(
(
(
(
(
to_char(sysdate,'YYYY')-1988
)*12+
to_char(sysdate,'mm')-1
)*31+to_char(sysdate,'dd')-1
)*24+to_char(sysdate,'hh24')
)*60+to_char(sysdate,'mi')
)*60+to_char(sysdate,'ss')
) * to_number('ffff','XXXXXXXX')/4 scn
from dual/
計算出來這個時間的最大 SCN 就是:
SQL> l
1 select
2 (
3 (
4 (
5 (
6 (
7 (
8 2019-1988
9 )*12+
10 8-1
11 )*31+14-1
12 )*24+8
13 )*60+59
14 )*60+43
15 ) * to_number('ffff','XXXXXXXX')/4 scn
16* from dual
SQL> /SCN
------------------------
16,650,300,226,976
對比一下出錯值和最大允許值:
17,967,219,098,269
16,650,300,226,976
我們注意前者已經大於後者,也就是主數據庫的 SCN 高過了 DB Link 連接的低版本數據庫 SCN 最大許可值。
那現在怎麼辦?
如果還需要這兩個數據庫相連接,就只能夠去升級低版本的數據庫。別無他法。
想了解更多關於數據庫、雲技術的內容嗎?
快來關注“數據和雲"、"雲和恩墨,"公衆號及"雲和恩墨"官方網站,我們期待大家一同學習與進步!
數據和雲小程序”DBASK“在線問答,隨時解惑,歡迎瞭解和關注!