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;