資料庫startup啟動時前滾回滾進行例項恢復的理解
前滾回滾過程應該是這樣的:資料庫記錄了最新的SCN、增量checkpoint的SCN、redo log的最大SCN,透過增量checkpoint的SCN開始應用redo log直到redo log的最大SCN乃至最新的SCN,這樣就完成了前滾,在回滾的時候直接讀取undo中這個會話最初的scn和前映象直接回滾,不會一個個資料塊去undo,否則如果10G資料寫入資料檔案但是沒有commit那回滾得多久啊
redo、undo用到的原因是:因redo log先於datafile寫入持久層,所以例項啟動時需要先前滾redo log中修改的資料,如果這些資料沒有commit再從undo中回滾回去。
At least every three seconds the checkpoint process records information in the control file about the checkpoint position in the online redo log.
--即使沒有發生任何事情,每3秒SCN也必須至少增加1
dbwn程式寫入data file的條件
系統發出檢查點指令(ckpt程式啟動後會促使dbwn寫data file)。
髒緩衝區個數達到指定閥值。
服務程式搜尋一定數目的資料塊後,不能找到自由緩衝區。
資料寫入計時時間到。
lgwr程式寫入redo log的條件
在DWBR 程式將髒緩衝區寫入資料檔案之前
在重做日誌記錄達到日誌緩衝區的三分之一
日誌緩衝區記錄的日誌多於1M
每隔3秒鐘
提交事務(執行Commit)
ckpt程式寫SCN記錄的條件
發生日誌切換。
關閉例項(SHUTDOWN ABORT 除外)。
手工執行檢查點操作。
由初始化引數LOG_CHECKPOINT_INTERVAL 和LOG_CHECKPOINT_TIMEOUT強制發出。
shutdown abort的情況
修改過的緩衝區不寫入資料檔案
不回退未提交的更改
不執行ckpt
undo記錄SCN
When a transaction modifies data, the database writes a new SCN to the undo data segment assigned to the transaction
redo記錄SCN
LGWR puts a commit record in the redo log buffer and writes it to disk immediately, along with the commit SCN and transaction's redo entries
假如,一個會話A,修改某行的某列數值5為3,但是沒有來得及commit,就執行了shutdown abort
這個時候可能有三種情況
1、這個修改寫入了data file(寫入data file和是否commit沒有關係)也寫入了redo log(寫入了data file則一定會觸發先寫redo log),資料庫startup過程中例項恢復的流程
2、這個修改沒有寫入了data file,但是寫入了redo log(除了commit外,還有4種情況會寫入redo log),資料庫startup過程中例項恢復的流程
3、這個修改沒有寫入data file,也沒有寫入redo log(如果寫入redo log的條件都沒在會話A期間發生),資料庫startup過程中例項恢復的流程
前滾回滾例項恢復都是如下一個流程
因為沒有ckpt,所以data file和control file沒有記錄會話A的SCN
如果已經寫入了redo log,所以redo log記錄了會話A的SCN
如果沒有寫入了redo log,redo log也至少記錄了會話A前3秒(shutdown abort前3秒)的一個SCN
雖然沒有ckpt,但是control file仍有一個最新的SCN,v$database.current_scn,此SCN可能還大於redo log的最新SCN
SMON程式發現redo log、data file、control file三者的SCN不一致,則利用redo log進行前滾,同步資料檔案、控制檔案使這二者和重做日誌檔案的最新SCN一致,當前滾完成後,發現會話A的資料塊的ITL狀態是uncommitted,則再使用undo中會話A的前映象回滾,再一次同步資料檔案、控制檔案、重做日誌檔案確保三者都是一致的SCN
shutdown abort後,執行start up會自動更新data file和control file的SCN
SQL> select to_char(sysdate,'hh:mm:ss') from dual;
TO_CHAR(
--------
02:03:08
SQL> select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE#,CURRENT_SCN from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# CURRENT_SCN
------------------ ------------------- -----------
1062765 1062824 1063536
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1062765
SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1062765
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1344680 bytes
Variable Size 788532056 bytes
Database Buffers 469762048 bytes
Redo Buffers 12574720 bytes
Database mounted.
Database opened.
SQL> select to_char(sysdate,'hh:mm:ss') from dual;
TO_CHAR(
--------
02:03:50
SQL> select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE#,CURRENT_SCN from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# CURRENT_SCN
------------------ ------------------- -----------
1083549 1083604 1083812
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1083549
SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1083549
redo、undo用到的原因是:因redo log先於datafile寫入持久層,所以例項啟動時需要先前滾redo log中修改的資料,如果這些資料沒有commit再從undo中回滾回去。
At least every three seconds the checkpoint process records information in the control file about the checkpoint position in the online redo log.
--即使沒有發生任何事情,每3秒SCN也必須至少增加1
dbwn程式寫入data file的條件
系統發出檢查點指令(ckpt程式啟動後會促使dbwn寫data file)。
髒緩衝區個數達到指定閥值。
服務程式搜尋一定數目的資料塊後,不能找到自由緩衝區。
資料寫入計時時間到。
lgwr程式寫入redo log的條件
在DWBR 程式將髒緩衝區寫入資料檔案之前
在重做日誌記錄達到日誌緩衝區的三分之一
日誌緩衝區記錄的日誌多於1M
每隔3秒鐘
提交事務(執行Commit)
ckpt程式寫SCN記錄的條件
發生日誌切換。
關閉例項(SHUTDOWN ABORT 除外)。
手工執行檢查點操作。
由初始化引數LOG_CHECKPOINT_INTERVAL 和LOG_CHECKPOINT_TIMEOUT強制發出。
shutdown abort的情況
修改過的緩衝區不寫入資料檔案
不回退未提交的更改
不執行ckpt
undo記錄SCN
When a transaction modifies data, the database writes a new SCN to the undo data segment assigned to the transaction
redo記錄SCN
LGWR puts a commit record in the redo log buffer and writes it to disk immediately, along with the commit SCN and transaction's redo entries
假如,一個會話A,修改某行的某列數值5為3,但是沒有來得及commit,就執行了shutdown abort
這個時候可能有三種情況
1、這個修改寫入了data file(寫入data file和是否commit沒有關係)也寫入了redo log(寫入了data file則一定會觸發先寫redo log),資料庫startup過程中例項恢復的流程
2、這個修改沒有寫入了data file,但是寫入了redo log(除了commit外,還有4種情況會寫入redo log),資料庫startup過程中例項恢復的流程
3、這個修改沒有寫入data file,也沒有寫入redo log(如果寫入redo log的條件都沒在會話A期間發生),資料庫startup過程中例項恢復的流程
前滾回滾例項恢復都是如下一個流程
因為沒有ckpt,所以data file和control file沒有記錄會話A的SCN
如果已經寫入了redo log,所以redo log記錄了會話A的SCN
如果沒有寫入了redo log,redo log也至少記錄了會話A前3秒(shutdown abort前3秒)的一個SCN
雖然沒有ckpt,但是control file仍有一個最新的SCN,v$database.current_scn,此SCN可能還大於redo log的最新SCN
SMON程式發現redo log、data file、control file三者的SCN不一致,則利用redo log進行前滾,同步資料檔案、控制檔案使這二者和重做日誌檔案的最新SCN一致,當前滾完成後,發現會話A的資料塊的ITL狀態是uncommitted,則再使用undo中會話A的前映象回滾,再一次同步資料檔案、控制檔案、重做日誌檔案確保三者都是一致的SCN
shutdown abort後,執行start up會自動更新data file和control file的SCN
SQL> select to_char(sysdate,'hh:mm:ss') from dual;
TO_CHAR(
--------
02:03:08
SQL> select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE#,CURRENT_SCN from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# CURRENT_SCN
------------------ ------------------- -----------
1062765 1062824 1063536
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1062765
SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1062765
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1344680 bytes
Variable Size 788532056 bytes
Database Buffers 469762048 bytes
Redo Buffers 12574720 bytes
Database mounted.
Database opened.
SQL> select to_char(sysdate,'hh:mm:ss') from dual;
TO_CHAR(
--------
02:03:50
SQL> select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE#,CURRENT_SCN from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# CURRENT_SCN
------------------ ------------------- -----------
1083549 1083604 1083812
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1083549
SQL> select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1083549
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2151936/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 3.1.5.7 啟動例項、掛載資料庫並啟動完整的媒體恢復資料庫
- Oracle 資料回滾Oracle
- 【資料庫資料恢復】ASM例項不能掛載的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- 【資料庫資料恢復】Oracle ASM例項無法掛載的資料恢復案例資料庫資料恢復OracleASM
- CSS 例項之滾動的圖片欄CSS
- 美化滾動條效果程式碼例項
- 入門Kubernetes - 滾動升級/回滾
- PHP+InfiniteScroll網頁無限滾動載入資料例項PHP網頁
- 【資料庫資料恢復】MongoDB資料庫服務啟動失敗的資料恢復案例資料庫資料恢復MongoDB
- 【資料庫資料恢復】無法啟動MongoDB服務的資料恢復案例資料庫資料恢復MongoDB
- mysql資料誤刪後的資料回滾MySql
- 瀏覽器恢復滾動行為~瞭解一下瀏覽器
- 資料庫資料恢復—MongoDB資料庫檔案丟失,啟動報錯的資料恢復案例資料庫資料恢復MongoDB
- 【資料庫資料恢復】突然斷電造成Syabse資料庫無法啟動的資料恢復案例資料庫資料恢復
- 資料庫資料恢復——Windows無法啟動MongoDB服務的資料恢復案例資料庫資料恢復WindowsMongoDB
- 3.1.5.4 啟動例項並mount 資料庫資料庫
- 3.1.5.1 關於啟動資料庫例項資料庫
- PostgreSQL 恢復大法 - 恢復部分資料庫、跳過壞塊、修復無法啟動的資料庫SQL資料庫
- 將RAC備份集恢復為單例項資料庫單例資料庫
- CSS例項:翻轉圖片、滾動圖片欄、開啟大門CSS
- 金倉資料庫KingbaseES PLSQL 支援語句級回滾資料庫SQL
- 實踐資料回滾解決方案
- mysql資料庫恢復一例MySql資料庫
- 資料庫升級之-Dataguard滾動升級資料庫
- 帝國cms如何進行恢復資料庫教程資料庫
- 資料庫資料恢復—無備份,binlog未開啟的Mysql資料庫資料恢復案例資料庫資料恢復MySql
- 資料庫恢復後開啟時遇到 ORA-01152資料庫
- oracle回滾溯源Oracle
- 行動硬碟資料恢復硬碟資料恢復
- 資料庫資料恢復-oracle資料庫報錯無法開啟的如何恢復資料?資料庫資料恢復Oracle
- 如何進行Oracle資料庫不完全恢復RBOracle資料庫
- 【資料庫資料恢復】SAP資料庫資料恢復案例資料庫資料恢復
- 【資料庫資料恢復】透過恢復NDF檔案修復資料庫的資料恢復過程資料庫資料恢復
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- 【資料庫資料恢復】windows server下SqlServer資料庫的資料恢復資料庫資料恢復WindowsServerSQL
- 如何用堆疊來儲存和恢復滾動條位置
- scroll-view元件bindscroll例項應用:自定義滾動條View元件