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