系统改变号(SCN)详解
系統改變號SCN
System Change Number
我們看到的SCN一串數字,由時間通過函數算出來的,或者通過函數將SCN轉成時間,簡單的理解,SCN相當于時間。
兩個時間的比較就是兩個字符串比較,但是計算機內部比較傾向于數字之間的比較
時間使用來比較先后以及比較新舊的。所以在Oracle數據庫中用的較多,可以經常在數據庫接觸到SCN,通過SCN的大小來判斷數據的新舊或者先后順序。
SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;
SCN在數據庫中的應用
1.控制文件
系統SCN
select checkpoint_change# from v$database;
文件SCN
select name,checkpoint_change# from v$datafile;
結束SCN
select name,last_change# from v$datafile;
檢查點信息
增量檢查點并不會去更新數據文件頭,以及控制文件中的數據庫SCN以及數據文件條目的SCN信息,而只是每3秒由CKPT進程去更新控制文件中的low cache rba信息,也就是檢查點的位置。
select CPDRT,
CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT FROM x$kcccp;
CPDRT---檢查點隊列中的臟塊數目
CPODS---是On disk RBA的SCN
CPODT---是On disk RBA的時間戳
CPHBT----是心跳
控制文件有三個SCN號,假設系統有四個數據文件,在控制文件中有一個系統SCN,對于每個數據文件有文件SCN,針對四個文件還有一個結束SCN,在文件的頭部有開始SCN,目的只有一個保證數據文件的一致性!!
正常的情況下,數據庫打開以后,系統SCN,在控制文件中的文件SCN,和開始SCN是相等的,因為數據庫正常運行中,所以結束SCN應該是空。
數據庫正常關閉以后,會將buffercache的所有緩存寫到磁盤上,同時使用關閉時間點更新系統SCN,文件SCN和頭部SCN。同時并將終止SCN設置成與其他三類SCN一樣。
當數據庫正常關閉以后,系統SCN,文件SCN,開始SCN,結束SCN都是一樣的
如果數據庫非正常關閉,此時的終止SCN是空的,當數據庫下一次啟動后就會發現終止SCN為空,也就是知道數據庫非正常關閉,需要進行恢復。但是當進行恢復時,Oracle發現其他三類SCN是一樣的,唯獨終止SCN為空,此時Orace就知道,需要做實例恢復。
Oracle在做實例恢復的時候:
1.需要部分redolog日志,不需要所有的redolog,不需要歸檔log
2.需要的日志,在控制文件中記錄著LRBA和O你 disk RBA,Oracle只找這段日志。而這段日志存在在redolog中。
redolog的狀態:I 、Active 、current
當日志跑完了后,證明數據已經恢復,此時就可以正常的使用數據庫了。
Oracle判斷是否進行實例恢復是通過這些SCN的!!
SCN的作用:保證數據庫的數據的一致性!!!
假設一種情況:
關閉數據庫,此時將四個數據文件中的一個文件刪除換成一個舊的備份文件,那么在oracle在祁東的時候就會發現,該文件的開始SCN與系統SCN和文件SCN是不一樣的,這時Oracle通過日志將SCN跑成一樣的。
在行業中經常說的一句話: 跑日志----目的:提升SCN
通過SCN可以判斷文件的新舊,如果是舊的文件,舊的SCN,那么就會通過跑日志,將SCN更新成新的。實際上,就是將新文件進行恢復。
以上是四個SCN關聯起來的作用。對于以后進行數據的恢復有很大的幫助。
每一個日志條文件的頭部都有兩個SCN,一個叫first,另個叫next
first是這一條日志的第一個SCN號,而next為最后一個SCN號(下一條日志的第一個SCN)
那么first和next記錄的是這個日志文件所有的SCN號的范圍
假設:有一個控制文件,四個dbf數據文件,還有日志文件
數據庫在正常運行的期間,會有四個SCN號,分別是控制文件的系統SCN,文件SCN,結束SCN以及文件頭部的開始SCN,除了結束SCN為空,其他三個SCN是相等的。
查看系統SCN和文件SCN
select name,checkpoint_change# from v$datafile;
在查看日志文件當前文件的SCN
select * from v$log;
這些SCN相等的,假如說這時數據庫崩潰,此時需要恢復文件,只需要恢復884269之后文件即可,需要用到的日志就是當前日志即可(current)
此時做一個操作,執行兩次強制日志切換,再去查看系統 文件以及firstSCN號
這時原來的current變為active(884269)
在這種狀態下,數據庫如果崩潰,需進行日志恢復,需要用到61號日志開始一直到63號日志,也就是三個日志。
文件的SCN號主要用來標識文件的新舊程度
當做日志切換的時候,系統的SCN號是不發生改變的,這四類SCN號的主要作用標志著文件的新舊程度以及一致程度。
其實在控制文件中是有具體的LRBA地址,具體oracle恢復時去找LRBA地址進行恢復
此時做另外一個操作,將buffer_cache中的所有臟塊寫入磁盤,此時在查看日志
日志狀態由原來的active變為inactive
active----代表日志文件中的日志所對應的臟緩沖區未寫入磁盤代表日志不能被覆蓋
臟緩沖區還未寫回去意味著實例恢復的時候還需要active的日志
控制文件中的3個SCN號以及dbf頭部的SCN號記錄的是日志文件中的current和active日志的SCN號
在控制文件中的SCN號只是用來確定使用哪個日志文件進行恢復,而在日志之中,并不是所有的日志都要用到,控制文件中的LRBA地址決定的是使用日志文件中的哪些日志進行恢復。
系統,文件,起始SCN對應的是日志文件中最老的active日志的firstSCN號。
當檢查點隊列發生的時候,系統 ,文件,結束,起始SCN沒有被更新,只是更新了控制文件中的LRBA地址。
而這四個SCN什么時候會更新呢?只有在數據庫關閉的時候會更新。
而三個SCN什么時候會更新呢?只有日志狀態的active變成inactive才會更新。
數據庫非正常關閉的話,結束SCN為空,此時oracle會知道需要進行數據庫恢復,但是當dbf文件被替換成舊的dbf時,需要用到歸檔日志和redolog日志一起將dbf文件恢復到最新。
做一個操作, 將數據庫關閉,將控制文件以及四個dbf文件全部換成舊的,當oracle啟動對四類SCN號進行判斷的時候,是沒有辦法確定四個文件是新還是舊,需要看redolog中的on disk RBA(redolog中current的最后一條日志)會比四個SCN號要新,所以要恢復,僅僅使用redolog是沒有辦法進行恢復的。還需要歸檔日志。
查詢以往日志的first和next
select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6;
數據塊有SCN,日志有SCN,假設塊是新的,日志是舊的,那么在跑日志的時候,發現日志的SCN會比塊的SCN舊,日志會略過塊,空跑。
所以對于實例恢復時,跑日志是可以多,但不能少。
Oracle有一個參數,fast_start_mttr_target
參考博文:https://blog.csdn.net/qq_36249352/article/details/80704548
總結
以上是生活随笔為你收集整理的系统改变号(SCN)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中deepcopy函数_py
- 下一篇: access vba表字段_vba中如何