1、undo也是可以热备份的,而且可以recover恢复,但是recover的时候和一般datafile不一样
2、undo的恢复也会应用日志前滚(undo的redo),如果能够应用online redo,则当前的事务不会丢失
3、undo的recover需要2个环节,先recover再online
确认当前UNDO
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
--------------- ---------------------------------------------
USERS/u01/oracle/oradata/ora10g/users01.dbf
SYSAUX/u01/oracle/oradata/ora10g/sysaux01.dbf
UNDOTBS1/u01/oracle/oradata/ora10g/undotbs01.dbf
SYSTEM/u01/oracle/oradata/ora10g/system01.dbf
MYTBS/u01/oracle/oradata/ora10g/mytbs01.dbf
5 rows selected.
SQL>
做热备
SQL> alter tablespace UNDOTBS1 begin backup;
Tablespace altered.
SQL> !cp /u01/oracle/oradata/ora10g/undotbs01.dbf /home/oracle
SQL> alter tablespace UNDOTBS1 end backup;
Tablespace altered.
SQL>
数据库没有事务
SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;
no rows selected
SQL>
开个新会话产生事务 不要提交
[oracle@dba ~]$ sql /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 8 17:39:04 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn scott/seker
Connected.
SQL> update emp set sal=sal+1 where deptno=10;
3 rows updated.
SQL>
回到原来会话查看 已经有事务了
SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
5 27 344
1 row selected.
SQL>
XIDUSN:就是事务的回滚段号
XIDSLOT:就是ITL(interesting transaction list)列表中,slot的号
XIDSQN:就是表示这个slot被重复使用的次数
破坏文件
SQL> ! cp 1.txt /u01/oracle/oradata/ora10g/undotbs01.dbf
SQL> alter database datafile 2 offline;
ERROR:
ORA-03114: not connected to ORACLE
alter database datafile 2 offline
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
SQL> conn / as sysdba
Connected.
SQL>
SQL> SELECT FILE#, STATUS,RECOVER, NAME,error FROM V$DATAFILE_HEADER ;
FILE# STATUS REC NAME ERROR
---------- ---------- --- -------------------------------------------------- --------------------
1 ONLINE NO /u01/oracle/oradata/ora10g/system01.dbf
2 OFFLINE FILE NOT FOUND
3 ONLINE NO /u01/oracle/oradata/ora10g/sysaux01.dbf
4 ONLINE NO /u01/oracle/oradata/ora10g/users01.dbf
5 ONLINE NO /u01/oracle/oradata/ora10g/mytbs01.dbf
5 rows selected.
SQL>
恢复文件
SQL> ! cp /u01/oracle/undotbs01.dbf /u01/oracle/oradata/ora10g/
SQL>
SQL> SELECT FILE#, STATUS,RECOVER, NAME,error FROM V$DATAFILE_HEADER ;
FILE# STATUS REC NAME ERROR
---------- ---------- --- -------------------------------------------------- --------------------
1 ONLINE NO /u01/oracle/oradata/ora10g/system01.dbf
2 OFFLINE YES /u01/oracle/oradata/ora10g/undotbs01.dbf
3 ONLINE NO /u01/oracle/oradata/ora10g/sysaux01.dbf
4 ONLINE NO /u01/oracle/oradata/ora10g/users01.dbf
5 ONLINE NO /u01/oracle/oradata/ora10g/mytbs01.dbf
5 rows selected.
SQL>
SQL> recover datafile 2;
ORA-00603: ORACLE server session terminated by fatal error
SQL> conn / as sysdba
Connected.
SQL>
SQL> SELECT FILE#, STATUS,RECOVER, NAME,error FROM V$DATAFILE_HEADER ;
FILE# STATUS REC NAME ERROR
---------- ---------- --- -------------------------------------------------- --------------------
1 ONLINE NO /u01/oracle/oradata/ora10g/system01.dbf
2 OFFLINE NO /u01/oracle/oradata/ora10g/undotbs01.dbf
3 ONLINE NO /u01/oracle/oradata/ora10g/sysaux01.dbf
4 ONLINE NO /u01/oracle/oradata/ora10g/users01.dbf
5 ONLINE NO /u01/oracle/oradata/ora10g/mytbs01.dbf
5 rows selected.
SQL> alter database datafile 2 online;
Database altered.
SQL>
看事务还在不
SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
5 27 344
1 row selected.
SQL> 依然健在
也能执行commit;
SQL> commit;
Commit complete.
SQL>
再查事务已经没有了 因为commit了
SQL> select XIDUSN,XIDSLOT,XIDSQN,name from v$transaction;
no rows selected
SQL>
UNDO切换后 之前的UNDO回滚段无法释放 解决办法是隐藏参数 强制离线(暂时没别的办法)
alter system set "_offline_rollback_segments"='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$','_SYSSMU5$','_SYSSMU6$','_SYSSMU7$','_SYSSMU8$','_SYSSMU9$','_SYSSMU10$' scope=spfile;