===============
数据库的完全恢复
===============
在归档模式下数据库完全恢复时,数据库所经过的状态如下:
1.利用备份修复(Restores)损坏或丢失的数据文件,即将备份的文件复制到数据库中原来的位置
2. 将从备份到系统崩溃这段时间所提交的数据由归档日志文件和重做日志文件中还原成数据文件所需要的数据块,这也叫前滚(Roll Forward)
3. 此时数据块中包含了所有提交的数据,也可能包含没提交的数据
4. 系统利用还原数据块回滚未提交的数据,这也叫回滚或者事务恢复(Recovery)
总结成公式就是: Restore将数据文件带回到过去(备份时间点)+Recover恢复从备份到数据文件崩溃这段时间所提交的数据 =>数据的完全恢复
数据恢复时的常用视图
v$reover_file --查询需要恢复的文件,该视图信息来自控制文件,如控制文件来自备份或重建过则信息会不准
v$archived_log --查询所有归档日志列表
v$recovery_log --查询所有需要用于恢复的日志
配置恢复自动使用归档日志
在介质恢复前通过设置set autorecovery on来自动应用归档日志实现恢复
也可以在输入归档日志路径、文件名时输入auto
使用recover automatic命令
恢复文件到新路径
使用操作系统命令恢复文件到新位置
使用alter database rename file '<dir>' to '<dir>'
一、Oracle完全恢复的方法的几种场景:
A. 数据库处于打开状态下,非系统数据文件丢失的恢复
适用情形:
适用于所需要的数据文件不属于系统表空间或还原/回滚段表空间
主要步骤:
1. 将数据文件置于脱机状态(alter database datafile n offline;)
2. 还原数据文件(restore)
3. 恢复数据文件(recover datafile n)
4. 使数据文件online (alter database datafile n online;)
4. 确认数据文件是否处于联机状态了
实例演示:
SQL> conn dog/dog 已连接。 SQL> !rm /u01/app/oracle/oradata/orcl/test.dbf --删除数据文件 SQL> select * from v$recover_file; --数据库还不知道数据文件需要恢复
SQL> alter system switch logfile; --对日志进心归档
SQL> alter system checkpoint; --执行检查点进程,将数据缓冲区内容写入到文件,因test.dbf已丢失,则告警日志将产生该记录 SQL> select * from v$recover_file; --发现文件丢失,需要恢复 5 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> alter database datafile 5 offline; SQL> ho cp /u03/backup/hotbak/test.dbf /u01/app/oracle/oradata/orcl/ SQL> recover datafile 5; --恢复数据文件5 完成介质恢复。 SQL> select * from v$recover_file;
SQL> alter database 5 online; SQL> alter database datafile 5 online; --使数据文件联机 SQL> select file#,status from v$datafile; --查看状态 1 SYSTEM 2 ONLINE 3 ONLINE 4 ONLINE 5 ONLINE
B. 数据库处于关闭状态下的恢复
适用情形:
包括系统表空间(系统数据文件)、Undo 表空间、整个数据库
主要步骤:
- 关闭实例(shutdown immediate或者shutdown abort;)
- 还原数据文件
- 使用归档日志更新到最新
- 打开数据库
演示:
--删除数据库的数据文件
SQL> !rm /u01/app/oracle/oradata/orcl/*dbf SQL> !ls /u01/app/oracle/oradata/orcl/ control01.ctl redo01.log redo02.log redo03.log
--关闭数据库
SQL> conn / as sysdba 已连接。 SQL> shutdown immediate; ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01116: 打开数据库文件 1 时出错 ORA-01110: 数据文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf' ORA-27041: 无法打开文件 Linux-x86_64 Error: 2: No such file or directory Additional information: 3 SQL> shutdown abort; ORACLE 例程已经关闭。
--启动数据库
SQL> startup ORACLE 例程已经启动。 Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 528484664 bytes Database Buffers 268435456 bytes Redo Buffers 6737920 bytes 数据库装载完毕。 ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件 ORA-01110: 数据文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
--还原数据文件
SQL> select * from v$recover_file; 1 ONLINE ONLINE FILE NOT FOUND 2 ONLINE ONLINE FILE NOT FOUND 3 ONLINE ONLINE FILE NOT FOUND 4 ONLINE ONLINE FILE NOT FOUND 5 ONLINE ONLINE FILE NOT FOUND SQL> ho cp /u03/backup/hotbak/*.dbf $ORACLE_BASE/oradata/orcl/
--恢复数据文件,这里是自动寻取所需要的归档文件
SQL> recover datafile 1,2; 完成介质恢复。 SQL> select * from v$recover_file; 3 ONLINE ONLINE 2-16 19:11:28 4 ONLINE ONLINE 2-16 19:11:35 5 ONLINE ONLINE 2-16 19:11:20 SQL> recover database; 完成介质恢复。 SQL> select * from v$recover_file;
--打开数据库
SQL> alter database open;
C.数据初始状态处于关闭状态下由于硬件故障,且需要在打开状态下的恢复(非系统数据文件)
启动到mount状态
将受损的数据文件offline
打开数据库
还原受损的数据文件(restore)
恢复受损的数据文件(recover)
将受损的数据文件online
此场景类似于A场景仅仅是需要先启动到mount状态,然后再将受损的数据文件脱机,并打开数据库,使之能提供服务.因此该演示省略.
D.数据文件无备份情况下的恢复
适用场景:
所需要恢复的数据文件属于非系统表空间
控制文件未被重新创建或恢复到以前的版本(丢失数据文件的描述信息应在数据字典和控制文件中)
该数据文件从文件开始到丢失期间的所有日志必须存在
如果那个公司使用了这种方法,说明该公司的数据库管理维护很混乱。
步骤:-->先将丢失数据文件脱机-->重建数据文件-->应用归档日志-->联机恢复的数据文件
Oracle提供如下两个方法重建这个数据文件的结构命令:
alter database create datafile 'filename';
alter database create datafile 'filename' as 'new file name'; --可以放置到不同目录,一般用于原文件所在的目录已经损坏了
实例演示:
SQL> create table tb_bk2(id int,name varchar2(10)) tablespace bk2; SQL> insert into tb_bk2 values(1,'Dand'); SQL> commit; SQL> alter system checkpoint; SQL> alter system switch logfile; SQL> ho rm $ORACLE_BASE/oradata/orcl/bk02.dbf --模拟数据文件被损坏 SQL> insert into tb_bk2 values(2,'Luck'); SQL> commit; SQL> alter database datafile 6 offline; --使数据文件离线 SQL> select * from v$recover_file; 6 OFFLINE OFFLINE FILE NOT FOUND 0 SQL> alter database create datafile 6; --重建数据文件 SQL> recover datafile 6; 完成介质恢复。 SQL> alter database datafile 6 online; SQL> select * from tb_bk2; 1 Dand 2 Luck
二、数据库的不完全恢复
不完全恢复的几种常用方法:
recover database until cancel; --SQLPlus使用
recover database until time '2009-10-09:14:20:45' --SQLPlus与RMAN都支持
recover database unitl time '2009-10-09:14:20:45' using backup controlfile
recover database until change 329102 --SQLPlus使用
recover database until scn 329102 --RMAN使用
recover database until sequence 10 --RMAN使用
其实,这种不完全恢复很多都可用闪回技术进行恢复。
演示基于until time的恢复
先做一次冷备 脚本在:Oracle冷备份及其恢复
SQL> @coolbak.sql
在一个表里插入数据,并记录下时间
SQL> conn dog/dog 已连接。 SQL> create table users(id int,name varchar(20)); 表已创建。 SQL> insert into users values(1,'Scott'); 已创建 1 行。 SQL> commit; 提交完成。 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2016-12-17 02:35:24 SQL> insert into users values(2,'Keven'); 已创建 1 行。 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2016-12-17 02:36:17 SQL> commit; 提交完成。
关闭数据库,删除掉数据文件并从冷备中恢复过来
SQL> conn / as sysdba 已连接。 SQL> shutdown abort; ORACLE 例程已经关闭。 SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf SQL> ho cp /u03/backup/coolbak/*.dbf $ORACLE_BASE/oradata/orcl/
查看控制文件中记录的检查点和备份的数据文件头记录的检查点,并恢复到指定时间点
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 549456184 bytes Database Buffers 247463936 bytes Redo Buffers 6737920 bytes 数据库装载完毕。 SQL> select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094320 2 1094320 3 1094320 4 1094320 5 1094320 6 1094320 已选择6行。 SQL> select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1073554 2 1073554 3 1073554 4 1073554 5 1073554 6 1073554 已选择6行。 SQL> recover database until time '2016-12-17 02:35:24'; 完成介质恢复。
--使用resetlogs方式打开数据库,并查看表中的数据是否恢复到了指定的时间点
SQL> alter database open resetlogs; 数据库已更改。 SQL> conn dog/dog 已连接。 SQL> select * from users; ID NAME ---------- -------------------- 1 Scott
可以看出确实恢复到了指定的时间点
--再次查看文件头,是否也已经一致了。
SQL> select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094761 2 1094761 3 1094761 4 1094761 5 1094761 6 1094761 已选择6行。 SQL> select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094761 2 1094761 3 1094761 4 1094761 5 1094761 6 1094761 已选择6行。
基于Until Cancel的不完全恢复
做好冷备
SQL> start /u03/backup/coolbak.sql
QL> conn dog/dog Connected. SQL> select * from person; ID NAME ---------- -------------------- 1 Keven SQL> insert into person values(2,'Scott'); 1 row created. SQL> commit; Commit complete. SQL> alter system switch logfile; --将日志写进归档 System altered. SQL> host strings /u03/ARCHLOG/1_2_930793088.dbf|grep Scott --归档中已经存在Scott记录 Scott SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott --未执行检查点时,数据文件中不存在Scott记录 SQL> alter system checkpoint; --执行检查点进程 System altered. SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott --执行后,数据文件中存在Scott记录 Scott SQL> insert into person values(3,'Jack'); --将Jack这条数据写进数据文件中,但是没有写到归档日志文件中 1 row created. SQL> commit; Commit complete. SQL> alter system checkpoint; System altered. SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Jack Jack, SQL> alter database backup controlfile to trace as '/tmp/control.sql'; --备份控制文件 Database altered. SQL> ho rm -f $ORACLE_BASE/oradata/orcl/* -- 数据文件,控制文件,日志文件将全部丢失 SQL> conn / as sysdba Connected. SQL> shutdown abort --强制关机 ORACLE instance shut down. SQL> host cp /u03/backup/coolbak/*.dbf /$ORACLE_BASE/oradata/orcl/ --仅对数据文件进行还原
--修改前面备份的控制文件如下,手动来创建控制文件
vim /tmp/control.sql
STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf', '/u01/app/oracle/oradata/orcl/sysaux01.dbf', '/u01/app/oracle/oradata/orcl/undotbs01.dbf', '/u01/app/oracle/oradata/orcl/users01.dbf', '/u01/app/oracle/oradata/orcl/test.dbf', '/u01/app/oracle/oradata/orcl/bk02.dbf' CHARACTER SET AL32UTF8 ;
--执行重建控制文件的脚本
SQL> shutdown abort ORACLE instance shut down. SQL> start /tmp/control.sql ORACLE instance started. Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 595593528 bytes Database Buffers 201326592 bytes Redo Buffers 6737920 bytes Control file created.
--恢复文件
SQL> recover database using backup controlfile until cancel; ORA-00279: change 1075471 generated at 12/20/2016 19:59:42 needed for thread 1 ORA-00289: suggestion : /u03/ARCHLOG/1_1_931117309.dbf ORA-00280: change 1075471 for thread 1 is in sequence #1 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} --1_1_931117309.dbf不存在,还没有生成归档,而是在联机日志文件中,联机日志丢失,输入cancel
cancel
Media recovery cancelled.
SQL> alter database open resetlogs;
Database altered.
SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' 2 size 31457280 reuse autoextend on;
Tablespace altered.