第三章:手工完全恢复

3.1 完全恢复;

通过备份、归档日志、currentredo ,将database恢复到failure 前的最后一次commit状态。

  

3.2 完全恢复的步骤

 

     1)restore: OS拷贝命令cp还原所有或部分datafile

     2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复

 

3.3 手工完全恢复可以基于三个级别 

 

    recover database: 所有或大部分datafile丢失,一般是在mount状态完成 (比如4个关键文件损坏,就进不了open状态)

    recover tablespace:非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成

    recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成

 

什么是关键文件:如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

 

考点:哪些文件是关键文件:四个:1system01.dbf, 2) undotablespace3control file 4current log file(当前日志文件)

 

3.4 恢复过程可以查看的视图:

 

    1)v$recover_file: 查看需要恢复的datafile

    2)v$recovery_log: 查看recover 需要的redo 日志

    3)v$archvied_log: 查看已经归档的日志

    

 

3.5 非归档模式下只能做全备的完整还原,还原后仍会缺失联机日志文件(因为只备数据文件和控制文件),需要在mount下发出

    alter database clear logfile group  <组号>. (如果是在RMAN下还原,这一过程是自动完成的)。

 

3.6 归档模式下手工完全恢复的实验

 

前提: 1)有一套datafile全备, 2)使用当前控制文件, 3)自上次备份以来的归档日志和当前联机日志是完整的, 

 

范例1:recover database 

 

说明:由于media failure 所有datafile丢失,

 

sys:

SQL>select * from scott.test;

 

        ID

----------

         1

  

在这个状态下先在OS下做一个数据文件和控制文件的冷备。

 

SQL>shutdown immediate

  

