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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...

發布時間:2024/10/12 windows 81 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) | 信春哥,系统稳,闭眼上线不回滚!...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。