管理undo
管理undo
1 undo作用
undo数据是:
- 原始的、修改之前的数据副本
- 是针对更改数据的每个事务处理所捕获的·至少保留到事务处理结束
- 用于支持:
- 回退操作
- 读取一致性查询
- 闪回查询、闪回事务处理和闪回表一从失败的事务处理中进行恢复
UNDO提供以下四种情况所需要的信息
- 回滚事务:rollback
- 读一致性:正在做DML操作的数据块,事务结束前,其他用户读undo里面的数据前镜像
- 实例的恢复:instance recover(undo -->rollback)
- 闪回技术:flashback query、flashback table等
1.1 事务的属性
ACID
原子性:一个事务的所有部分必须都完成, 或者都不完成
一致性:查询的结果必须与数据库在查询开始时的状态一致
隔离性:除了作出变更的会话,其他会话都无法看到未提交的数据
持久性:事务一旦完成,不可丢失
2 Undo和Redo对比
2.1 update语句执行逻辑流程redo undo信息
3 Undo的参数
3.1 三个基本参数
show parameter undo
- undo_managementundo_retention 指定保留期单位秒,希望在这个期间commit的undo数据不要覆盖
- manaual 仅在维护时使用
- auto 使用undo tablespace管理undo
- undo_tablespace 当前使用的Undo表空间
3.2 建立一个undo表空间
可以建立多个undo表空间,但只有一个是使用中的undo
使用中的undo tablespace不能offline和drop
查看当前undo表空间
show parameter undo_tablespace
看表空间对应数据文件
col file_name for a60
select tablespace_name,file_name from dba_data_files;
select tablespace_name,contents from dba_tablespaces;
建立一个新的undo表空间
create undo tablespace UNDOTBS2 datafile '/u01/app/oracle/oradata/ORCL/undotbs02.dbf' size 50M autoextend on;
查看当前正在使用的undo段(回滚段)
select * from v$rollname;
3.3 切换undo
und 表空间很难缩小,但是可以替换
alter system set undo_tablespace=undotbs2; --动态参数,修改立即生效
show parameter undo_tablespace;
select * from v$rollname;
查看undo段中区的状态:select segment_name,tablespace_name,status from dba_undo_extents order by status;
彻底删除undotbs1表空间
drop tablespace undotbs1 including contents and datafiles;
删除未激活undo时要慎重操作,之前的undotbs1可能仍然在使用
即使没有事务用之前的undotbs1,可能有查询语句用到unexpired状态的undo数据
4 Undo空间重用机制3种状态
undo段中区的状态:
① active:表示 transaction(事务) 还没有 commit,不可覆盖
② unexpired:由已经commit数据转换而来的状态,在保留期内,尽量不覆盖(非强制)
③ expired:由unexpired转换而来,其中的数据是超过undo保留期的,随时可以再分配(覆盖)
undo的状态转换体现了undo空间的循环使用:
分配---》 冻结--->回收---》 再分配
5 关于AUM(Auto Undo Management)
5.1 Auto Undo Management
Oracle10gR2以后引入了一个新的自动调整undo retention的特性,目的是尽量避免两个Undo错误:
- ora-30036 错误---空间不足
- ora-01555 错误---快照太旧
11g缺省设置为AUM(Auto Undo Management)
AUM下current undo retention是自动调整的
select begin_time,tuned_undoretention from v$undostat;
5.2 AUM的两种工作方式
① autoextend off下,忽略undo_retention 参数,TUNED_UNDORETENTION参照undo表空间大小和undo统计信息
缺点:空间给定不合理时,产生UNDO告警,不能完全避免ora-30036,ora-01555,若UNDO增加尺寸,又可能造成TUNED_UNDORETENTION增加
② autoextend on下,参考undo_retention作为下限值,TUNED_UNDORETENTION期内,以扩展空间代替覆盖unexpired,基本避免了ora-30036,ora-01555
select file_name,tablespace_name,AUTOEXTENSIBLE from dba_data_files;
5.3 Undo表空间的retention guarantee属性
通常情况下,unexpired数据并不绝对保证在retention期内不会覆盖,必要时可考虑设置在保留期强制不覆盖的guarantee属性,同时应该使undo autoextend on
select tablespace_name,status,contents,retention from dba_tablespaces;
缺省配置下undo retention是noguarantee (guarantee属性慎重使用)
guarantee属性可以修改
alter tablespace undotbs2 retention guarantee;
保证unexpired状态undo数据在retention期间不被覆盖
select tablespace_name,status,contents,retention from dba_tablespaces;
取消undo表空间guarantee属性
alter tablespace undotbs2 retention noguarantee;
6 undo信息的查询
dba_undo_extents 查看undo段中不同状态区的空间占用
7 12C Temporary Undo
临时表被广泛的用于存放中间结果。因为写这些表要快,没有redo。然而临时表中的操作对应的UNDO还是要记录redo的,在临时表对象的生命周期内,对读一致性和事务回滚都是有用的。对于实例来说,事务恢复会丢弃临时对象的undo。从12C开始,可以将临时表的事务生成的Undo信息直接存放在临时表空间独立存在,避免将undo存放到redo。这个模式称为临时Undo。
注:临时Undo段是会话私有的,它存放会话对应的临时表生成的Undo信息
使用临时undo提供了如下功能:
临时Undo减少了Undo表空间的数据,更少的Undo记录可以更好的满足保留时长要求。性能也被改善,因为更少的数据被写入到redo log,例如日志挖掘对更少的redo数据解析。在ADG的物理备库对临时表的DML操作使用临时undo,然而DDL操作必须在主库中创建临时表。
可以在会话级别启用临时undo,也可以在整个数据库级别启用。当通过ALTER SESSION命令启用会话级别时,会话创建临时undo不会影响到其它会话。当通过ALTER SYSTEM命令启用数据库级别时,所有已存在的会话和新会话也会创建临时undo。
如果对会话开启了临时undo之后,会话正在使用临时对象,当前会话是不能禁用临时undo的。同样,如果临时undo在会话中禁用并且会话使用临时对象,当前会话不能启用临时Undo。注:临时undo特性在数据库中的兼容性至少为12.1.0.0时生效。在ADG的物理备库中临时undo默认是开启的。因为这个特性TEMP_UNDO_ENABLED参数不会影响ADG中的物理备库。
VSTEMPUNDOSTAT展示了数据库实例中和临时undo日志相关的多种统计信息。显示了和系统如何工作运行的柱状图统计信息。每隔10分钟视图会收集统计信息。BEGIN_TIME列的值是按照降序显示的,这个视图包含总共576行,跨越4天记录。这个视图和vSUNDOSTAT视图相似。
VSTEMPUNDOSTAT视图重要列的信息:
BEGIN_TIME:Identifies the beginning of the time intervalTXNCOUNT:对应时间内和临时undo 段相关的总共的事务数
MAXCONCURRENCY:在对应时间内,临时对象相关执行并发最多的事务数UNDOBLKCNT:对应时间内,临时undo块的总数
UsCOUNT:对应时间内,临时undo段的个数
NOSPACEERRCNT:对应时间内,临时undo空间不足错误次数