ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 控制文件、UNDO文件丢失,恢复起点大于丢失文件起始SCN,这UNDO文件没活动事务

控制文件、UNDO文件丢失,恢复起点大于丢失文件起始SCN,这UNDO文件没活动事务

原创 Linux操作系统 作者:kinglawrence 时间:2010-07-02 10:46:34 0 删除 编辑

介绍一下回滚段,它分为三种系统、非系统、延迟回滚段

回滚段的管理方式有二:AUTO 和MANUL

自动管理的条件有二:UNDO_MANAGEMENT=AUTO和UNDO_TABLESPACE=?

延迟回滚段:当包含有未提交事务的表空间OFFLINE、数据文件OFFLINE时,会在系统表空间建立一个延迟回滚段。这个由系统自己维护

系统回滚段在系统表空间,用于记录系统数据字典的UNDO,如DDL、对象新增等。如果没得UNDO和ROLLBACK表空间,普通的UNDO将存放在系统回滚段

[3.13.2]控制文件丢失,UNDO文件丢失,(实例/介质恢复起点大于丢失文件的起始SCN),丢失的UNDO文件没有活动事务  

这个是恢复不成功的,会出现MISSING数据文件。但是因为没有活动事务,所以可以打开

[oracle@RHEL5 backup_dir]$ vi /u01/backup_dir/hot_backup.sql
set heading off
set feedback on
set linesize 121
set termout on
set serveroutput on
begin
for x in ( select tablespace_name from dba_tablespaces where contents <> 'TEMPORARY' )
loop
 dbms_output.put_line( 'alter tablespace ' || x.tablespace_name || ' begin backup');
execute immediate 'alter tablespace ' || x.tablespace_name || ' begin backup';
end loop;
 end;
/
set heading off
set feedback off
set linesize 121
set termout off
 --生成备份的sql
spool /u01/backup_dir/01.log
select '--'||ts.name tsname,'host cp '||df.name||' /u01/backup_dir/'   ||substr(df.name,instr(df.name,'/',-1) + 1) from v$datafile df,v$tablespace ts where ts.ts# not in (select distinct ts# from v$tempfile)  and df.ts# = ts.ts#  order by 1;
select 'host cp '||name||' /u01/backup_dir/' from v$controlfile;
spool off
--生成恢复的sql
spool /u01/02.log
select '--'||ts.name tsname,'host cp /u01/backup_script/'||substr(df.name,instr(df.name,'/',-1) + 1)||' '||df.name from v$datafile df,v$tablespace ts where ts.ts# not in (select distinct ts# from v$tempfile)  and df.ts# = ts.ts#  order by 1;
select 'host cp /u01/backup_dir/'||substr(name,instr(name,'/',-1) + 1)||' '||name from v$controlfile;
 spool off

--执行自动热备份
@/u01/backup_dir/01.log

set termout on
begin
 for x in ( select tablespace_name from dba_tablespaces where contents <> 'TEMPORARY' )
 loop
 dbms_output.put_line( 'alter tablespace ' || x.tablespace_name || ' end backup');
  execute immediate 'alter tablespace ' || x.tablespace_name || ' end backup';
   end loop;
  end;
/

先做一个热备份和一个控制文件的备份撒

[oracle@RHEL5 backup_dir]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jun 1 21:22:38 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> @/u01/backup_dir/hot_backup.sql
alter tablespace SYSTEM begin backup
alter tablespace UNDOTBS1 begin backup
alter tablespace SYSAUX begin backup
alter tablespace USERS begin backup
alter tablespace UNDOTBS2 begin backup
alter tablespace TBS01 begin backup
alter tablespace TEST2 begin backup
alter tablespace TBS1 begin backup

PL/SQL procedure successfully completed.

alter tablespace SYSTEM end backup
alter tablespace UNDOTBS1 end backup
alter tablespace SYSAUX end backup
alter tablespace USERS end backup
alter tablespace UNDOTBS2 end backup
alter tablespace TBS01 end backup
alter tablespace TEST2 end backup
alter tablespace TBS1 end backup

SQL> alter tablespace undotbs1 add datafile '/u01/app/oracle/oradata/shujukuai/undotbs01_1.dbf' size 10m;
SQL> set feedback on
SQL> alter database backup controlfile to trace as '/u01/backup_dir/ctl.sql';

Database altered.

SQL> alter tablespace undotbs1 add datafile '/u01/app/oracle/oradata/shujukuai/undotbs01_2.dbf' size 10m;

Tablespace altered.

SQL> SELECT GROUP#,BYTES,ARCHIVED,FIRST_CHANGE#,SEQUENCE#,STATUS FROM V$LOG;

         1   52428800 YES        712950          1 INACTIVE
         2   52428800 NO         737220          2 CURRENT
         3   52428800 YES             0          0 UNUSED

3 rows selected.

SQL> set head on
SQL> select file#,status$,CRSCNBAS from file$;

     FILE#    STATUS$   CRSCNBAS
---------- ---------- ----------
         1          2          5
         2          2     600647
         3          2       6678
         4          2      10685
         5          2     631813
         6          2     673840
         8          2     715465
         7          2     712861
         9          2     740690
        10          2     740809                    这个数据文件的生日哈

10 rows selected.

