日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

系统改变号(SCN)详解

發(fā)布時間:2023/12/31 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 系统改变号(SCN)详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

系統(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。