oracle的备份与恢复(2)

手工备份与恢复

1. 手工备份和恢复的命令

1)备份和还原都使用 OS 命令,如 linux 中的 cp

2)恢复用 sqlplus 命令:recover

2. 备份前要对数据库进行检查:

1) 检查需要备份的数据文件

SQL> select name from v$datafile;                                             
SQL> select file_id,file_name,tablespace_name from dba_data_files;   

2)检查要备份的控制文件

SQL> select name from v$controlfile;

3)在线 redo 日志不需要做备份

3. dbv 检查数据文件是否有坏块

在手工备份前,应该检查 datafile 是否有坏块,备份完后对备份也要做检查。

对某个 datafile 做坏块检查

[oracle@prod admin]$ dbv file=/u01/oradata/prod/users01.dbf feedback=50

DBVERIFY - 开始验证: FILE = /u01/oradata/prod/users01.dbf

.......

4. 手工一致性备份(冷备)的注意事项:

1)必须干净的关闭数据库,以保证数据一致性。

SQL>shutdwon immediate;

2)在 OS 下必须备份所有数据文件

3)在 OS 下必须备份控制文件(至少备份一个)

4)对于非归档和归档的备份恢复策略有区别

4a)非归档备份还原策略

不需要备份在线日志,恢复时还原所有备份,重建所有在线日志, 没有 recover 步骤。

SQL>startup mount
SQL>alter database clear logfile group n(所有在线日志)
SQL>alter database open;

4b)归档备份还原策略

备份当前日志(必须,否则需要 clear unarchived,造成归档缺失),恢复时还原所有备份,重建非当前

日志

SQL>startup mount
SQL>alter database clear logfile group n; (非当前日志) 
SQL>recover database;
SQL>alter database open;

5. 手工非一致性备份(热备份)的执行方式及热备份的监控(v$backup)

注意:对只读的表空间不能做热备份,临时表空间不需要备份,特别强调:NOARCHIVE 模式下不支持手工热备(考点)。

1)在备份前要进入热备模式,备份后要结束热备模式

执行 begin backup 设置备份模式(在数据文件上生成检查点,写入 scn ,将来恢复的时候以此 scn 为起点)

对整个数据库设置热备模式:SQL> alter database begin backup

对整个数据库结束热备模式:SQL> alter database end backup;

对单个表空间设置热备模式:SQL> alter tablespace users begin backup;

对单个表空间结束热备模式:SQL> alter tablespace users end backup;

2)手工热备利用 v$backup 监控

例;

SQL> alter tablespace test begin backup; 
SQL> select file#,checkpoint_change# from v$datafile_header;
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            2414314
         2            2414314
         3            2414314
         4            2414314
         5            2414314
         6            2430480          //在备份期间 ,scn 被冻结,它是恢复阶段运用日志的起点。
         7            2414314
SQL> select * from v$backup;
     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- -------------------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 ACTIVE                   2430480 2012-07-30 11:07:19     
         7 NOT ACTIVE                  0

//STATUS 是 ACTIVE,表示可以备份相应的数据文件。

$cp test01.dbf test01.bak

备份完毕,尽快执行 end backup

SQL> alter tablespace test end backup;                                          
SQL> select * from v$backup;
     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- -------------------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  2430480 2012-07-30 11:07:19
         7 NOT ACTIVE                  0

如果在 end backup 之前发生数据库 abort,那么可以在下次启动到 mount 时 end backup,从而完成实例

恢复。

6. 关于 手工热备的 split block 问题

我们知道一个 Oracle block 一般包含多个 OS block,,当手工热备时,OS 的 cp 单位不是 Oracle

block 而是 OS block,而 Oracle 的 DBWR 又可能不时的从内存中刷新 Oracle block(脏块)到磁盘上,

如此,OS 级的拷贝便可能造成:一个 Oracle Block 是由不同的版本组成,比如未被 DBWR 刷新 Header block 加上另一部分被刷新的 foot block,这样 cp 出来的 Oracle blcok 就是 split block。

数据库的一致性是不允许 oracle block 是 split 的, Oracle 采取的办法是:在 backup mode 后,如果

