ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 测试恢复5==使用2进制形式文件恢复控制文件

测试恢复5==使用2进制形式文件恢复控制文件

原创 Linux操作系统 作者:oracle_db 时间:2012-04-26 21:17:20 0 删除 编辑
先看一下当向表中插入一条数据以后,数据存放在那里
会话1:
先生成1条测试数据
SQL> show user;
USER is "QQ1"
SQL> create table t2 (id int,name char(10)) tablespace qq;

Table created.

SQL> insert into t2 values(0,'testdata');

1 row created.

SQL> 

在没提交的情况下这条数据在那呢?它在内存里,磁盘上是没有这条记录的。它实际上存放在BUFFER CACHE中。当提交以后数据应该放在ONLINE REDO LOG FILE中。
我们可以在联机重做日志中查到提交的数据像这样
[oracle@oraclelinux dbtest]$ strings redo04.log |grep testdata
[oracle@oraclelinux dbtest]$ 
会话2:查看当前正在使用那一组联机重做日志。
SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 INACTIVE
         4 CURRENT

SQL> select group#,member from v$logfile;

    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/oradata/dbtest/redo03.log
         2 /u01/oradata/dbtest/redo02.log
         1 /u01/oradata/dbtest/redo01.log
         4 /u01/oradata/dbtest/redo04.log

SQL> 
看到当前REDO04.LOG是当前正在用的联机重做日志组

会话1把数据提交后在查看REDO04.LOG中是否有相应记录写进来,在10G中测试不用你提交,它自己就写到联机日志文件中!
SQL> insert into t2 values (1,'testdata');

1 row created.

SQL> commit;

Commit complete.

SQL> 
另一个会话查看数据在联机日志中
[oracle@oraclelinux dbtest]$ strings redo04.log |grep testdata
testdata  
[oracle@oraclelinux dbtest]$ 
理论上这个时候数据也没写到数据文件和联机日志文件中,但是在10G中看到数据已经在数据文件上了,也许是隐式提交了,不懂。。。

[oracle@oraclelinux dbtest]$ strings qq01.dbf |grep testdata
testdata  
[oracle@oraclelinux dbtest]$ 
这个时候手动归档alter system switch lofile,之后查看刚插入的记录跑到这里来没有。
[oracle@oraclelinux 2012_04_26]$ ll
total 41496
-rw-r-----  1 oracle oinstall 21413888 Apr 26 10:11 o1_mf_1_53_7skcppkm_.arc
-rw-r-----  1 oracle oinstall  1565184 Apr 26 10:59 o1_mf_1_54_7skgjqyf_.arc
-rw-r-----  1 oracle oinstall   825856 Apr 26 11:01 o1_mf_1_55_7skgmvm2_.arc
-rw-r-----  1 oracle oinstall     1024 Apr 26 11:01 o1_mf_1_56_7skgn9cp_.arc
-rw-r-----  1 oracle oinstall   489984 Apr 26 11:25 o1_mf_1_57_7skj11s9_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 11:26 o1_mf_1_58_7skj2sn1_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 16:30 o1_mf_1_58_7sl1xww5_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 11:26 o1_mf_1_59_7skj3oqc_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 16:30 o1_mf_1_59_7sl1xz1f_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 15:28 o1_mf_1_60_7sky9jxb_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 16:30 o1_mf_1_60_7sl1y0f9_.arc
-rw-r-----  1 oracle oinstall   531456 Apr 26 16:31 o1_mf_1_61_7sl1y8y0_.arc
-rw-r-----  1 oracle oinstall  6222848 Apr 26 21:55 o1_mf_1_62_7slnz8lt_.arc
-rw-r-----  1 oracle oinstall     5120 Apr 26 21:56 o1_mf_1_63_7slo0hrf_.arc
[oracle@oraclelinux 2012_04_26]$ strings o1_mf_1_62_7slnz8lt_.arc |grep testdata
testdata  
[oracle@oraclelinux 2012_04_26]$ 

总结:以上主要说明,当
提交以后,数据是放在某一个联机重做日志中的,当发生检查点后数据才真正写到对应数据文件,当有条件触犯归档时,数据才记录到归档日志文件中

==================以下测试控制文件恢复=========================
测试流程==1.备份当前控制文件2.创建新表空间,这时候控制文件发生了变化3.把控制文件删除4.用备份的控制文件进行恢复

会话1:备份当前控制文件到指定目录

SQL> show user;
USER is "SYS"
SQL> alter database backup controlfile to '/backup/ctlbackup01.bin';

Database altered.

