Oracle在归档模式下恢复
===============
数据库的完全恢复
===============
在归档模式下数据库完全恢复时,数据库所经过的状态如下:
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.
Oracle在归档模式下恢复的更多相关文章
- oracle非归档模式下的冷备份和恢复
查看归档的相关信息 SQL> archive log list数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB ...
- Oracle非归档模式下脱机数据文件
正常情况下,要想对数据文件脱机,必须在归档模式下,这是ORACLE自动保护的一种措施,防止在非归档模式下对数据文件脱机,造成数据丢失.如果想在非归档模式下执行数据文件脱机操作,则需要加上“for dr ...
- Oracle之rman数据库在非归档模式下的备份和恢复
1.数据库在非归档模式下的备份 SQL> archive log list;数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FILE_DEST最早的联机日志序列 ...
- 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程
测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程 最近系统出现问题,由于数据库产生的日志量太大无法开启归档模式,导致offline的 ...
- 非归档模式下使用Rman进行备份和恢复
实验环境: 一.首先进行全库数据备份: 在非归档模式下,rman备份需要在mount模式下进行 SQL> select status from v$instance; STATUS ------ ...
- 使用alter database datafile 'XXX' offline drop 是否能够恢复(非归档模式下)
今天在群里面听到一位网友在说使用了alter database datafile 'XXX' offline drop命令是否能够恢复数据,在非归档模式下,下面是用一个实验来验证一下 ######## ...
- 07 oracle 非归档模式 inactive/active/current redo log损坏的恢复
在非归档模式下缺失Redo Log后的恢复 将之前的归档模式修改为非归档 SQL> shutdown immediate; SQL> startup mount SQL> alter ...
- 改变oracle数据库归档模式_译文
Changing the Database Archiving Mode 改变数据库归档模式. Purpose 目的 This module describes how you can change ...
- 把Oracle由归档模式改为非归档模式
把Oracle由归档模式改为非归档模式 开始–>运行命令cmd进入命令行模式 1. 使用命令sqlplus以无日志形式打开如下: sqlplus /nolog; 2. 连接数据库dev.worl ...
随机推荐
- spring02
1.在spring容器中的一个bean的整个生命周期 1.启动spring容器 2.bean实例化 3.装配属性 4.BeanNameAware:setBeanName 5.BeanFactoryAw ...
- OWASP WEB会话管理备忘单 阅读笔记
https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Session_ID_Properties 会话简介 HTTP是一种无状态 ...
- css3渐变色彩
CSS3 Gradient 分为线性渐变(linear)和径向渐变(radial).由于不同的渲染引擎实现渐变的语法不同,这里我们只针对线性渐变的 W3C 标准语法来分析其用法,其余大家可以查阅相关资 ...
- SQLite的使用--SQLite语句
一.SQLite的介绍 1.为什么要存储数据? 1.1 手机数据大多都是从网络加载的,不存储,每次滚动界面都要从新发送网络请求加载数据,浪费流量 1.2 当用户没网的时候, ...
- 记录重置css样式
;} ol,ul{;;} table {; } caption, th, td { font-weight: normal; text-align: left; } a img, iframe { b ...
- MSDeploy
http://blogs.iis.net/jamescoo/default.aspx Web Deployment Tool Now Works With Credential Store Feb ...
- 二叉树JAVA实现
为了克服对树结构编程的畏惧感和神秘感,下定决心将二叉树的大部分操作实现一遍,并希望能够掌握二叉树编程的一些常用技术和技巧.关于编程实现中的心得和总结,敬请期待!~ [1] 数据结构和表示: 二叉树的 ...
- 浅析firmware完整生存和使用流程 【转】
转自:http://blog.csdn.net/zhenwenxian/article/details/4677604 浅析firmware完整生存和使用流程 1. http://blog.china ...
- Yii2框架查询指定字段和获取添加数据的id
指定字段: $historyinfo = Healthy::find()->select(['healthy_id','pet_name','hardware_name','hardware_c ...
- windows进程详解
1:系统必要进程system process 进程文件: [system process] or [system process]进程名称: Windows内存处理系统进程描述: Windows ...