亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle——redo+undo總結

發布時間:2020-07-01 03:07:21 來源:網絡 閱讀:983 作者:一個笨小孩 欄目:數據庫

《Oracle------redo》

重做日志文件(redo log file)對數據庫來說至關重要,他們是數據庫的事務日志;

Oracle數據庫維護著兩類重做日志文件:在線重做日志文件(redo)和 歸檔重做日志文件(archive log),(歸檔重做日志文件實際上就是已填滿的“舊”在線重做日志文件的副本)

這兩類重做日志文件都是用于恢復的:

①:如果數據庫所在主機掉電,導致實例失敗,Oracle會使用在線重做日志將系統恢復到恰好在掉電之前的那個提交點;

②:如果磁盤驅動器出現故障(這是介質失敗),Oracle會使用歸檔重做日志以及在線重做日志,以及之前的一個備份,將原在此驅動器上的數據恢復到某個時間點;


每個Oracle數據庫都至少有兩個在線重做日志,每個組中至少有一個成員(重做日志文件),在線重做日志組會以循環的方式使用;


Redo log的日志狀態分為4種:

current:指的是當前日志文件,該日志文件是活動的,當前正在被使用的,進行崩潰恢復時,Current日志文件是必須的;

ACTIVE:是活動的非當前日志,可以已經完成歸檔也可能沒有歸檔,在Crash恢復時會被用到;

inactive:非活動日志,在實例恢復時不再需要,但是在介質恢復時可能會用到,此狀態的日志也可能沒有被歸檔。

unused:該日志從未被寫入,這類日志可能是剛被添加到數據庫或者在resetlogs之后被重置。 


《Oracle----undo》

REDO是為了重新實現你的操作,而UNDO相反,是為了撤銷你做的操作,比如你得一個TRANSACTION執行失敗了或你自己后悔了,則需要用ROLLBACK命令回退到操作之前。回滾是在邏輯層面實現而不是物理層面,因為在一個多用戶系統中,數據結構,blocks等都在時時變化,比如我們INSERT一個數據,表的空間不夠,擴展了一個新的EXTENT,我們的數據保存在這新的EXTENT里,其它用戶隨后也在這EXTENT里插入了數據,而此時我想ROLLBACK,那么顯然物理上講這EXTENT撤銷是不可能的,因為這么做會影響其他用戶的操作。所以,ROLLBACK是邏輯上回滾,比如對INSERT來說,那么ROLLBACK就是DELETE了。 


注意:redo是用于在失敗時恢復事務,undo則用來取消一條語句或一組語句的作用。與redo不同,undo是存儲在數據庫內部一組特殊的段中,稱為undo段


1、insert:

第一條insert into t 語句會同時生成redo和undo,它鎖生成的undo信息足以使insert小時,而redo信息則足以讓這個insert再次發生;我們可以看到,塊緩沖區里面存放著修改完的undo塊、索引塊、和表數據塊,所有的這些塊都被重做日志緩沖區中相應條目所保護;


2、update

update 生成的undo量更大,比insert要大,這是因為由于update需要保存數據修改前的映像;update語句還放在重做日志緩沖區中;


3、delete:

delete會生成undo,塊被修改,并把redo發送到重做日志緩沖區;


4、commit

當事務提交時,Oracle會把重做日志緩沖區刷新輸出到磁盤;


注意:

insert生成的undo最少;(因為Oracle只是記錄了一個rowid)

delete生成的undo最多;(因為Oracle必須把整行的刪除前映像記錄到undo段中)

(索引的維護也是很高的,比如要更新有索引的列 那么會生成好幾倍的undo)


commit的開銷主要來自兩方面:

第一:客戶端與數據庫直接往返通信量將會顯著增大

第二:每次提交,都必須等待redo寫至磁盤(在這種情況下,就會出現log file sync的等待事件)


執行commit時,剩下的工作:

1、為事務生成一個SCN號

2、LGWR將所有未寫入磁盤的重做日志條目寫至磁盤,并把SCN記錄到在線重做日志文件中;

3、v$lock中會記錄著我們的回話鎖,這些鎖都將被釋放,而排隊等待這些鎖的會話都會被喚醒,從而可以繼續完成他們的工作;

4、如果事務修改的某些塊還在緩沖區緩存中,Oracle就會以一種快速的模式訪問并清理;


redo  與 undo 日志的主要區別:

1、undo日志:在恢復時取消未完成事務的影響,忽略已經提交的事務

2、redo日志:忽略未完成的事務,重做已經提交事務的改變。

3、undo日志:先將修改后的數據寫到磁盤——寫commit到磁盤

4、redo日志:先寫commit到磁盤——將修改后的數據寫到磁盤

5、undo日志:要求數據在事務結束后立即寫到磁盤,可能增加磁盤IO數

6、redo日志:要求我們在事務提交和日志記錄刷新以前將所有修改過的塊保留在緩沖區,可能增加事務需要的平均緩沖區數


《臨時表和redo、undo》


在12C之前:

臨時表的數據塊不會生成redo,因此,臨時表的操作不是可恢復的。不過臨時表會生成undo,而且這個undo會計入日志,因此,臨時表也會生成一些redo;臨時表可以有約束,也可以這么說:正常表有的一切臨時表都可以有;


臨時表的DML操作,有如下特點:

1、insert會生成很少甚至不生成undo  redo

2、臨時表的update會生成永久表update大約一半的redo

3、delete在臨時表上生成的redo與永久表上生成的redo同樣多;

(臨時表delete會生成很多redo,所以要避免進行delete操作,可以truncate;可以使用臨時表進行insert和select操作)


在12C之后:

從Oracle12C起,我們可以通過設置temp_undo_enabled來將臨時表的undo放在臨時表空間中,由于臨時表空間的任何數據變更都不會生成redo,所以當這個參數設置為TRUE時,任何臨時表上的DML都會生產很少甚至不會產生redo;

(temp_undo_enabled的默認值是FALSE,如果將其改為TRUE的話,那臨時表生成的redo量與12C版本之前是一樣的)


ORA-01555: snapshot too old: -----這個錯誤是非常典型的錯誤:(它算的上是一個安全的錯誤,唯一的影響就是收到這個錯誤的查詢無法繼續處理)

產生這個錯誤的原因:

1、undo段太小,不足以支撐系統上執行的工作

2、程序夸commit獲取數據

3、塊清除

4、commit提交太頻繁


解決的方法參考:

1、適當的設置參數undo_retention(要大于運行時間最長的事務所需的時間),我們可以通過v$undostat 來確定長時查詢的持續時間,另外,請在磁盤上預留足夠的空間,因為為了確保undo_retention,undo段可能也會有所增長;

2、使用手動undo管理時加大或增加更多的undo段,(不建議采用這種方法,強烈建議采用自動undo管理方式)

3、減少查詢的運行時間(調優)。調優sql語句、

4、收集相關對象的統計信息。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大连市| 渝中区| 太保市| 普格县| 泽库县| 小金县| 张北县| 隆子县| 闵行区| 六枝特区| 仪征市| 美姑县| 东丰县| 大足县| 循化| 潜江市| 威远县| 乌鲁木齐市| 若尔盖县| 辽阳市| 洮南市| 望江县| 宁德市| 东安县| 云和县| 汽车| 禄劝| 蒲江县| 南召县| 藁城市| 仁布县| 如皋市| 岐山县| 天长市| 昌宁县| 桦甸市| 丽江市| 奎屯市| 集安市| 义马市| 富顺县|