SQL> 
[oracle@oraclelinux backup]$ ll
total 58516
drwxr-xr-x  3 oracle oinstall     4096 Apr 26 10:35 cold
-rw-r-----  1 oracle oinstall  7389184 Apr 26 22:10 ctlbackup01.bin
drwxr-xr-x  2 oracle oinstall     4096 Apr 26 10:48 hot
-rw-r-----  1 root   root     52436992 Apr 26 11:36 qq01.dbf
[oracle@oraclelinux backup]$ 
会话2:创建新表空间

SQL> show user;
USER is "SYS"
SQL> alter database backup controlfile to '/backup/ctlbackup01.bin';

Database altered.

SQL> select ts#,name from v$tablespace;

       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 SYSAUX
         4 USERS
         6 EXAMPLE
         7 PAUL
         8 WENCHUAN
         9 QQ
         3 TEMP

9 rows selected.
SQL> create tablespace qq2 datafile '/u01/oradata/dbtest/qq02.dbf' size 10m;

Tablespace created.============【新建表空间就会改变当前数据库的结构,控制文件也会发生变化,虽然之前对控制文件进行了备份,但是它已经不是最新的控制文件了!】
向新表空间中插入数据。

SQL> create table t4(id int,name char(10)) tablespace qq2;

Table created.

SQL> insert into t4 values (0,'abc');

1 row created.

SQL> commit;

Commit complete.

SQL> 
删除控制文件!
[oracle@oraclelinux dbtest]$ rm -f control0*
[oracle@oraclelinux dbtest]$ ll
total 1615556
-rw-r--r--  1 oracle oinstall      1228 Mar 22 21:09 ctl
-rw-r-----  1 oracle oinstall 104865792 Apr 26 22:01 example01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 paul01.dbf
-rw-r-----  1 oracle oinstall  52436992 Apr 26 22:21 qq01.dbf
-rw-r-----  1 oracle oinstall  10493952 Apr 26 22:14 qq02.dbf
-rw-r-----  1 oracle oinstall  52429312 Apr 26 21:56 redo01.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 22:21 redo02.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 16:30 redo03.log
-rw-r-----  1 oracle oinstall  52429312 Mar 23 14:50 redo04a.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 21:55 redo04.log
-rw-r-----  1 oracle oinstall 461381632 Apr 26 22:21 sysaux01.dbf
-rw-r-----  1 oracle oinstall 576724992 Apr 26 22:21 system01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 25 22:00 temp01.dbf
-rw-r-----  1 oracle oinstall 115351552 Apr 26 22:21 undotbs01.dbf
-rw-r-----  1 oracle oinstall   5251072 Apr 26 22:01 users01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 wenchuan01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 wenchuan2.dbf
[oracle@oraclelinux dbtest]$ 

会话1:强行关闭数据库
SQL> conn /as sysdba
Connected.
SQL> shutdown abort;
ORACLE instance shut down.
SQL> 

会话2:RESTORE 控制文件
[oracle@oraclelinux dbtest]$ cd /backup
[oracle@oraclelinux backup]$ ls
cold  ctlbackup01.bin  hot  qq01.dbf
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control01.ctl
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control02.ctl
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control03.ctl
[oracle@oraclelinux backup]$ 

会话1:把数据库MOUNT,这个时候虽然MOUNT上了但是控制文件是用的老的控制文件,没有包含新建立的表空间的信息,怎么知道控制文件不是最新的呢?通过V$DATAFILE,V$DATAFILE_HEADER比较SCN号大小,通过时间长一点SCN号才不一样,如果时间间隔太短这两个视图的SCN号是一样的。。。
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  1219904 bytes
Variable Size             130024128 bytes
Database Buffers          310378496 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> 
SQL> show user;
USER is "SYS"
SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            1687880
         2            1687880
         3            1687880
         4            1687880
         5            1687880
         6            1687880
         7            1687880
         8            1687880
         9            1687880

9 rows selected.

SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            1687880
         2            1687880
         3            1687880
         4            1687880
         5            1687880
         6            1687880
         7            1687880
         8            1687880
         9            1687880

9 rows selected.
这时候打开数据库报错,必然结果因为控制文件不是最新的,相当于你现在没有控制文件。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

下面就要使用备份的控制文件对它进行RECOVER.
会话1:
SQL> recover database using backup controlfile;
ORA-00279: change 1687880 generated at 04/26/2012 21:56:31 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1687880 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}


SQL> 
恢复的时候它要求我们有归档文件2012_04_26/o1_mf_1_64_%u_.arc来进行恢复,不幸的是在归档文件中没有这个文件!

