Oracle 1Z031第十章 管理重做数据

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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值