算法:ORA-600 2252和SCN 最大值SCN_WRAP SCN_BASE

原文: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 KZEL

ORA-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“在線問答,隨時解惑,歡迎瞭解和關注!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章