oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...
在12C版本,為了減少UNDO表空間的使用率及減少REDO和歸檔日志的產生量,ORACLE推出了臨時UNDO段(Temporary Undo Segments)新特性。這個新特性把臨時表產生的UNDO信息從UNDO表空間挪到了臨時表空間,這樣就減少了UNDO表空間的使用。臨時表的DML操作不會產生REDO日志,但是UNDO表空間的數據會寫入REDO日志中,這樣將臨時表產生的UNDO數據從UNDO表空間挪到臨時表空間,就不會把臨時表產生的UNDO信息寫入REDO日志中,這樣就減少了REDO日志的產生量,也就減少了歸檔日志的生成量。
ORACLE通過temp_undo_enabled參數來控制臨時UNDO段新特性的啟用,默認是FALSE關閉狀態。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ----------
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
下面測試一下在啟用和禁用臨時UNDO段特性時,產生的REDO信息對比,先創建測試表。
SQL> create global temporary table t_test_temp as select * from T_TEST where 1=2;
Table created.
重新打開一個會話,查詢當前產生的REDO信息。
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 4
redo size 1324
在默認情況下也就是禁用臨時UNDO段特性的情況下,向一張臨時表插入數據。
SQL> insert into t_test_temp select * from t_test;
6136934 rows created.
再次查看這個會話的REDO產生量。
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 60964
redo size 21357176
可見,在禁用臨時UNDO段特性的情況下,向臨時表中插入數據會產生很多的REDO數據,這是因為臨時表產生的UNDO數據當前保存在UNDO表空間中,而UNDO表空間的數據也會寫入到REDO日志。
下面在開一個新會話,并且啟用臨時UNDO段特性。
SQL> alter session set temp_undo_enabled=true;
Session altered.
查看這個會話的當前REDO產生量。
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 2
redo size 744
然后向臨時表中插入同樣的數據。
SQL> insert into t_test_temp select * from t_test;
6136934 rows created.
再次查看這個會話的REDO產生量。
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 3
redo size 1024
可見,在啟用臨時UNDO段的情況下,對臨時表進行插入操作,REDO的產生非常少,這些應該都是數據字典變更產生的REDO。
大家應該知道,COMMIT和ROLLBACK操作是一個事務的終止,COMMIT操作只是打個標記,并不會修改數據,而ROLLBACK操作,是要根據UNDO數據去還原數據的,也就是ROLLBACK操作會修改數據,那么就意味著ROLLBACK操作是會產生REDO和UNDO的,如果是臨時表的ROLLBACK操作,因為臨時表本身不產生REDO,但是會產生UNDO。
下面分別對上面測試的兩個會話進行ROLLBACK操作,再看一下REDO的產生量。
禁用臨時UNDO段的情況下回滾后REDO產生量:
SQL> rollback;
Rollback complete.
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 121794
redo size 27432588
回滾禁用臨時UNDO段的情況下的INSERT操作產生的REDO,基本上等于插入時的REDO產生量。
在看一下啟用臨時UNDO段的情況下回滾后REDO產生量:
SQL> rollback;
Rollback complete.
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 4
redo size 1156
回滾啟用臨時UNDO段的情況下的INSERT操作產生的REDO,基本上不產生REDO。這是因為臨時表的DML操作本身就不生成REDO,而臨時表的UNDO數據被保存到的臨時表空間,臨時表空間的數據也不會寫入REDO文件。
本實驗只是模擬了INSERT操作,有較真的朋友可以測試下DELETE和UPDATE操作。
最后再吐一下槽,貌似這個功能啟用之后,在這個會話中并不能關閉,我的測試數據庫版本是12.2.0.1.0版本,下面是測試過程。
[oracle@hm-oradb-01 ~]$ sqlplus dbdream/dbdream@localhost/pdb1
SQL*Plus: Release 12.2.0.1.0 Production on Thu Aug 30 12:27:34 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Last Successful login time: Thu Aug 30 2018 10:46:41 +08:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> alter session set temp_undo_enabled=true;
Session altered.
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 2
redo size 744
SQL> insert into t_test_temp select * from t_test;
6136934 rows created.
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 3
redo size 1024
SQL> insert into t_test_temp select * from t_test;
6136934 rows created.
SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 5
redo size 1436
在啟用臨時UNDO段的會話中,禁用臨時UNDO段之后,這個禁用操作明顯沒有生效。
總結
以上是生活随笔為你收集整理的oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php获取url文件大小,PHP通过UR
- 下一篇: matlab 计算误码率,关于误码率的问