以下信息整理于网络:
UNDO主要用于以下方面:
1.在执行rollback语句的时候rollback事物
2.恢复数据库
3.提供读一致性
4.为oracle flashback query提供支持
5.使用oracle flashback特性恢复数据库逻辑失败
一般来讲事物的undo信息存储在回滚段中,事物的undo信息一直存在,直到一个commit或者rollback语句执行。自动回滚段管理允许DBA指定oracle数据库保留多久的commit之后的undo信息。防止在长时间的查询产生ora-01555:snapshot too old.通过设置UNDO_RETENTION参数来达到这个目的,默认是900s(15min).可以设置这个参数保证数据库保留undo日志的时间.设置UNDO_MANAGEMENT = AUTO参数就可以设置自动管理回滚段特性。
undo段中的区有以下三种状态:
Unexpired Extents – Undo data whose age is less than the undo retention period.
Expired Extents – Undo data whose age is greater than the undo retention period.
Active Extents – Undo data that is part of the active transaction.
以下介绍oracle是怎么利用undo回滚段的:
第一步.当需要回滚段的时候,一个undo信息需要被写入到回滚段中。如果当前使用区已经不足,并且下一个区是expired状态,优先使用expired状态的区,而不是从空闲区间池中产生一个空闲的区间。
第二步.如果第一步由于没有可用的区间而失败,并且undo数据文件不是自动扩展的。则oracle试图去利用另一个回滚段的expired状态区间。
第三步.如果第二步由于其他回滚段没有expired状态的区间,则oracle试图去利用当前回滚段的unexpired区间
第四步.如果第三步仍然失败,则oracle视图利用另一个回滚段的unexpired状态区间
第五步.如果以上全部失败,则an Out-Of-Space error 就会产生。
以下实验:
SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;
TABLESPACE_NAME STATUS GB
------------------------------ --------- ----------
UNDOTBS1 UNEXPIRED .010742188
UNDOTBS1 EXPIRED .015014648
SQL> update t1 set name='eeeee' where id=5;
SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;
TABLESPACE_NAME STATUS GB
------------------------------ --------- ----------
UNDOTBS1 UNEXPIRED .009765625
UNDOTBS1 EXPIRED .015014648
UNDOTBS1 ACTIVE .000976563
UNDO主要用于以下方面:
1.在执行rollback语句的时候rollback事物
2.恢复数据库
3.提供读一致性
4.为oracle flashback query提供支持
5.使用oracle flashback特性恢复数据库逻辑失败
一般来讲事物的undo信息存储在回滚段中,事物的undo信息一直存在,直到一个commit或者rollback语句执行。自动回滚段管理允许DBA指定oracle数据库保留多久的commit之后的undo信息。防止在长时间的查询产生ora-01555:snapshot too old.通过设置UNDO_RETENTION参数来达到这个目的,默认是900s(15min).可以设置这个参数保证数据库保留undo日志的时间.设置UNDO_MANAGEMENT = AUTO参数就可以设置自动管理回滚段特性。
undo段中的区有以下三种状态:
Unexpired Extents – Undo data whose age is less than the undo retention period.
Expired Extents – Undo data whose age is greater than the undo retention period.
Active Extents – Undo data that is part of the active transaction.
以下介绍oracle是怎么利用undo回滚段的:
第一步.当需要回滚段的时候,一个undo信息需要被写入到回滚段中。如果当前使用区已经不足,并且下一个区是expired状态,优先使用expired状态的区,而不是从空闲区间池中产生一个空闲的区间。
第二步.如果第一步由于没有可用的区间而失败,并且undo数据文件不是自动扩展的。则oracle试图去利用另一个回滚段的expired状态区间。
第三步.如果第二步由于其他回滚段没有expired状态的区间,则oracle试图去利用当前回滚段的unexpired区间
第四步.如果第三步仍然失败,则oracle视图利用另一个回滚段的unexpired状态区间
第五步.如果以上全部失败,则an Out-Of-Space error 就会产生。
以下实验:
SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;
TABLESPACE_NAME STATUS GB
------------------------------ --------- ----------
UNDOTBS1 UNEXPIRED .010742188
UNDOTBS1 EXPIRED .015014648
SQL> update t1 set name='eeeee' where id=5;
SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;
TABLESPACE_NAME STATUS GB
------------------------------ --------- ----------
UNDOTBS1 UNEXPIRED .009765625
UNDOTBS1 EXPIRED .015014648
UNDOTBS1 ACTIVE .000976563
Undo Blocks per Second
1
2
3
|
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
"UNDO_BLOCK_PER_SEC"
FROM v$undostat;
|
Optimal Undo Retention
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
209'715'200 / (3.12166667 * 4'096) = 16'401 [Sec]
Using Inline Views, you can do all in one query!
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec))) "OPTIMAL UNDO RETENTION [Sec]"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
AND f.name = 'db_block_size'
|
Calculate Needed UNDO Size for given Database Activity
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024)
"NEEDED UNDO SIZE [MByte]"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
AND f.name = 'db_block_size'
|
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30291162/viewspace-1723963/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30291162/viewspace-1723963/