您的位置:首页 > 其它

用备份控制文件做不完全恢复下的完全恢复(数据文件备份<旧>--新建表空间--控制文件备份<次新>--日志归档文件<新>)

2017-01-12 12:03 771 查看
为什么会使用备份的控制文件? 实际工作中主要有两种情况:

第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件)。

第二种:当前控制文件没有损坏,但想要恢复被删除的表空间。

实验1:  有所有数据文件备份(老)------(新建表空间andy)-----备份控制文件(次新)------日志文件(新)

环境:当前控制文件损坏,数据文件损坏,有全备但之后增加了表空间,并备份了配套的控制文件,利用备份控制文件备份。

分析:新建表空间数据文件损坏, 全备里没有该数据文件的备份及控制文件描述,当前控制文件又丢失,只能用备份的控制文件恢复。

1)准备环境

--生成要备份的数据文件的命令

SQL>  select 'ho cp ' || name || ' /home/oracle/coldbak' from v$datafile;

'HOCP'||NAME||'/HOME/ORACLE/COLDBAK'

-------------------------------------------------------------------------

ho cp /home/oracle/app/oradata/orcl/system01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/sysaux01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/undotbs01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/users01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/tbtb01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/ogg01.dbf /home/oracle/coldbak

6 rows selected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> ho cp /home/oracle/app/oradata/orcl/control01.ctl /home/oracle/coldbak

ho cp /home/oracle/app/flash_recovery_area/orcl/control02.ctl /home/oracle/coldbak

SQL> ho cp /home/oracle/app/oradata/orcl/system01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/sysaux01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/undotbs01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/users01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/tbtb01.dbf /home/oracle/coldbak

ho cp /home/oracle/app/oradata/orcl/ogg01.dbf /home/oracle/coldbak

SQL> startup;

ORACLE instance started.

Total System Global Area 1068937216 bytes

Fixed Size    2220200 bytes

Variable Size  729812824 bytes

Database Buffers  331350016 bytes

Redo Buffers    5554176 bytes

Database mounted.

Database opened.

SQL> select * from v$tablespace;

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         2 UNDOTBS1                       YES NO  YES

         4 USERS                          YES NO  YES

         3 TEMP                           NO  NO  YES

         6 LZY                            YES NO  YES

         7 GOLDGATE                       YES NO  YES

7 rows selected.

SQL> create tablespace andy datafile '/home/oracle/app/oradata/orcl/andy01.dbf' size 1m;

Tablespace created.

SQL> select * from andy.andy;

select * from andy.andy

                   *

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> create table andy.andy(id int) tablespace andy;

Table created.

SQL> insert into andy.andy values (1) ;

1 row created.

SQL> commit;

Commit complete.

SQL> select * from andy.andy;

        ID

----------

         1

SQL> alter system switch logfile;

-- 备份控制文件   

SQL> alter database backup controlfile to '/home/oracle/coldbak/ctl01.bak';

Database altered.

2)模拟andy01.dbf损坏

SQL> ho rm -rf /home/oracle/app/oradata/orcl/andy01.dbf

SQL> alter system flush buffer_cache;

System altered.

SQL> select * from andy;

select * from andy

*

ERROR at line 1:

ORA-01116: error in opening database file 7

ORA-01110: data file 7: '/home/oracle/app/oradata/orcl/andy01.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

3)关闭数据库

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

4)恢复所有数据文件备份,准备做不完全恢复

[oracle@11g orcl]$ rm -rf *.dbf

[oracle@11g orcl]rm -rf /home/oracle/app/oradata/orcl/control01.ctl

[oracle@11g orcl]$ rm -rf /home/oracle/app/flash_recovery_area/orcl/control02.ctl

[oracle@11g coldbak]$ cp ctl01.bak /home/oracle/app/oradata/orcl/control01.ctl

[oracle@11g coldbak]$ cp ctl01.bak /home/oracle/app/flash_recovery_area/orcl/control02.ctl