[oracle@oraclelinux 2012_04_26]$ ll
total 41496
-rw-r-----  1 oracle oinstall 21413888 Apr 26 10:11 o1_mf_1_53_7skcppkm_.arc
-rw-r-----  1 oracle oinstall  1565184 Apr 26 10:59 o1_mf_1_54_7skgjqyf_.arc
-rw-r-----  1 oracle oinstall   825856 Apr 26 11:01 o1_mf_1_55_7skgmvm2_.arc
-rw-r-----  1 oracle oinstall     1024 Apr 26 11:01 o1_mf_1_56_7skgn9cp_.arc
-rw-r-----  1 oracle oinstall   489984 Apr 26 11:25 o1_mf_1_57_7skj11s9_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 11:26 o1_mf_1_58_7skj2sn1_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 16:30 o1_mf_1_58_7sl1xww5_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 11:26 o1_mf_1_59_7skj3oqc_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 16:30 o1_mf_1_59_7sl1xz1f_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 15:28 o1_mf_1_60_7sky9jxb_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 16:30 o1_mf_1_60_7sl1y0f9_.arc
-rw-r-----  1 oracle oinstall   531456 Apr 26 16:31 o1_mf_1_61_7sl1y8y0_.arc
-rw-r-----  1 oracle oinstall  6222848 Apr 26 21:55 o1_mf_1_62_7slnz8lt_.arc
-rw-r-----  1 oracle oinstall     5120 Apr 26 21:56 o1_mf_1_63_7slo0hrf_.arc
[oracle@oraclelinux 2012_04_26]$ 

63这个归档文件是最新的,这个时候归档文件在那呢?在联机重做日志中,因为还来不急归档,控制文件就丢失了,只能这么想了。。。
SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> show user;
USER is "SYS"
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  1219904 bytes
Variable Size             130024128 bytes
Database Buffers          310378496 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> 
杯具 了,多试几次联机日志都报错,怎么办呢?。。。
SQL> col error for a18
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
        10 ONLINE  ONLINE  FILE MISSING                0

SQL> col name format a50
SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oracle/dbs/UNNAMED00010

10 rows selected.

SQL> 
10这个数据文件的名字是之前没有创建的。。。之前的数据文件名叫qq02.dbf.这可以在ALERT文件中去查。在这里却变成了这个名字。。。。

下面把它RENAME为正常的文件名
SQL> col error for a18
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
        10 ONLINE  ONLINE  FILE MISSING                0

SQL> col name format a50
SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oracle/dbs/UNNAMED00010

10 rows selected.

SQL> alter database rename file '/u01/oracle/dbs/UNNAMED00010' to '/u01/oradata/dbtest/qq02.dbf'
  2  ;

Database altered.

SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oradata/dbtest/qq02.dbf

10 rows selected.

SQL> 
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1691320 generated at 04/26/2012 22:14:51 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1691320 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dbtest/redo01.log
ORA-00310: archived log contains sequence 63; sequence 64 required
ORA-00334: archived log: '/u01/oradata/dbtest/redo01.log'


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/u01/oradata/dbtest/system01.dbf'


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1691320 generated at 04/26/2012 22:14:51 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1691320 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dbtest/redo02.log
Log applied.
Media recovery complete.
SQL> 
SQL> alter database open resetlogs;

Database altered.

SQL> 
SQL> conn qq1/qq1
Connected.
SQL> select * from t4;

        ID NAME
---------- --------------------------------------------------
         0 abc

SQL> 
=========================恢复结束============================



总结:
出现10 /u01/oracle/dbs/UNNAMED00010 这样的数据文件主要是因为什么呢?
在RECOVER DATABASE的时候会去从ONLINE REDOLOG和归档日志中去找相关信息进行恢复,新创建的表空间的信息也一定在REDO中,或者在归档中。当REDO,或者归档日志APPLIED到数据文件上时发现控制文件中没有包含新建立的表空间的信息,APPLIED到数据文件的时候因为控制文件不是最新的原因,导致新表空间对应的数据文件没有把相应控制信息注册到控制文件,这个时候ORACLE就不认这个数据文件,还给他另取了个UNNAMEXXX的名字。这个时候使用RENAME 文件名为正确的文件名,改完了就说数据文件在控制文件注册了,然后在RECOVER

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

上一篇: ora-00283
下一篇: resetlog理解
请登录后发表评论 登录
全部评论

注册时间:2008-11-13

  • 博文量
    158
  • 访问量
    307817