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;