[oracle@11g coldbak]$ cp *.dbf /home/oracle/app/oradata/orcl/

SQL> alter database create datafile '/home/oracle/app/oradata/orcl/andy01.dbf';

Database altered.

SQL> startup;

ORACLE instance started.

Total System Global Area 1068937216 bytes

Fixed Size    2220200 bytes

Variable Size  729812824 bytes

Database Buffers  331350016 bytes

Redo Buffers    5554176 bytes

Database mounted.

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> col name for a50;

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

     FILE# CHECKPOINT_CHANGE# NAME

---------- ------------------ --------------------------------------------------

         1            2036303 /home/oracle/app/oradata/orcl/system01.dbf

         2            2036303 /home/oracle/app/oradata/orcl/sysaux01.dbf

         3            2036303 /home/oracle/app/oradata/orcl/undotbs01.dbf

         4            2036303 /home/oracle/app/oradata/orcl/users01.dbf

         5            2036303 /home/oracle/app/oradata/orcl/tbtb01.dbf

         6            2036303 /home/oracle/app/oradata/orcl/ogg01.dbf

         7            2036424 /home/oracle/app/oradata/orcl/andy01.dbf

7 rows selected.

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

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            2035583

         2            2035583

         3            2035583

         4            2035583

         5            2035583

         6            2035583

         7                  0

7 rows selected.

说明:

a)file7 在控制文件里记录是andy01.dbf,而与之对应的数据文件3是不存在的

b)备份的数据备份的scn比控制文件scn的还老。

5)使用备份控制文件恢复

SQL> recover database using backup controlfile;

ORA-00283: recovery session canceled due to errors

ORA-01110: data file 7: '/home/oracle/app/oradata/orcl/andy01.dbf'

ORA-01157: cannot identify/lock data file 7 - see DBWR trace file

ORA-01110: data file 7: '/home/oracle/app/oradata/orcl/andy01.dbf'

说明:

此错是因为老备份里没有andy表空间,但只要控制文件里记录了andy就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。

SQL> alter database create datafile '/home/oracle/app/oradata/orcl/andy01.dbf';

Database altered.

--再次使用备份控制文件恢复

SQL> recover database using backup controlfile;

ORA-00279: change 2035583 generated at 12/12/2014 04:53:45 needed for thread 1

ORA-00289: suggestion : /home/oracle/archivelog/1_1_866090437.dbf

ORA-00280: change 2035583 for thread 1 is in sequence #1

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

ORA-00279: change 2036542 generated at 12/12/2014 05:11:01 needed for thread 1

ORA-00289: suggestion : /home/oracle/archivelog/1_2_866090437.dbf

ORA-00280: change 2036542 for thread 1 is in sequence #2

ORA-00278: log file '/home/oracle/archivelog/1_1_866090437.dbf' no longer

needed for this recovery

ORA-00308: cannot open archived log '/home/oracle/archivelog/1_2_866090437.dbf'

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

说明:

//archive日志前滚结束了,但当前日志里还有信息需要恢复

//注意: 对于这个例子来说,一定要看清提示:如果提示的不是归档的日志(是当前日志),则要直接要输入filename 不能输入auto,否则open时会失败。

--再次做恢复

SQL> recover database using backup controlfile;

ORA-00279: change 2036542 generated at 12/12/2014 05:11:01 needed for thread 1

ORA-00289: suggestion : /home/oracle/archivelog/1_2_866090437.dbf

ORA-00280: change 2036542 for thread 1 is in sequence #2

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/home/oracle/app/oradata/orcl/redo02.log                  ## 把current日志给它

Log applied.

Media recovery complete.

6)resetlogs打开数据库

SQL> alter database open resetlogs;

Database altered.

7) 验证

SQL> select * from andy.andy;

        ID

----------

         1

OK,结束。 转载请标明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: