oracle commit隨筆記載
在oracle中的commit經常使用,但是commit前後資料庫內部所做的事情還是很值得推敲的。網友又提到了一個dml語句,沒有commit會產生redo嗎,產生redo肯定是的,而且在commit之前已經產生了大量的redo。
SQL> select name,value from v$mystat a,v$statname b where a.statistic#=b.statistic# and name='redo size';
NAME VALUE
---------------------------------------------------------------- ----------
redo size 1372
SQL> insert into test01 values(1,'pom');
1 row inserted
SQL> select name,value from v$mystat a,v$statname b where a.statistic#=b.statistic# and name='redo size';
NAME VALUE
---------------------------------------------------------------- ----------
redo size 1724
其實如果此時commit或者rollback都會產生redo。Redo是記錄block變化的資訊的。
沒有執行commit的dml時資料庫已經做了大部分工作,其實即使大事務的dml時,commit執行上也很平滑,commit之前很多工作已經完成了。
Dml時資料庫中:
1 修改sga中buffer cache,有資料塊的修改,可能同時有表段塊的修改和索引塊的修改。
2 sga中關於undo塊的生成,表的flashback都是利用undo tablespace中的前映象來實現的。
3 同樣redo log buffer產生了包含上述資料塊的變化的redo資訊。
4 buffer cache中可能有部門資料已經寫入到磁碟。
5 獲得需要的鎖。
剛開始誤解不commit的資料塊是不會寫入到磁碟的,commit時只是會觸發LGWR,把undo所在回滾段標記為已提交。
dml時會產生一個scn號,dbwr觸發會寫入到資料檔案頭部,commit時產生scn號,同樣寫入資料塊頭部。不過資料塊頭部只儲存了最新的scn號。
根據block的定義,block中儲存了事務插槽,事務期間都會佔用這個block的事務插槽,commit後事務結束,事務插槽可以被另外對此資料塊的事務使用。
Commit時資料庫內部:
1 事務生成scn
2 根據lgwr觸發條件,事務提交執行lgwr,redo log buff寫入redo log,事務從v$transaction中移除。
3 清理塊頭, 儲存最後一個scn,事務插槽讓別的事務正常使用,釋放表頭部的行鎖(dbwn不是順序寫入,commit時並不馬上釋放塊頭的行鎖,實際相應的dbwn完成才會釋放。)
對dml執行rollback:
伺服器程式根據資料檔案塊和buffer cache塊的塊頭的事務列表和scn以及回滾段地址找到前映像來還原相應的資料塊。
如果在一個事務中執行多個dml語句,產生了多個前映像,此時rollback,透過查詢資料塊頭查詢回滾段地址,oracle只保留了最早的前映像。
Commit完成了instance crash
由於事務提交lgwr已經完成了所有事務的redo log,即使buffer cache沒有寫入磁碟,重啟例項後smon會根據redo log前滾資料檔案到事務commit結束時。
Commit完成中途,instance crash:
1 Datafile和logfile同步
如果dml執行很長時間也沒有commit,此時log buffer和buffer cache已經寫入到磁碟,只是沒有commit來標誌事務的結束和把回滾段中前映像的標記為已提交,此時smon回滾資料檔案和日誌檔案最後一次事務提交時。
2 logfile中redo log新於datafile中,兩者不同步
此時logfile比datafile寫入的事務的資訊更多,本來也應該如此,dbwn發生前會優先發生lgwr,此時smon會優先把datafile前滾到logfile一致,然後回滾logfile和datafile到最後一次事務提交時。
就先整理這些吧,有些細節方面還需要後面更進一步的推敲。
精看細看文件,結合動手 思考練習,oracle就是沙漠和綠地不停的互動,不停的探討中!
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055099/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 隨筆記筆記
- 隨堂筆記筆記
- 隨記筆記未整理筆記
- oracle筆記Oracle筆記
- 2024/07/03筆記隨筆筆記
- 2024/06/25筆記隨筆筆記
- 2024/06/26筆記隨筆筆記
- 2024/06/23筆記隨筆筆記
- 2024/06/22筆記隨筆筆記
- SpringBoot隨手筆記Spring Boot筆記
- 知識盲點 隨筆筆記筆記
- IOC隨筆小記錄
- Bitbucket / Sourcetree 隨手筆記筆記
- Oracle 常用SQL筆記OracleSQL筆記
- [oracle零碎筆記]oracle零碎筆記(持續更新…)Oracle筆記
- ios layoutSubviews呼叫隨手筆記iOSView筆記
- 有感而發,隨筆記錄筆記
- Oracle vs PostgreSQL Develop(29) - COMMIT in PLSQLOracleSQLdevMIT
- 【python隨筆】之【運算子過載】Python
- 搭建PythonWeb框架Django+cx_Oracle隨記PythonWeb框架DjangoOracle
- 今日隨筆-構建之法讀書筆記筆記
- 20240505記錄《程式碼隨想錄》筆記筆記
- oracle學習筆記《一》Oracle筆記
- oracle.Performance.Tuning筆記OracleORM筆記
- 筆記:追隨雲原生的Java筆記Java
- 【筆記】如何產生隨機數筆記隨機
- 隨機過程複習筆記隨機筆記
- 黑馬筆記--C++基礎篇--隨筆筆記C++
- java常用修飾符(隨堂筆記)Java筆記
- Integer類小細節隨筆記錄筆記
- oracle全文索引之commit與DML操作Oracle索引MIT
- 通過容器提交映象(docker commit)以及推送映象(docker push)筆記DockerMIT筆記
- 隨筆-學習程式設計有沒有必要做筆記?如何做筆記?程式設計筆記
- 隨筆
- Oracle學習筆記(6)——函式Oracle筆記函式
- [概述]部落格隨筆/文章/日記食用指北
- 開通個人學習隨筆記錄筆記
- 隨機過程學習筆記——概論隨機筆記
- 寫一個Spark DataSource的隨手筆記Spark筆記