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