SQL> set linesize 180
SQL> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                                                            REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
-------------------------------------------------------------------------------- --- --- ------------------ ----------------
/u01/app/oracle/oradata/shujukuai/system                                         NO  YES             740452              118
/u01/app/oracle/oradata/shujukuai/undotb                                         NO  YES             740458               78
/u01/app/oracle/oradata/shujukuai/sysaux                                         NO  YES             740464              118
/u01/app/oracle/oradata/shujukuai/users0                                         NO  YES             740470              117
/u01/app/oracle/oradata/shujukuai/tbs01.                                         NO  YES             740482               61
/u01/app/oracle/oradata/shujukuai/test2.                                         NO  YES             740488               40
/u01/app/oracle/oradata/shujukuai/tbs1.d                                         NO  YES             740494                9
/u01/app/oracle/oradata/shujukuai/undotb                                         NO  YES             740476                7
/u01/app/oracle/oradata/shujukuai/undotb                                         NO  YES             740691                2
/u01/app/oracle/oradata/shujukuai/undotb                                         NO  YES             740812                2

10 rows selected.
SQL> create table undotbs  as select * from dict where 1=2;

Table created.

SQL> insert into undotbs select * from dict;

1875 rows created.

SQL> commit;

Commit complete.

SQL> delete from undotbs;

1875 rows deleted.

SQL> insert into undotbs select * from dict where rownum < 1000;

999 rows created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> select count(*)from undotbs;

  COUNT(*)
----------
       999

1 row selected.

SQL> insert into undotbs  select * from dict where rownum = 1;

1 row created.

我们再打开一个新的SESSION


[oracle@RHEL5 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jun 1 21:37:58 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set sqlp 'SQL B> '
SQL B> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL B> host mv /u01/app/oracle/oradata/shujukuai/undotbs01_2.dbf /u01/app/oracle/oradata/shujukuai/undotbs01_2.bak

SQL B> host rm -rf /u01/app/oracle/oradata/shujukuai/control01.ctl

SQL B> host rm -rf /u01/app/oracle/oradata/shujukuai/control02.ctl

SQL B> host rm -rf /u01/app/oracle/oradata/shujukuai/control03.ctl

SQL B> host vi /u01/backup_dir/ctl.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "SHUJUKUA" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/shujukuai/redo01.log'  SIZE 50M,
  GROUP 2 '/u01/app/oracle/oradata/shujukuai/redo02.log'  SIZE 50M,
  GROUP 3 '/u01/app/oracle/oradata/shujukuai/redo03.log'  SIZE 50M
DATAFILE
  '/u01/app/oracle/oradata/shujukuai/system01.dbf',
  '/u01/app/oracle/oradata/shujukuai/undotbs01.dbf',
  '/u01/app/oracle/oradata/shujukuai/sysaux01.dbf',
  '/u01/app/oracle/oradata/shujukuai/users01.dbf',
  '/u01/app/oracle/oradata/shujukuai/tbs01.dbf',
  '/u01/app/oracle/oradata/shujukuai/test2.dbf',
  '/u01/app/oracle/oradata/shujukuai/tbs1.dbf',
  '/u01/app/oracle/oradata/shujukuai/undotbs02.dbf',
  '/u01/app/oracle/oradata/shujukuai/undotbs01_1.dbf'
CHARACTER SET ZHS16GBK
;

用TRACE备份的控制文件来创建控制文件

SQL B> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
SQL B> @/u01/backup_dir/ctl.sql
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  2083368 bytes
Variable Size             125830616 bytes
Database Buffers          150994944 bytes
Redo Buffers                6303744 bytes

Control file created.

SQL B> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required                                                  晕,刚刚明明删除了一个数据文件,这里居然提示没得需要恢复的得。哈哈,笨了吧,控制文件里没记录过这个文件撒


SQL B> alter database open;                                                            这里因为丢失的UNDO文件没有活动事务,所以能够OPEN。回想一下,刚刚是SHUTDOWN IMMEDIATE的撒

Database altered.

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            748827

SQL B> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,CREATION_CHANGE#,status from v$datafile;

DNAME                                              CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# CREATION_CHANGE# STATUS
-------------------------------------------------- ------------------ ------------ --------------- ---------------- -------
/u01/app/oracle/oradata/shujukuai/system                       741438                            0                5 SYSTEM
/u01/app/oracle/oradata/shujukuai/undotb                       741438                            0           600647 ONLINE
/u01/app/oracle/oradata/shujukuai/sysaux                       741438                            0             6678 ONLINE
/u01/app/oracle/oradata/shujukuai/users0                       741438                            0            10685 ONLINE
/u01/app/oracle/oradata/shujukuai/tbs01.                       741438                            0           631813 ONLINE
/u01/app/oracle/oradata/shujukuai/test2.                       741438                            0           673840 ONLINE
/u01/app/oracle/oradata/shujukuai/tbs1.d                       741438                            0           712861 ONLINE
/u01/app/oracle/oradata/shujukuai/undotb                       741438                            0           715465 ONLINE
/u01/app/oracle/oradata/shujukuai/undotb                       741438                            0           740690 ONLINE
/u01/app/oracle/product/10.2.0/db_1/dbs/MISSING00010      0       741463               0           740809 RECOVER                                        注意看这里哈,这个文件MISSING了,我们来创建一下这个文件试试看

10 rows selected.

SQL B> alter database create datafile '/u01/app/oracle/product/10.2.0/db_1/dbs/MISSING00010' as '/u01/app/oracle/oradata/shujukuai/undotbs01_2.dbf';
alter database create datafile '/u01/app/oracle/product/10.2.0/db_1/dbs/MISSING00010' as '/u01/app/oracle/oradata/shujukuai/undotbs01_2.dbf'
*
ERROR at line 1:
ORA-01178: file 10 created before last CREATE CONTROLFILE, cannot recreate
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/app/oracle/product/10.2.0/db_1/dbs/MISSING00010'                           哈哈,这个当然是不行的,控制文件SCN 748827  也就是恢复的起点SCN大于丢失文件的SCN 740809

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21158541/viewspace-666912/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-02-08

  • 博文量
    60
  • 访问量
    93111