发现首次 DBWR 要写脏块,则将该块被刷新之前的镜像数据记录到 redo buffer,这样,虽然 cp 后的文件里仍然含有 split block,而当需要恢复时,日志会前滚该块的前镜像,以保证所有被恢复的 oracle

block 是一个完整的版本。这就是我们常常发现在热备时日志文件会急剧增大的原因。

*考点:手工热备不能备份临时表空间,甚至不能将它们置于备份模式。

手工完全恢复

1. 完全恢复

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

2. 完全恢复的步骤

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

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

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

recover database: 包括 system 表空间损坏或大部分 datafile 丢失,一般是在 mount 状态完

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

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

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

考点:哪些文件是关键文件:四个:1)system01 file 2) undotbs file 3)control file 4)current log file

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

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

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

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

5. 非归档模式下只能做全备的完整还原

还原后仍会缺失联机日志文件(因为只备数据文件和控制文件),

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

6. 手工完全恢复的实验

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

是完整的。

范例 1:recover database 说明:由于 media failure 关键 system01.dbf 损坏,

sys:

SQL> select * from scott.test;
        ID
----------
         1

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

SQL> shutdown immediate

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

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

[oracle@prod ~] $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> select * from scott.test;
        ID
----------
         2
         3 //这条记录未提交,恢复时会回滚掉
         1

1)模拟介质失败

[oracle@prod ~]$ rm /u01/oradata/prod/system01.dbf //数据库在打开的情况下就删除

关键文件

$sqlplus / as sysdba //换个 session 登录,然后关闭数据库

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

2)启动 database,报错!

SQL> startup

SQL>select file#,error from v$recover_file;

3)首先还原 system01.dbf 数据文件

[oracle@prod ~]$ cp /u01/back1/system01.dbf /u01/oradata/prod

比较控制文件和数据文件头的 SCN

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

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

4)恢复 database

SQL> recover database;

5)打开数据库

SQL> alter database open;

6)验证

SQL> select * from scott.test;
        ID
----------
         2
         1

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

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

模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成 Oracle 崩溃, 我们只

需针对个别有问题的 tablespace 去做单独的在线恢复操作,也就是说恢复时数据库整体是 online 的,而局

部表空间是 offline 的,数据库不需要 shutdown。

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

1)了解一下当前状态,在 test 表空间上建立 scott.t1 表,

SQL> conn scott/scott
SQL> create table t1 (id int) tablespace test;
SQL> insert into t1 values(1);
SQL> commit;
SQL> select * from t1;
NAME
--------------------------------------------------
1

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

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

[oracle@prod ~]$

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

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

SQL> conn / as sysdba //换个 session 登陆,访问 t1 表,因内存里已清除了

buffer 块,只好去做物理读,所以报错!

SQL> select * from scott.t1;

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)test 表空间 offline

SQL> alter tablespace test offline immediate; //immediate 使表空间能立即脱机,

不等 Oracle 对任何数据文件做检查

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

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

7)恢复 tablespace

SQL> recover tablespace test;

8)使表空间 online

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

9)验证

SQL> select * from scott.t1;
ID
--------------------------------------------------
1

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

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

mount 状态下恢复。

1) 模拟环境:

SQL> insert into scott.t1 values(2); //插入一行记录是为了使 t1 和备

份有区别

SQL> commit;

SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2

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

2)在 open 状态下删除 datafile

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

[oracle@prod ~]$

3)关闭数据库

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

4)启动数据库 mount

SQL> startup mount

...

数据库装载完毕。

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

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

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

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

SQL> recover datafile 3;

完成介质恢复。

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

SQL> alter database open;

数据库已更改

7) 验证

SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2

7. 手工完全恢复特点小结:

1, recover database (system01.dbf 或大部分数据文件损坏,mount 下进行)

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

SQLPLUS:

1)recover database;

2)alter database open;

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

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

SQLPLUS:

1)alter tablespace XXX offline;

2)recover tablespace XXX;

3)alter tablespace XXX online;

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

下进行)

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

SQLPLUS:

1)recover datafile 6,8;

2)alter database open;

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

SQLPLUS:

1)alter database datafile 6,8 offline;

2)recover datafile 6,8;

3)alter database datafile 6,8 online;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

早起晚睡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值