undo表空间
undo表空间
undo表空间的管理,主要包括创建、删除、修改、切换。其中需要注意的是不能在undo表空间创建数据库对象,还有就是只能是单文件或大文件表空间。
创建
创建主要有两种方法,一种是在创建数据库时创建(create database),另一种就是通过create undo tablespace 来创建。如果用第一种方法创建时失败了,必须清理数据文件及修正错误后才能重新尝试创建,第二种方法创建跟普通表空间的创建是一样的,只是参数有所不同而已。
1.在创建数据库时创建
CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf'; --在用SQL语句创建数据库时,通过指定UNDO TABLESPACE参数来创建
2.直接用SQL创建
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON; --创建思路跟普通表空间差不多
删除
删除方法跟普通的表空间一样,需要注意的是只有在没有被任何实例正在使用的情况下才能被删除;如果包含有外部事务的话则会删除失败。
DROP TABLESPACE undotbs_01; --此语句的效果跟普通表空间的删除方法 TABLESPACE...INCLUDING CONTENTS差不多,表空间的所有内容都会被删掉
修改
修改重做表空间的内容和普通的表空间大致相同,包括增加数据文件、重命名数据文件、让数据文件脱机/联机、开始或结束一个开放备份的数据文件、启用或禁用retention guarantee。
切换
通过语句ALTER SYSTEM SET ...可以实现表空间切换(更改实例的undo表空间)。不过需要注意的是,如果所指定的表空间不存在或者所指定的根本不是表空间,也或者是已经被其他实例正在使用,那么都将会出现报错。
另外,这个切换操作它不会等待旧undo表空间里的事务提交才执行;在切换的过程中,如果在旧的undo表空间有等待的事务要执行,旧的undo表空间会进入等待下线模式(PENDING OFFLINE),这种模式下事务可以被执行,但是新的事务都不会存到这个旧的表空间。
在进入待下线模式(PENDING OFFLINE)的undo表空间,既不能被别的实例使用也不能被删除,只有在所有的事物执行完成之后,undo表空间由PENDING OFFLINE模式转到OFFLINE模式时才可被其他实例使用或删除。
ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_02; --指定uodo表空间
ALTER SYSTEM SET UNDO_TABLESPACE = ''; --释放当前undo表空间
UNDO
Oracle数据库的创建和管理过程的信息用来回滚、重做或改变数据库,这些信息组成了事务提交的记录,这些记录就叫做undo。
undo记录可以用作:
1.回滚操作(执行ROLLBACK语句);
2.回复数据库;
3.保证读取的连贯性;
4.通过闪回来分析先前的一个时间点的数据;
undo自动管理
oracle数据库能自动管理undo信息和空间;自动管理在undo表空间管理undo段。undo自动管理是oracle默认的模式,当你使用DBCA创建数据库时undo表空间UNDOTBS1会自动创建,当然你也可以手动创建undo表空间。
当数据库实例启动时,数据库会自动选择第一个可用的undo表空间,如果undo表空间不可用,实例照常启动并选择system表空间,这是不推荐的!
如果数据库有多个undo表空间,你可以通过UNDO_TABLEASPACE参数为数据库实例设置指定的undo表空间。
例:UNDO_TABLESPACE = undotbs_01
如果指定的表空间不存在,startup启动数据库会失败。
数据库也支持manual undo management mode 在这种模式下,不需要undo表空间,通过回滚段管理undo空间。不过,通过回滚段管理空间是一个复杂的操作,Oracle官方强烈推荐自动管理模式。
以下是,undo管理初始化参数的简介:
如果启用了自动管理模式,那么即使初始化文件里的参数设置了手动管理也都将不会生效。
undo保存期
undo保存期就是oracle数据库在覆盖旧的undo信息前能保存的最小的时间,当事务提交后undo数据就不再用于回滚或事物恢复了;然而,对于连续性读取来说,长时间查询可能就用到这些信息来产生旧的镜像数据块,再者,闪回的成功与否也取决于undo信息是否可用;因此,旧的undo信息尽量保存久一点。
旧的undo信息存在的时间比当前保存期要久,那么undo信息就已经过期了,undo信息的空间就会被新的事物覆盖;反之,undo信息就还没过期,仍可用于连续性读取和闪回操作。
Oracle会基于表空间的大小和系统的运行情况自动调整undo保存期的大小,当然你也可以通过UNDO_RETENTION来手动设置undo保存期的大小。
手动设置UNDO_RETENTION对保存期的实际影响有以下:
1.如果undo表空间是固定大小那么UNDO_RETENTION参数将会被忽略,数据库会根据undo表空间大小和数据库的运行情况来决定保存期。
2.当undo表空间启用了AUTOEXTEND时,保存期会跟参数UNDO_RETENTION设置的一致,当空间不足时,表空间会自动扩展;然而,undo表空间设置了MAXSIZE参数,当表空间的大小达到最大值时,数据库可能会开始覆盖未过期的undo信息。
例
ALTER SYSTEM SET UNDO_RETENTION = 2400;
自动调整undo保存期
Oracle数据库能基于undo表空间的配置来自动调整undo保存期。
1.如果undo表空间设置了AUTOEXTEND,数据库会自动调整undo保存期并尽量让它大于当前正在执行的用时最长的查询;但是这个保存期可能还容纳不下一个闪回操作,就可能出现snapshot too old 的错误,这时你就需要手动去干预保存期的大小来使其达到闪回操作的要求,有两种选择:一种是更改UNDO_RETENTION的大小,另一种就是更改undo表空间的大小(使系统用足够的空间去调整保存期大小)
2.如果undo表空间是固定大小,数据库会根据表空间的大小和系统当前的负载情况动态调整保存期的大小,最好的保存时间应该是比当前正在执行的持续时间最长的查询时间长;如果选择修改undo表空间的大小,就应该选择足够大的空间,如果空间不够系统将会出现以下报错:
(1)DML会执行因没有足够的空间去容纳新的事物而失败;
(2)持续时间较长的查询会报snapshot too old错误。
需要注意的是,udno保存期自动调整并不支持大对象(LOBs)。这是因为大对象的undo信息并不是存储在undo表空间,而是存在它们自己的段里了。对于大对象(LOBs),数据库会通过UNDO_RETENTION来尽量满足它的要求;然而,如果空间太小,未过期的大对象(LOBs)可能会被覆盖掉。
保存期保证(Retention Guarantee)
可以通过设置Retention Guarantee来保证持久查询和闪回的成功执行。
如果设置了Retention Guarantee,指定的最小保存期会得到保证,也就是说数据库不会去覆盖那些未过期的undo数据(包括那些因空间不够而未能成功执行的事务)。
如果没有设置Retention Guarantee,当空间不够用时数据库会把未过期的undo数据覆盖掉,Oracle默认是禁用保存期保证的。
需要注意的是,启用Retention Guarantee会导致多DML执行失败。所以一定要小心使用这个选项。
设置方法有以下几种:
1.通过在CREATE DATABASE或CREATE UNDO TABLESPACE时添加参数RETENTION GUARANTEE;
2.通过ALTER TABLESPACE添加RETENTION NOGUARNATEE参数。
可以查看视图DBA_TABLESPACES里的RETENTION列,GUARANTEE, NOGUARANTEE, or NOT APPLY, NOT APPLY是用于表空间的不是undo表空间。
undo保存期调整和警告阈值
对于一个固定大小的undo表空间,数据库会根据undo表空间的大小以及剩余空间来调整保存期。数据库undo保存期是基于百分之八十五的undo表空间大小或者是空间的使用情况警告阈值来调整的,空间使用警告阈值默认是百分之八十五(你可以改变它的大小)。
可以通过是同V$UNDOSTAT的TUNED_UNDORETENTION列来查看当前保存期的情况。视图的每一列的数值是每隔十分钟统计过去四天的数值。
例:
select to_char(begin_time, 'DD-MON-RR HH24:MI') begin_time,
to_char(end_time, 'DD-MON-RR HH24:MI') end_time, tuned_undoretention
from v$undostat order by end_time;
undo表空间的更多相关文章
- 如何删除回滚段状态为NEEDS RECOVERY的undo表空间
环境:RHEL 6.4 + Oracle 11.2.0.4 背景:备份恢复的测试库在一次不完全恢复后,没有来及做有效的全备,又一次数据库故障导致数据库无法正常open. 只能离线部分数据文件打开数据库 ...
- 记一次ORACLE的UNDO表空间爆满分析过程
这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...
- Oracle 11gR2 Database UNDO表空间使用率居高不下-转载
客户的数据库是Oracle Database 11.2.0.3.0 for AIX 6.1 64bit的单机数据库.客户查询DBA_FREE_SPACE发现UNDO表空间的使用率高达98%以上.客户的 ...
- UNDO表空间设置
flashback query和flashback table都是以用UNDO表空间的内容来进行恢复数据 查看undo内容保存的时间: SQL> show parameter undo_re N ...
- UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
模拟手工删除UNDO表空间 在ORADATA 中把UNDOTBS01.DBF 删除 模拟启库 SQL> STARUP; * 第 1 行出现错误: ORA-01157: 无法标识/锁定数据文件 2 ...
- oracle表空间查询维护命令大全之二(undo表空间)
--undo表空间汇总 --查看全部的表空间名字 select name from v$tablespace; --创建新的UNDO表空间,并设置自己主动扩展參数; create undo table ...
- Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)
UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据.你听说UNDO也是 ...
- 扩大或缩小undo表空间
***********************************************声明*************************************************** ...
- 如何让Oracle释放undo表空间
如何让Oracle释放undo表空间 最佳答案 在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...
随机推荐
- HttpServletRequest 各种方法总结
HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象 ...
- Hibernate写配置文件无提示信息解决
把Hibernate的相关jar包引入工程后,在配置hibernate.cfg.xml时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...
- HTTP协议分析
一.域名概述 1.域名解析的作用: 主机数量增多时,IP地址不容易记忆,域名方便记忆.域名记忆更加直观. 2.hosts文件 早期通过hosts文件进行域名的解析,Linux系统中hosts文件存放路 ...
- oracle表空间创建
/*分为四步 *//*第1步:创建临时表空间 */create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9 ...
- Android自学反思总结(上)
从接触Android到现在有几个月的时间了,基本全部都是靠自学,从大一上学期学习完c语言,接着利用寒假时间和开学一个月左右的时间自学完javase,接着在导员的督促下,开始了Android学习之旅,现 ...
- 源码分析——从AIDL的使用开始理解Binder进程间通信的流程
源码分析——从AIDL的使用开始理解Binder进程间通信的流程 Binder通信是Android系统架构的基础.本文尝试从AIDL的使用开始理解系统的Binder通信. 0x00 一个AIDL的例子 ...
- Linux下python开发环境的准备
升级python 安装依赖: yum install lrzsz zlib zlib-devel openssl readline-deve gcc ibffi-devel python-dev ...
- 一次安装rpcbind失败引发的思考
问题: yum install rpcbind -y 出现如下错误: Error -.el6.x86_64 error: %pre(rpcbind--.el6.x86_64) scriptlet fa ...
- 兔子生娃问题---函数递归应用--c语言实现
事情是这样的:在很久很久以前....有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列:1, 1 ...
- CrawlScript脚本语言实现网络爬虫
前段时间我们学习了几种爬虫技术,我们来回顾一下,webCollector,htmlParser,Jsoup,各有优劣,但是如果能灵活运用,其实都是很不错的.那么,今天呢,我们来学习一种脚本语言,这是一 ...