手工备份与恢复
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;