一、UNDO 表空间使用:
1.在rollback之后回滚事务。
2.恢复数据
3.提供读一致性
4.在闪回查询中分析之前一个点的数据
5.使用闪回恢复脏数据。
二、Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段.
我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要指定一个UNDO 表空间。 如果设为manual,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。
当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------
undo_management string AUTO 指定auto的管理方式,auto和menual
undo_retention integer 900 数据保留的时间,单位是秒。
undo_tablespace string UNDOTBS1 指名系统使用哪一个重做表空间
补充:初始化参数UNDO_RETENTION
该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。
一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建
一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。
同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。
只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,
例如:
SQL> Alter tablespace undotbs1 retention guarantee;
如果想禁止undo 表空间retention guarantee,
例如:
SQL> Alter tablespace undotbs1 retention noguarantee;
v$undostat视图:保存了最近四天undo的数据,以10分钟为一个单位存放
dba_hist_undostat视图保存四天之前的数据。
SQL> desc v$undostat
Name Type Nullable Default Comments
------------------- ------------ -------- ------- --------
BEGIN_TIME DATE Y
END_TIME DATE Y
UNDOTSN NUMBER Y
UNDOBLKS NUMBER Y
TXNCOUNT NUMBER Y
MAXQUERYLEN NUMBER Y
MAXQUERYID VARCHAR2(13) Y
MAXCONCURRENCY NUMBER Y
UNXPSTEALCNT NUMBER Y
UNXPBLKRELCNT NUMBER Y
UNXPBLKREUCNT NUMBER Y
EXPSTEALCNT NUMBER Y
EXPBLKRELCNT NUMBER Y
EXPBLKREUCNT NUMBER Y
SSOLDERRCNT NUMBER Y
NOSPACEERRCNT NUMBER Y
ACTIVEBLKS NUMBER Y
UNEXPIREDBLKS NUMBER Y
EXPIREDBLKS NUMBER Y
TUNED_UNDORETENTION NUMBER Y
SQL> select to_char(begin_time,'dd-mon-rr hh24:mi') begin_time,
2 to_char(end_time,'dd-mon-rr hh24:mi') end_time,
3 tuned_undoretention from v$undostat order by end_time;
BEGIN_TIME END_TIME TUNED_UNDORETENTION
---------------- ---------------- -------------------
15-12? -12 21:1 15-12? -12 21:2 900
15-12? -12 21:2 15-12? -12 21:3 900
15-12? -12 21:3 15-12? -12 21:4 900
15-12? -12 21:4 15-12? -12 21:5 900
15-12? -12 21:5 15-12? -12 22:0 900
15-12? -12 22:0 15-12? -12 22:1 900
15-12? -12 22:1 15-12? -12 22:2 900
15-12? -12 22:2 15-12? -12 22:3 900
15-12? -12 22:3 15-12? -12 22:4 900
15-12? -12 22:4 15-12? -12 22:5 900
15-12? -12 22:5 15-12? -12 23:0 900
三、测试
1.创建undo表空间
SQL> create undo tablespace undo2 datafile '/opt/undo2.dbf' size 2M ;
create undo tablespace undo2 datafile '/opt/undo2.dbf' size 2M
ORA-01119: error in creating database file '/opt/undo2.dbf'
ORA-27040: file create error, unable to create file
Linux Error: 13: Permission denied
解决方法:
不能创建是因为oracle用户在linux系统中有没有创建文件的权限。
[oracle@localhost ~]$ su - root
Password:
[root@localhost ~]# chmod 777 /opt
2. 增加数据文件
ALTER TABLESPACE undotbs_01
ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
3. 重命名数据文件
ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';
4. 使数据文件online或者offline
ALTER TABLESPACE undotbs_01 online|offline;
5. 开始或者结束一个联机备份
ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;
6. 删除undo tablespace
Drop tablespace undotbs_01;
Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。