[oracle@timran~] $cp /u01/oradata/timran11g/*.dbf /u01/back1 

[oracle@timran~] $cp /u01/oradata/timran11g/*.ctl /u01/back1 

 

SQL> startup

 

SQL>insert into scott.test values(2);

SQL>commit;

SQL>select * from scott.test;

 

        ID

----------

         2

         1

 

SQL>insert into scott.test values(3);

SQL>commit;

SQL>select * from scott.test;

 

        ID

----------

         2

         3

         1

 

1)模拟介质失败,所有数据文件丢失

   

[oracle@timran~]$ rm /u01/oradata/timran11g/*.dbf     //数据库在打开的情况下就删掉了所有dbf文件 

SQL>shutdown abort      //数据库直接abort了

ORACLEinstance shut down.

 

2)启动database 

 

SQL>startup        

ORACLEinstance started.

TotalSystem Global Area  839282688 bytes

FixedSize                  2217992 bytes

VariableSize             603981816 bytes

DatabaseBuffers          230686720 bytes

RedoBuffers                2396160 bytes

Database mounted.

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

ORA-01110:data file 1: '/u01/oradata/timran11g/system01.dbf'

数据库没有打开,只到了mount状态。

SQL>selectfile#,error from v$recover_file; 

或者select * fromv$recover_file;检查数据文件是否存在

 

     FILE# ERROR

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

         1 FILE NOT FOUND

         2 FILE NOT FOUND

         3 FILE NOT FOUND

         4 FILE NOT FOUND

         5 FILE NOT FOUND

         6 FILE NOT FOUND

         7 FILE NOT FOUND

 

查看控制文件scn

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

 

     FILE# CHECKPOINT_CHANGE#

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

         1            2436025

         2            2436025

         3            2436025

         4            2436025

         5            2436025

         6            2436025

         7            2436025

 

查看数据文件头scn

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

 

     FILE# CHECKPOINT_CHANGE#

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

         1            0

         2            0

         3            0

         4            0

         5            0

         6            0

         7            0

 

如果此时已经有了日志归档,那么可以使用下面语句来查看需要哪些归档日志。

SQL>select * from v$recovery_log;

 

3)启动失败,控制文件和数据文件头的scn不一致,需要做介质恢复。

注意:

//此例是数据库open状态在OS下直接删除了所有数据文件,所以这里最好不要做手工日志切换,否则情况复杂。

//控制文件记录的scn 应大于需恢复的数据文件头部的scn,归档日志+当前日志都完整,这样才能满足完全恢复的条件。

 

首先还原所有数据文件

[oracle@timran~]$ cp /u01/back1/*.dbf /u01/oradata/timran11g

 

现在再去查看控制文件和数据文件头scn,发现控制文件的新,两个scn号不一致,就需要使用日志来前滚recover database。

4)恢复database

 

SQL>recover database;

 

5)打开数据库

 

SQL>alter database open;

 

6)验证

 

SQL>select * from scott.test;

 

        ID

----------

         2

         3

         1

 

范例2:recover tablespace(状态:database open)

 

说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复

 

模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃, 我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

 

恢复表空间(删除了tablespace下的所有的datafile)

 

在这个状态下先在OS下做一个数据文件和控制文件的冷备。如果前面有备份了,就不要做下面的了。

SQL> shutdown immediate

[oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf  /u01/back1 

[oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl  /u01/back1 

SQL> startup

 

1)了解一下当前状态,有个test表空间,

 

SQL>select file_id,file_name,tablespace_name from dba_data_files;

 

   FILE_ID FILE_NAME                                         TABLESPACE_NAME

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

         4/u01/oradata/timran11g/users01.dbf                    USERS

         3/u01/oradata/timran11g/sysaux01.dbf                   SYSAUX

         2 /u01/oradata/timran11g/undotbs01.dbf                  UNDOTBS1

         1/u01/oradata/timran11g/system01.dbf                   SYSTEM

         5/u01/oradata/timran11g/example01.dbf                  EXAMPLE

         7/u01/oradata/timran11g/abcd01.dbf                     ABCD

         6/u01/oradata/timran11g/test01.dbf                     TEST

 

SQL>conn scott/scott

Connected.

SQL>create table t1 (name char(10)) tablespace test;

SQL>insert into t1 values('a');

SQL>commit;

SQL>select * from t1;

 

NAME

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

a

 

2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件                                                                                          

[oracle@timran~]$ rm /u01/oradata/timran11g/test01.dbf

[oracle@timran~]$

 

3)查证该表空间上的表不可访问了

 

SQL>alter system flush buffer_cache; //清除data buffer 

此时查看t1还是有数据,是以为pga没有清空

SQL>conn / as sysdba   //换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!

Connected.

 

SQL>select * from scott.t1;

select *from scott.t1

*

ERROR atline 1:

ORA-01116:error in opening database file 6

ORA-01110:data file 6: '/u01/oradata/timran11g/test01.dbf'

ORA-27041:unable to open file

LinuxError: 2: No such file or directory

Additionalinformation: 3

 

4)看看scn的情况

 

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

 

     FILE# CHECKPOINT_CHANGE#

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

         1            3550907

         2            3550907

         3            3550907

         4            3550907

         5            3550907

         6            3550339

 

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

 

     FILE# CHECKPOINT_CHANGE#

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

         1            3550907

         2            3550907

         3            3550907

         4            3550907

         5            3550907

         6                  0

 

 

5)表空间offline

 

SQL>alter tablespace test offline immediate; //immediate使表空间能立即脱机,不等Oracle对任何数据文件做检查,因为此时没有数据文件test01.dbf了,所以使用alter tablespace test offline是会报错的。

 

6)数据库open下,使用备份还原这个表空间下的所有数据文件

 

[oracle@timran~]$ cp /u01/back1/test01.dbf /u01/oradata/timran11g

[oracle@timran~]$ 

        

7)恢复tablespace

 

SQL>recover tablespace test;

完成介质恢复。

 

8)使表空间online

 

SQL>alter tablespace test online;   //注意:此时数据库状态一直是open的。

 

9) 验证

 

SQL>select * from scott.t1;

 

NAME

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

a

 

再去查看一下控制文件和数据文件头的scn

SQL>alter system checkpoint;   可以将所有scn同步。

 

范例3:(recover datafile,database mount或open状态)

 

恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

 

在这个状态下先在OS下做一个数据文件和控制文件的冷备。如果前面有备份了,就不要做下面的了。

SQL> shutdown immediate

[oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf  /u01/back1 

[oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl  /u01/back1 

SQL> startup

 

1) 模拟环境:

 

SQL>insert into scott.t1 values('b');     //插入一行记录是为了使t1和备份有区别

SQL>commit;

SQL>select * from scott.t1;

 

NAME

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

a

b

 

SQL>delete scott.t1;    //注意:删掉了t1并没有提交,老值在UNDO里。

 

备份

2)在open 状态下删除datafile

[oracle@timran~]$ rm /u01/oradata/timran11g/undotbs01.dbf 

[oracle@timran~]$

                                                                                    

3)关闭数据库

SQL>shtudown abort   //abort埋下伏笔,等到完全恢复时会做UNDO回滚。

 

4) 启动数据库mount

SQL>startup mount

...

数据库装载完毕。 (Database mounted)

ORA-01157:无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

ORA-01110:数据文件 3: '/u01/oradata/timran11g/undotbs01.dbf'

 

5)还原并恢复UNDO数据文件

 

[oracle@timrantimran11g]$ cp /u01/back1/undotbs01.dbf ./

 

SQL>recover datafile 3;

完成介质恢复。

 

6)打开数据库(会完成UNDO表空间数据的回滚)

 

SQL>alter database open;

 

数据库已更改

 

7) 验证

SQL>select * from scott.t1;

 

NAME

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

a

b

 

 

3.7 手工完全恢复特点小结:

 

3.7.1 recover database    (全部或大部分数据文件损坏,mount下进行)

 

OS: 使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)

SQLPLUS:

1)recoverdatabase;

2)alterdatabase open;

 

3.7.2 recover tablespace XXX (针对表空间的非关键数据文件损坏,一般是open下进行)

 

OS:使用cp 还原该表空间XXX下的所有数据文件

SQLPLUS:

1)altertablespace XXX offline;   或者altertablespace XXX offline immediate;

2)recovertablespace XXX;

3)altertablespace XXX online;

 

3.7.3 recover datafile XXX  (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)

 

OS:cp 还原相关的关键数据文件(mount)

SQLPLUS:

1)recoverdatafile 6,8;

2)alterdatabase open;

 

OS:cp 还原相关的非关键数据文件(open)

SQLPLUS:

1)alterdatabase datafile 6,8 offline; 或者alter database datafile 6,8 offline immediate;

2)recoverdatafile 6,8;

3)alterdatabase datafile 6,8 online; 

大家好,今天讲手工恢复dbr。就拿u盘来讲吧。手工恢复其实就是改bpb表的几个字节。大家看我的演示吧。声音录制不上,只能这样打字了。我就不拿实际恢复举例了,我就讲解一下,这几个自己怎么算。 大家看我的演示,打开winhex。这个就是u盘,大小64m的。扇区0,就是dbr。我给大家做了个ppt,大家看一下。大家看我画方框的地方,这就是要计算的这几个字节。一共5个。隐藏扇区不用算了,这个是0,因为没有分区表。扇区大小,要是硬盘的话,就根据分区表填写,这里是128640,看左下角。 在就是每簇扇区数,根项目,和保留扇区。每簇扇区数有个公式,大家看一下。上面的是fat16的,下面的是fat32的。大家根据这个公式计算就可以了,保留扇区,fat16的一般是2个, 扇区2就是fat表了,所以保留2个扇区,就是这样计算。硬盘就搜fat表,找到fat表以后, 就知道保留了几个扇区了。还有就是根项目,这个一般是512,要是pq调整过的话, 就找FDT起始扇区,有fat2起始扇区和长度就很容易得到fdt的起始扇区。 查找到没有数据(也就是全0)后,继续找,找到个非0扇区,也就是数据区 开始扇区,由此就得到fdt的扇区数,在根据每文件目录登记项占用32个字节 就可以算出引导记录数。在转换为16进制,填写在bpb表处就可以了。 位置看这个图。我话方框的地方。 fat32的恢复和这个差不多。大家有不明白的在问。QQ597911642.今天就讲这些吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

victoruu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值