http://407882.blog.51cto.com/397882/107420
1.undo_retention值越大,需要的undo表空間越大
undo_retention值表示一個undo數據塊最久能在undo表空間中停留的時間,單位是秒,缺省值爲900。(問:如果已經超過了這個時間,而事務還麼有提交,此時該undo數據塊可以被覆蓋嗎?)
undo表空間資源是循環使用的,在undo_retention時間內,undo數據塊的內容是不會被釋放掉,也即不會被新的undo數據覆蓋。所以設置停留時間越久,undo表空間就越大。
undo表空間資源是循環使用的,在undo_retention時間內,undo數據塊的內容是不會被釋放掉,也即不會被新的undo數據覆蓋。所以設置停留時間越久,undo表空間就越大。
2.工作量很大,業務量大,事務很多時,每秒鐘所產生undo數據塊的個數越多,需要的undo表空間越大。
3.和db_block_size的大小有關
select begin_time,end_time,undoblks
from v$undostat;
BEGIN_TIME END_TEME UNDOBLKS
------------------ ------------------- ----------
28-SEP-O8 13:43:02 28-SEP-O8 13:44:18 19
28-SEP-O8 13:33:02 28-SEP-O8 13:43:18 1474
28-SEP-O8 13:23:02 28-SEP-O8 13:33:18 1347
28-SEP-O8 13:13:02 28-SEP-O8 13:23:18 16 28
此語句記錄了undo數據塊的歷史使用情況,每隔10分鐘刷一次。此結果表示記錄前40分鐘分別用到undo數據塊19個、1474個、1347個、1628個;
from v$undostat;
BEGIN_TIME END_TEME UNDOBLKS
------------------ ------------------- ----------
28-SEP-O8 13:43:02 28-SEP-O8 13:44:18 19
28-SEP-O8 13:33:02 28-SEP-O8 13:43:18 1474
28-SEP-O8 13:23:02 28-SEP-O8 13:33:18 1347
28-SEP-O8 13:13:02 28-SEP-O8 13:23:18 16 28
此語句記錄了undo數據塊的歷史使用情況,每隔10分鐘刷一次。此結果表示記錄前40分鐘分別用到undo數據塊19個、1474個、1347個、1628個;
select addr,used_ublk
from v$transaction;
ADDR USED_UBLK
--------- --------------
5932F4A0 863
from v$transaction;
ADDR USED_UBLK
--------- --------------
5932F4A0 863
此語句可以查看當前事務所需要數據塊的個數,此結果表示,當前用戶只有一個事務正在執行,此事務需要863個undo數據塊。
事務越多,操作影響數據越多,需要的undo數據塊也越多。
如何計算所需undo表空間的大小:
1.計算業務高峯期每秒產生undo數據塊的個數:
SQL> select max(undoblks / ((end_time - begin_time)*24*3600))
SQL> from undostat;
1.計算業務高峯期每秒產生undo數據塊的個數:
SQL> select max(undoblks / ((end_time - begin_time)*24*3600))
SQL> from undostat;
2.得到undo數據塊在undo表空間中可以保留的最長時間
show parameter undo_retention
show parameter undo_retention
3.得到數據塊大小
show parameter db_block;
show parameter db_block;
4.將以上三者的數據相乘就是所需undo表空間的大小數。
發現undo表空間不夠的時候,趕緊增加undo表空間的大小,執行語句如下:
alter tablespace undotbs
add datafile '/u01/oradata/undotbs2.dbf' size 700M
autoextend on;
alter tablespace undotbs
add datafile '/u01/oradata/undotbs2.dbf' size 700M
autoextend on;
ORA-01555
查詢失敗,其他事務產生的undo數據覆蓋了undo表空間中查詢需要的old數據塊。
查詢失敗,其他事務產生的undo數據覆蓋了undo表空間中查詢需要的old數據塊。
---------------------------------------------------------------------------------------------------------------------
刪除undo tablespace實驗:
SQL> create undo tablespace undotbs2
2 datafile '/opt/oradata/oradata/orcl/undotbs02.dbf' SIZE 100m
3 autoextend off;
Tablespace created.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS2
SQL> select segment_name ,tablespace_name ,segment_id from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME SEGMENT_ID
------------------------------ ------------------------------ ----------
SYSTEM SYSTEM 0
_SYSSMU1$ UNDOTBS1 1
_SYSSMU2$ UNDOTBS1 2
_SYSSMU3$ UNDOTBS1 3
_SYSSMU4$ UNDOTBS1 4
_SYSSMU5$ UNDOTBS1 5
_SYSSMU6$ UNDOTBS1 6
_SYSSMU7$ UNDOTBS1 7
_SYSSMU8$ UNDOTBS1 8
_SYSSMU9$ UNDOTBS1 9
_SYSSMU10$ UNDOTBS1 10
SEGMENT_NAME TABLESPACE_NAME SEGMENT_ID
------------------------------ ------------------------------ ----------
_SYSSMU11$ UNDOTBS2 11
_SYSSMU12$ UNDOTBS2 12
_SYSSMU13$ UNDOTBS2 13
_SYSSMU14$ UNDOTBS2 14
_SYSSMU15$ UNDOTBS2 15
_SYSSMU16$ UNDOTBS2 16
_SYSSMU17$ UNDOTBS2 17
_SYSSMU18$ UNDOTBS2 18
_SYSSMU19$ UNDOTBS2 19
_SYSSMU20$ UNDOTBS2 20
21 rows selected.
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
10 PENDING OFFLINE 1
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
USN STATUS XACTS
------------- --------------- -------------
20 ONLINE 0
12 rows selected.
發現原UNDOTBS1的回滾段處於PENDING OFFLINE狀態,並有一個事物存在,需要等到事務完成後,才能drop UNDOTBS1
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
10 PENDING OFFLINE 0
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
USN STATUS XACTS
------------- --------------- -------------
Tablespace created.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS2
SQL> select segment_name ,tablespace_name ,segment_id from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME SEGMENT_ID
------------------------------ ------------------------------ ----------
SYSTEM SYSTEM 0
_SYSSMU1$ UNDOTBS1 1
_SYSSMU2$ UNDOTBS1 2
_SYSSMU3$ UNDOTBS1 3
_SYSSMU4$ UNDOTBS1 4
_SYSSMU5$ UNDOTBS1 5
_SYSSMU6$ UNDOTBS1 6
_SYSSMU7$ UNDOTBS1 7
_SYSSMU8$ UNDOTBS1 8
_SYSSMU9$ UNDOTBS1 9
_SYSSMU10$ UNDOTBS1 10
SEGMENT_NAME TABLESPACE_NAME SEGMENT_ID
------------------------------ ------------------------------ ----------
_SYSSMU11$ UNDOTBS2 11
_SYSSMU12$ UNDOTBS2 12
_SYSSMU13$ UNDOTBS2 13
_SYSSMU14$ UNDOTBS2 14
_SYSSMU15$ UNDOTBS2 15
_SYSSMU16$ UNDOTBS2 16
_SYSSMU17$ UNDOTBS2 17
_SYSSMU18$ UNDOTBS2 18
_SYSSMU19$ UNDOTBS2 19
_SYSSMU20$ UNDOTBS2 20
21 rows selected.
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
10 PENDING OFFLINE 1
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
USN STATUS XACTS
------------- --------------- -------------
20 ONLINE 0
12 rows selected.
發現原UNDOTBS1的回滾段處於PENDING OFFLINE狀態,並有一個事物存在,需要等到事務完成後,才能drop UNDOTBS1
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
10 PENDING OFFLINE 0
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
USN STATUS XACTS
------------- --------------- -------------
20 ONLINE 0
12 rows selected.
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
20 ONLINE 0
11 rows selected.
SQL> drop tablespace undotbs1 including contents and datafiles;
Tablespace dropped.
SQL>
12 rows selected.
SQL> select usn,status,xacts from v$rollstat;
USN STATUS XACTS
------------- --------------- -------------
0 ONLINE 0
11 ONLINE 0
12 ONLINE 0
13 ONLINE 0
14 ONLINE 0
15 ONLINE 0
16 ONLINE 0
17 ONLINE 0
18 ONLINE 0
19 ONLINE 1
20 ONLINE 0
11 rows selected.
SQL> drop tablespace undotbs1 including contents and datafiles;
Tablespace dropped.
SQL>