1Z031
第十章
管理重做数据
Managing Undo Data
管理重做数据
Objectives
目标
描述重做数据的目的
实现自动重做管理
创建和配置重做段
从数据字典中获取重做段的信息
Managing Undo Data Overview
管理重做数据概述
存在
2
种管理管理重做数据的方法
自动重做管理
手工重做管理
这章讨论自动重做管理
在这里的
UNDO
替代
Oracle
以前版本中的回滚(
rollback
)
Automatic Undo Management
自动重做管理
Oracle
服务器自动管理重做段的创建、分配、和调整。
Manual Undo Management
手工管理重做
手工管理重做段的创建、分配、调整。这是
Oracle9I
之前的唯一方法。手工管理重做的信息可以见附件
手工管理重做数据。
Undo Segment
重做段
重做段是在程序改变数据库中的数据时保存旧值。它存储数据的地址和数据被改变前的值。
重做段的头部包含一个事务表在那里存放当时是用重做段的事务。
一系列的事务只是是用一个重做段存放所有的重做数据。
多个并发的事务可以向一个重做段中写。
Undo Segments: Purpose
重做段:目的
Transaction rollback
Transaction recovery
Read consistency
事务回滚
事务恢复
读一致
Transaction Rollback
当一个事务改变表中的行时,被改变字段的旧图像(重做数据)保存在重做段中。如果这个事务回滚,
Oracle
服务器把原来的值重新写到该行中。
Transaction Recovery
事务恢复
当事务运行时实例失败,
Oracle
服务器在打开的时候需要重做所有没有提交的改变。这种会滚是事务恢复的一部分。恢复可用只是因为对重做段的改变同样改变重做日志文件。
Read Consistency
读一致
当事务运行时,数据库中的其他用不能看到任何事务没有提交的改变。甚至,一个语句在运行后,不可以看到任何提交了的数据改变。重做段中的旧的值(重做数据)同时也作为给定语句的一个读一致性的影像。
Oracle
服务器保证语句在一个一致的时间看数据,甚至在数据被其他的事务改变。
当
Oracle
服务器运行
SELECT
语句的时候,
它决定当前的系统改变数(
SCN
)并确定当前的语句不运行任何在这个
SCN
前改变尚未提交的数据。假设在这种情况下一个查询长时间运行时数据库发生了几个改变。如果一个行在查询运行前改变没有提交,
Oracle
服务器通过读重做段中改变的以前的影像并将改变应用到行在内存中的
COPY
上,建立一个这行的读一致影像。
Transaction Read Consistency
事务的读一致性
SQL
语句始终读一致。但是你可以为事务申请一个只读的读一致通过再过程的开始部分运行下属命令:
SET TRANSACTION READ ONLY;
或者,你可以为事务运行
DML
申请读一致性通过在事务的开始部分运行下述命令:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
任何一种方式,
Oracle
服务器都会在事务的开始提供读一致性,使用
serializable
对性能有负面影响。
Types of Undo Segments
重做段的类型
SYSTEM
Undo Segment
系统重做段,在创建
SYSTEM
表空间时创建。这个重做段只能用于
SYSTEM
表空间中对象的改变。
SYSTEM
重做段可以在手工和自动管理模式下运行。
Non-
SYSTEM
Undo Segments
非系统重做段
数据库拥有多个表空间时需要至少一个非系统的手工模式重做段或者自动模式的重做表空间。
Manual Mode
手工模式
数据库管理员创建的在手工模式下,一个非系统重做段,可以用于任何非系统标空间对象的改变。有
2
种非系统重做段。
Private
私有
私有的重做段是由实例连接上线因为他们在参数文件中列出。但是,他们也可以显式的通过命令连接上线:
ALTER ROLLBACK SEGMENT
Public
公有
公有的重做段在数据库重做段池中。公有的重做段通常同
Oracle
并行服务器一起创建为一个池供任何并行服务器使用。
Deferred Undo Segments
延迟重做段
延迟重做段是在表空间离线是可能创建。他们用于回滚事务当表空间上线时。他们在不需要使用的时候自动删除。
Automatic Undo Management:
Concepts
重做数据由重做表空间管理
为每个实例分配一个足够实例使用空间的重做表空间
Oracle
服务器自动的管理重做表空间中的重做数据
自动重做段的名字约定如下:
_SYSSMUn$
例如:
_SYSSMU1$
_SYSSMU2$
Automatic Undo Management:
Configuration
自动重做管理:配置
在初始化参数文件中配置
2
个参数:
UNDO_MANAGEMENT
UNDO_TABLESPACE
至少创建一个重做表空间。
如果只有一个重做表空间,并且
UNDO_MANAGEMENT
设置为
AUTO,
那么
UNDO_TABLESPACE
参数可选
;
那么
Oracle
服务器会自动选取重做表空间。
Automatic Undo Management:
Initialization Parameters
自动重做管理:初始化参数
UNDO_MANAGEMENT
:标明系统使用
AUTO
还是
MANUAL
模式。
UNDO_TABLESPACE
:标明特定的重做表空间可以使用。
UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=UNDOTBS
UNDO_MANAGEMENT
这个参数决定数据库重做的模式。这个参数可以设置为
AUTO
和
MANUAL
中的一个。并且必须在初始化参数文件中设置。
UNDO_MANAGEMENT
不能在数据库启动后动态改变。
AUTO
模式设置数据库自动重做管理并且需要一个
UNDO
表空间。在默认的
MANUAL
模式下,
你可以在以前的
Oracle
版本中在需要的时候在数据库中创建管理重做段。
UNDO_TABLESPACE
标明使用哪个重做表空间。这个参数可以在初始化参数文件中设置也可以通过
ALTER SYSTEM
命令动态改变。
ALTER SYSTEM SET undo_tablespace = UNDOTBS;
Automatic Undo Management:
UNDO
Tablespace
重做表空间
你可以在创建数据库的同时创建重做表空间通过在
CREATE DATABASE
命令中增加子句
CREATE DATABASE db01
. . .
UNDO TABLESPACE undo1 DATAFILE 'undo1db01.dbf'
SIZE 20M AUTOEXTEND ON
或者稍后通过
CREATE UNDO TABLESPACE
命令创建
CREATE UNDO TABLESPACE undo1
DATAFILE 'undo1db01.dbf' SIZE 20M;
自动重做管理需要一个重做表空间。数据库中可以存在超过一个的重做表空间,但是只有一个是活动的。
如果创建数据库的时候,
UNDO_MANAGEMENT
参数设置为
AUTO
而且在
CREATE DATABASE
命令中忽略
UNDO
表空间子句,那么
ORACLE
服务器创建名字为
SYS_UNDOTBS
的重做表空间。默认的
SYS_UNDOTBS
表空间的数据文件名为
'dbu1
<oracle_sid>
.dbf'
位于
$ORACLE_HOME/dbs
目录下。大小根据操作系统不同而不同,并且
AUTOEXTEND
设置为
ON
。
Automatic Undo Management:
Altering an
UNDO
Tablespace
改变
UNDO
表空间
ALTER TABLESPACE
命令可以用于改变
UNDO
表空间。
下面的例子增加一个数据文件到
UNDO
表空间:
ALTER TABLESPACE undotbs
ADD DATAFILE 'undotbs2.dbf' SIZE 30M
AUTOEXTEND ON;
下属的子句是
UNDO
表空间支持的
ALTER TABLESAPCE
命令的子句:
• ADD DATAFILE
• RENAME
• DATAFILE [ONLINE|OFFLINE]
• BEGIN BACKUP
• END BACKUP
Automatic Undo Management:
Switching
UNDO
Tablespaces
切换重做表空间
你可以从一个重做表空间切换到其他的表空间。
在同一时刻只能有一个表空间分配给一个实例。
一个实例中可以存在多个重做表空间但是只能有一个是活动的。
用
ALTER SYSTEM
命令在重做表空间之间动态切换
ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;
Automatic Undo Management:
Dropping an
UNDO
Tablespace
删除重做表空间
使用
DROP
表空间命令删除重做表空间。
DROP TABLESPACE UNDOTBS2;
一个重做表空间只有在没有被任何一个实例使用的情况下才可以被删除。
删除一个活动的重做表空间
切换到一个新的重做表空间
在所有的事务结束后删除表空间
使用下面的查询可以知道是否有活动的事务在重做表空间中
SQL> SELECT a.name,b.status
2> FROM v$rollname a, v$rollstat b
3> WHERE a.name IN ( SELECT segment_name
4> FROM dba_segments
5> WHERE tablespace_name = 'UNDOTBS'
6> )
7> AND a.usn = b.usn;
如果这个查询不返回任何行,那么所有的事务结束了,这个表空间可以删除了。
Oracle
服务器有可能在切换
UNDOTBS
到其他的重做表空间后仍然引用它,以提供读一致。在这个表空间不能在提供读一致的时候,会收到一个错误
ORA-1555 snapshot too old
.
Automatic Undo Management:
Other Parameters
其他的参数
UNDO_SUPPRESS_ERRORS
设置为
TRUE
,这个参数会抑制在自动模式下企图运行手工操作的错误。例如(
ALTER ROLLBACK SEGMENT ONLINE
)。设置这个参数使用户所有的程序和脚本都转化为自动重做管理模式。例如你有一个工具使用
set transation use rollback segment
语句,你可以通过
alter session set undo_suppress_errors = true
来抑制
ORA_30019
错误。
UNDO_RETENTION
控制保留为读一致的重做数据的量。决定为读一致保留重做数据的时间。保留重做数据越长就会容许更长的查询同时也需要更大的重做表空间的数据文件。
UNDO_RETENTION
参数定义为秒,可以在初始化参数文件中设置或者通过
alter system
命令来修改。
ALTER SYSTEM SET UNDO_RETENTION=900;
在
UNDO_RETENTION
设置的情况下,如果重做表空间太小,重做数据不会保留到
RENTENTION
参数设置的时间那么长。
Oracle
服务器通过一个算法在重做表空间中分配不活动的事务使用的空间避免新的事务失败。
Undo Data Statistics
重做数据统计
SELECT end_time,begin_time,undoblks
FROM v$undostat;
V$UNDOSTAT
这个视图显示历史统计数据来显示系统运行的好坏。这个视图中的每行是每隔
10
分钟从系统中统计的数据。你可以使用这个视图来估计当前工作环境中需要的重做空间的量。数据库用这个试图调整系统中的重做的使用。这个视图在自动可手工模式下都可用。
尽管时间间隔通常为
10
分钟,但是最新的行会返回距离间隔开始时的时间,通常小于
10
分钟。
Automatic Undo Management:
Sizing an
UNDO
Tablespace
调整
UNDO
表空间的大小
决定重做表空间的大小需要三个方面的信息:
(UR)
UNDO_RETENTION
in seconds
(UPS)
每秒重做数据块产生的数量。
(DBS)
消耗变化基于扩展和文件的大小(
db_block_size
)
UndoSpace = [UR * (UPS * DBS)] + (DBS * 24)
上述三个方面的信息
2
个可以从初始化参数文件中得到
UNDO_RETENTION
,
DB_BLOCK_SIZE
。第三个公式化的信息可以通过查询数据库来得到。每秒产生的重做数据块的数量可以通过
V$UNDOSTAT
得到。下面的公式计算总的数据块的数量并除以时间,以秒计算:
SELECT (SUM(undoblks) / SUM( ((end_time - begin_time) * 86400)
FROM v$undostat;
END_TIME
和
BEGIN_TIME
是
DATE
数据类型的。转换天到秒要乘以
86400
。
这个查询的结果返回每秒产生的重做数据块的数量。这个值需要乘以重做块的大小,和数据库块的大小相同由
DB_BLOCK_SIZE
定义。下面的查询计算需要的
byte
数量:
SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
2> FROM (SELECT value AS UR
3> FROM v$parameter
4> WHERE name = 'undo_retention'),
5> (SELECT (SUM(undoblks)/SUM(((end_time -
begin_time)*86400))) AS UPS
6> FROM v$undostat),
7> (SELECT value AS DBS
8> FROM v$parameter
9> WHERE name = 'db_block_size');
把
byte
转换为
MB
除以
1048576
。这个数据库的结果是
18.22 MB
。
为了得到最好的结果,计算应该在数据库最大量的工作情况下进行。
Automatic Undo Management
Undo Quota
重做限额
长时间的事务和不正确书写的事务会大量的消耗资源。
有重做限额的用户可以用组管理起来并且一个最大的重做空间限制可以分配给这个组。
UNDO_POOL
,资源管理器指示定义资源组可以使用的空间数量。
当一个组超过了他的限额,对这个组新的事务部能产生,直到重做空间被当前事务通过提交或者放弃释放掉。
使用资源计划,用户可以组织起来并限制这个组可以使用的资源。组产生的重做数据的量可以通过为
UNDO_POOL
设置值来限制。默认的值是不限制。当一个组超过限制后新事务产生的时候将报错并且这个组没有新的事务可以运行直到当前事务完成或者放弃。
ORA-30027: "Undo quota violation - failed to get %s (bytes)"
Cause: The amount of undo assigned to the consumer group
of this session has been exceeded.
Action: Ask DBA to increase undo quota, or wait until other
transactions commit before proceeding.
Obtaining Undo Segments Information
获取重做段信息
数据字典试图
DBA_ROLLBACK_SEGS
动态性能视图
– V$ROLLNAME
– V$ROLLSTAT
– V$UNDOSTAT
– V$SESSION
– V$TRANSACTION
获取所有的数据库中重做段的信息,查询
DBA_ROLLBACK_SEGS
视图
SQL> SELECT segment_name,owner,tablespace_name,status
2 FROM dba_rollback_segs;
离线的重做段只能在
DBA_ROLLBACK_SEGS
中看到。动态视图中的重做段都是在线的。
V$ROLLSTAT and V$ROLLNAME
连接
V$ROLLSTAT
和
V$ROLLNAME
试图获取当前实例重做段的统计信息
SQL> SELECT n.name, s.extents, s.rssize,s.hwmsize,
2 s.xacts, s.status
3 FROM v$rollname n, v$rollstat s
4 WHERE n.usn = s.usn;
V$TRANSACTION and V$SESSION
查看当前活动事务使用的重做段,连接
V$TRANSACTION
和
V$SESSION
视图
SQL> SELECT s.username, t.xidusn, t.ubafil,
2 t.ubablk, t.used_ublk
3 FROM v$session s, v$transaction t
4 WHERE s.saddr = t.ses_addr;