Oracle 备份与还原方案Windows2008 Oracle11g

一. Rman备份与恢复

  1. Rman工具简介
    RMAN(Recovery Manager)是随Oracle服务器软件一同安装的工具软件,它可以用来备份和恢复数据库文件、归档日志和控制文件,用来执行完全或不完全的数据库恢复。与传统工具相比,RMAN具有独特的优势:跳过未使用的数据块。当备份一个RMAN备份集时,RMAN不会备份从未被写入的数据块,而传统的方式无法获知那些是未被使用的数据块。RMAN使用Oracle特有的二进制压缩模式,与传统备份的压缩方式相比,能够最大程度地压缩数据块中的一些典型数据。

  2. 使用rman工具之前需要了解
    2.1. Rman链接方式:
    查看数据库的信息:

C:\Users\Administrator>sqlplus / as sysdba
SQL> select instance_name,status from v$instance;
SQL> SELECT DBID,NAME,LOG_MODE FROM V$DATABASE;

在这里插入图片描述
本地链接:$ rman target /
在这里插入图片描述
远程链接:$ rman target sys/oracle@orcl
在这里插入图片描述
2.2. 基本指令:
2.2.1. 执行sql语句:

RMAN> sql 'alter system switch logfile';

在这里插入图片描述
2.2.2. Rman默认配置:
2.2.2.1. 默认配置显示:

RMAN> show all;

在这里插入图片描述
#default 表示该条配置仍然是初始的默认配置。
如果我们想把某条更改过的配置再置为初始应该怎么办呢,很简单,
用如下命令:CONFIGURE … CLEAR;
例如:

RMAN> CONFIGURE RETENTION POLICY CLEAR;

实例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.3. 主要默认配置解析:
2.3.1. CONFIGURE RETENTION POLICY 配置备份保留策略
两种保留策略:
基于时间:

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF n DAYS;

基于冗余数量:

CONFIGURE RETENTION POLICY TO REDUNDANCY n;

也可以取消备份保留策略:

CONFIGURE RETENTION POLICY TO NONE; 

2.3.2. CONFIGURE BACKUP OPTIMIZATION 配置备份优化
如果优化设置打开,将对备份的数据文件、归档日志或备份集运行一个优化算法。
备份优化,包括OFF 和ON 两个状态
打开备份优化:

CONFIGURE BACKUP OPTIMIZATION ON;

关闭备份优化:

CONFIGURE BACKUP OPTIMIZATION OFF;

2.3.3. CONFIGURE DEFAULT DEVICE TYPE 配置IO 设备类型
RMAN 支持的 IO 设备类型有两种:磁盘(DISK)和磁带(SBT),默认情况下为磁盘。
使用磁盘设备:

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

使用磁带设置:

CONFIGURE DEFAULT DEVICE TYPE TO SBT;

2.3.4. CONFIGURE CONTROLFILE AUTOBACKUP 配置控制文件自动备份
是否自动备份,包含两个状态:OFF 和ON
打开自动备份

CONFIGURE CONTROLFILE AUTOBACKUP ON;

禁止自动备份

CONFIGURE CONTROLFILE AUTOBACKUP OFF;

同时可以通过如下配置指定备份的控制格式,路径。例如:

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ' D:\oraclebak\rmanback\autoctl\%F';

在备份期间,将产生一个控制文件的快照,用于控制文件的读一致性,这个快照可以通过如下配置:

CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\SNCFORCL.ORA';

2.3.5. CONFIGURE DEVICE TYPE 设置并行备份
RMAN 支持并行备份与恢复,也可以在配置中指定默认的并行程度。例如:CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
指定在以后的备份与恢复中,将采用并行度为2,同时开启2个通道进行备份与恢复,当然也可以在run 中指定通道来决定备份与恢复的并行程度。
默认情况下,自动分配通道的并行度为1,如果你通过设置PARALLELISM 设置了并行通道为2,那么在run 块中,如果你没有单独通过ALLOCATE CHANNEL 命令指定通道,它会默认使用2 条并行通道,如果你在run 命令块中指定了数个ALLOCATE CHANNEL,那么rman 在执行备份命令时会以你设置的channel 为准,而不管configure中配置了多少个并行通道。
需要注意的一点是,在backup 命令中有一个FILESPERSET参数该参数是指rman建立的每个备份集中所能包含的备份片段(即磁盘文件)的最大数,该参数默认值为64,如果在执行backup 命令时没有指定该参数值,那么rman 会仅使用第一个通道来执行备份,其它通道将处于空闲状态。filesperset 值不要小于你设定的通道数。

2.3.6. CONFIGURE DATAFILE BACKUP COPIES 设置备份文件冗余度

2.3.7. CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT ’ D:\oraclebak\rmanback\databak\DB_ORCLBAK_%U’;
设置RMAN默认备份介质保存目录 D:\oraclebak\rmanback\databak

2.3.8. CONFIGURE MAXSETSIZE 配置备份集的最大尺寸
该配置限制通道上备份集的最大尺寸。单位支持bytes,K,M,G。默认值是unlimited。

RMAN> show channel; // 通道分配
RMAN> show device type; // IO 设备类型
RMAN> show retention policy; // 保存策略
RMAN> show datafile backup copies; // 多个备份的拷贝数目
RMAN> show maxsetsize; // 备份集大小的最大值
RMAN> show exclude; // 不必备份的表空间
RMAN> show backup optimization; // 备份的优化

2.4. Format字符串替换变量
使用FORMAT 参数时可使用的各种替换变量,如下:
%c:备份片的拷贝数(从1 开始编号);
%d:数据库名称;
%D:位于该月中的天数(DD);
%M:位于该年中的月份(MM);
%F:一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII 为该数据库的DBID,YYYYMMDD 为日期,QQ 是一个1-256 的序列;
%n:数据库名称,并且会在右侧用x 字符进行填充,使其保持长度为8;
%u:是一个由备份集编号和建立时间压缩后组成的8 字符名称,利用%u 可以为每个备份集生成一个唯一的名称;
%p:表示备份集中备份片段的编号,从1 开始编号;
%U:是%u_%p_%c 的简写形式,利用它可以为每一个备份片段(即磁盘文件)生成一个唯一名称,这是最常用的命名方式;
%s:备份集的号;
%t:备份集时间戳;
%T:年月日格式(YYYYMMDD);s
注:如果在BACKUP 命令中没有指定FORMAT 选项,则RMAN 默认使用%U 为备份片段命名。

2.5. RMAN 备份相关的动态性能表
V $ ARCHIVED_LOG:本视图包含了所有归档重做日志文件的创建情况,备份情况以及其他信息。
V $ BACKUP_CORRUPTION:这个视图显示了RMAN 在哪些备份集中发现了损坏的数据坏。在你使用BACKUP VALIDATE 命令对备份集进行检查时如果发现了损坏的数据块, RMAN 将在这个视图中写入记录。
V $ COPY_CORRUPTIO:本视图显示了哪些镜像复制备份文件已经被损坏。
V $ BACKUP_DATAFILE:本视图通常用来获取每个数据文件中非空白数据块的数量,从而帮助你创建出大小基本相等的备份集。另外,在视图中也包含了数据文件中损坏的数据块的信息。
V $ BACKUP_REDOLOG:本视图显示了在现有的备份集中饮食有哪些归档重做日志文件。
V $ BACKUP_SET:本视图显示了已经创建的备份集的信息。
V $ BACKUP_PIECE:本视图显示了已经创建的备份片段的信息。

2.6. 备份信息
2.6.1. 列出备份信息

 列出数据库中所有文件的备份信息:
 RMAN>LIST BACKUP OF DATABASE;

 列出指定表空间的备份信息:
 RMAN>LIST COPY OF TABLESPACE 'SYSTEM';

 列出指定数据文件的备份信息:
 RMAN>LIST BACKUP OF DATAFILE
 ' D:\app\Administrator\oradata\orcl\USERS01.DBF';

2.6.2. 删除备份信息

2.6.2.1. 删除陈旧备份
当使用 RMAN 执行备份操作时,RMAN 会根据备份冗余策略确定陈旧备份。

RMAN> delete obsolete;

2.6.2.2. 删除 EXPIRED 备份
执行 crosscheck 命令核对备份集,如果备份集丢失或者损坏,那么会将该备份集标记为 EXPIRED 状态。为了删除相应的备份记录,可以执行 delete expired backup 命令。

RMAN> delete expired backup;

2.6.2.3. 删除 EXPIRED 副本

RMAN> delete expired copy;

2.6.2.4. 删除特定备份集

RMAN> delete backupset 5;

2.6.2.5. 删除特定备份片

RMAN> delete backuppiece ' /u01/app/rmanback/databack/20180810/full_arch_03ta778l_1_1.rarch';

2.6.2.6. 删除所有备份集

RMAN> delete backup;

2.6.2.7. 删除特定映像副本

RMAN> delete datafilecopy ' D:\oraclebak\rmanback\databak\full_db_05ta77ck_1_1.rdbf';

2.6.2.8. 删除所有映像副本

RMAN> delete copy;

2.6.2.9. 在备份后删除输入对象

RMAN> delete archivelog all delete input;
RMAN> delete backupset 22 format = '' D:\oraclebak\rmanback\databak\%u.bak'' delete input;

备份备份集22后,删除原备份集的id 22;

3. 备份工具rman的使用
3.1. 检查数据库归档状态:
进入 sqlplus 使用下面命令检查:

SQL> archive log list

在这里插入图片描述
3.2. 开启归档及归档设置
先创建一个存放archive log的目录:mkdir $ORACLE_BASE/archdata
登陆sqlplus,设置归档路径:

SQL> alter system set log_archive_dest_1='location= D:\app\Administrator\archlivlog' scope=both;
SQL> select dest_name,destination,status,error from v$archive_dest where dest_name='LOG_ARCHIVE_DEST_1';

关闭数据库重新启动到mount阶段打开归档日志

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
SQL> startup mount    
ORACLE instance started.

Total System Global Area  776646656 bytes
Fixed Size                  2257272 bytes
Variable Size             507514504 bytes
Database Buffers          264241152 bytes
Redo Buffers                2633728 bytes
Database mounted.
SQL> 
SQL> alter database archivelog;  // 更新数据库为归档模式

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/archdata
Oldest online log sequence     5
Next log sequence to archive   7
Current log sequence           7
SQL> alter system switch logfile;   // 手动切换日志产生归档日志

3.3. Rman环境设置
3.3.1. 创建rman备份目录:
在这里插入图片描述
3.3.2. 使用rman链接到目标库:
在这里插入图片描述
3.3.3. 配置rman环境:

RMAN> configure retention policy to recovery window of 14 days;  //配置备份介质保留期为14天
RMAN> configure controlfile autobackup on;  //启动控制文件自动备份
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> configure controlfile autobackup format for device type disk to 'D:\oraclebak\rmanback\autoctl\autoctl_%F';   //配置控制文件自动备份保存目录和格式

3.3.4. 检查rman环境配置:
在这里插入图片描述
3.4. 备份与恢复数据
3.4.1. 全库备份

RMAN> backup full database format 'D:\oraclebak\rmanback\databak\full_db1_%U.dbf' include current controlfile plus archivelog format 'D:\oraclebak\rmanback\databak\full_arch1_%U.dbf' delete all input;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
备份完成后检查备份集
到备份目录下:
在这里插入图片描述
在这里插入图片描述
查看自动备份的控制文件
在这里插入图片描述
检查归档日志文件是否仍然存在:
在这里插入图片描述
3.4.2. 使用rman全库恢复
现在数据库是完好的,我们进行对数据破坏,然后使用之前的备份恢复数据库。现在开始:
首先模拟数据库数据文件删除的操作。
在这里插入图片描述
将数据文件改名:
如果修改数据文件,在windows系统中不能直接修改,需要先停止数据库及其全部服务。
开始 ==== >>运行====>>输入“services.msc”====>>标准 ====>>按 “O”键
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图中列出了全部的oracle服务
手动停止全部服务
在这里插入图片描述
在这里插入图片描述
修改数据文件名称或者前切到其他目录
这里我们将数据文件改名:
在这里插入图片描述
改名以后重新启动oracle的服务:
在这里插入图片描述
这里只启动两个主要的oracle服务:
在这里插入图片描述
重新打开一个cmd的命令行窗口链接到oracle 重启数据库:

C:\Users\Administrator>sqlplus / as sysdba
SQL> shutdown abort	         //  强制关闭数据库
SQL> startup				//启动数据库

在这里插入图片描述
数据库报错无法正常启动,显示是数据文件丢失!好了,破坏成功,现在恢复数据:
首先数据库恢复需要启动到mount状态,检查数据库状态:

SQL> select instance_name,status from v$instance;

在这里插入图片描述
这里我们看到数据库为mounted状态,正是我们要求的状态。如果需要启动到mount 阶段,命令: startup mount //启动数据库到mount 阶段
在这里插入图片描述
新打开cmd窗口使用rman链接到目标库:
在这里插入图片描述
进入RMAN看一看备份集,这些信息都是从control file读出的

RMAN> list backupset;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述的备份集中已经列出了我们备份的备份集,好了,现在开始恢复:

RMAN> restore database;

在这里插入图片描述
好的,恢复完成,我们检查数据文件是否已经全部回来了!
在这里插入图片描述
可以看到我们删除的数据文件都已经回来了,数据文件恢复成功!
不仅要restore还需要应用archive和redo log进行介质恢复

RMAN>recover database;  

在这里插入图片描述
把数据库恢复到最新状态才能顺利open

RMAN>alter database open; 

在这里插入图片描述
重新打开一个cmd窗口,使用sqlplus 链接到数据库检查数据库状态是否正常:
在这里插入图片描述
可以看到数据库已经处于open状态,状态正常!我们数据库恢复完成。
查看归档状态:
因为我们应用到最后一个日志,因此日志会接着前面继续顺延。
在这里插入图片描述
4. 场景演示
以下场景恢复环境需要了解:
A. 恢复的前提是已经做好备份
B. 完全恢复数据库是数据库遇到故障,在恢复时候没有丢失任何已经提交事物数据的恢复
不完全恢复数据库是数据库遇到故障,在恢复时候丢失部分数据的恢复
C. 当用resetlogs启动数据库时,应该要对数据库进行一次全备份

构建环境需要:

SQL>create tablespace mytest datafile 'D:\app\Administrator\oradata\orcl\MYTEST01.DBF' size 1024M autoextend on;
SQL> create user mytest default tablespace mytest identified by mytest account unlock;
SQL> grant create session,connect,resource to mytest;
SQL> grant select on SCOTT.EMP to mytest;
--# SQL> grant select on SCOTT.DEPT to mytest;
--# SQL> grant select on SCOTT.BONUS to mytest;
--# SQL> grant select on SCOTT.SALGRADE to mytest;

SQL> conn mytest/mytest
SQL> create table mytt1 as select * from scott.emp;
SQL> alter session set nls_date_format='yyyy-mm-dd';
SQL> select * from mytt1;
SQL> insert into mytt1 select * from mytt1;  ----(多执行几遍)
SQL> select count(*) from mytt1;

  COUNT(*)
----------
       896

对数据库进行全备:

C:\Users\Administrator>rman target /
RMAN> sql 'alter system switch logfile';
RMAN> backup full database format 'D:\oraclebak\rmanback\databak\full_db1_%U.dbf' include current controlfile plus archivelog format 'D:\oraclebak\rmanback\databak\full_arch1_%U.archf' delete all input;

4.1. 丢失数据文件,进行完全恢复
开始的实验基本就是将数据文件人为丢失然后做的完全恢复。
总结复习一下:
破坏数据文文件:MYTEST01.DBF ,删除掉这个数据文件,我这里将这个文件移走。
先关闭数据库:shutdown immediate 然后将文件剪切到其他地方
移走文件后重启启动数据库:startup
这时数据库会因为缺失数据文件MYTEST01.DFB 而无法正常启动,只能启动到数据库的mount阶段。
进入rman 开始恢复数据库

RMAN> restore database;
RMAN> recover database;
RMAN> alter database  open;

4.2. 丢失重做日志文件,进行不完全恢复
我们之前已经有了备份,现在强制关闭数据库,将redo日志迁移到其他地方,启动数据库报关于redo日志的错误。

SQL> shutdown abort
ORACLE 例程已经关闭。

直接剪切全部redo日志。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 1286066176 bytes
Fixed Size                  2175408 bytes
Variable Size             788532816 bytes
Database Buffers          486539264 bytes
Redo Buffers                8818688 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

在这里插入图片描述

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
orcl             MOUNTED

进行恢复:
参数 “_allow_resetlogs_corruption” 的默认值为FALSE,为TRUE时说明在破坏唯一性的情况下强制重置日志,打开数据库。在打开的过程中,ORACLE会跳过一致性检查,使数据库处于不一致的状态下打开。

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

修改后重启数据库

SQL> shutdown immediate;
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。

SQL>
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 1286066176 bytes
Fixed Size                  2175408 bytes
Variable Size             788532816 bytes
Database Buffers          486539264 bytes
Redo Buffers                8818688 bytes
数据库装载完毕。
SQL>

在这里插入图片描述

SQL> recover database until cancel;

在这里插入图片描述
上面出现报错,由于没有日志文件,破坏了数据库的一致性,所以必须先恢复数据库的一致性。之前修改了参数 “_allow_resetlogs_corruption”是忽略一致性启动数据库,所以这里的报错我们暂时忽略,下面我们使用 resetlogs 启动数据库是数据库重做日志文件。

SQL> alter database open resetlogs;

在这里插入图片描述

SQL> select instance_name,status from v$instance;

在这里插入图片描述

SQL> conn mytest/mytest
SQL> select table_name from user_tables;
SQL> select count(*) from mytt1;

在这里插入图片描述
将修改的参数"_allow_resetlogs_corruption"修改回默认值:false

SQL> conn / as sysdba
SQL> alter system set "_allow_resetlogs_corruption"=false scope=spfile;

在这里插入图片描述
重启数据库

SQL> shutdown immediate
SQL> startup

在这里插入图片描述
4.3. 丢失数据文件、控制文件和重做日志文件,进行不完全恢复

SQL> shutdown abort;			----模拟直接断电
ORACLE 例程已经关闭

关闭oracle service 的相关服务:
在这里插入图片描述
剪切全部的控制文件、数据文件和重做日志文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动oracle 的相关服务:
在这里插入图片描述
重新链接到数据库并检查数据库状态:

C:\Users\Administrator>sqlplus / as sysdba
SQL> select instance_name,status from v$instance;

在这里插入图片描述
上面看到数据库现在状态是started状态,这里我们先说一下数据库的三种启动状态:
NOMOUNT状态: 这里数据库主要读取参数文件spfile ,SGA和后台进程已经启动。这里在数据库中显示状态为:STARTED
MOUNT状态: 通过参数读取了控制文件 ,拥有sysdba权限的可以进行一些数据的备份和恢复操作,其他用户还不能访问 。这里在数据库中查到的状态为:MOUNTED
OPEN状态; 其他用户正常访问。这里数据库中显示的状态为:OPEN

到这里数据库已经读去了参数文件,但是其他文件全部丢失,我们需要通过备份来恢复这些文件:

链接到rman

C:\Users\Administrator>rman target /

在这里插入图片描述
由于之前我们已经开启了控制文件的自动备份功能,我们在使用rman备份的时候,系统都会自动根据我们的设置备份一份控制文件保留。 查看我们之前的备份文件集:
在这里插入图片描述
这里我们可以看到三次备份集,我们选择时间最近的一个备份集来恢复:
根据所选的备份集,我们继续查看系统自动备份的控制文件:
在这里插入图片描述
这里我们选择最新时间的控制文件来恢复数据库:

RMAN> restore controlfile from 'D:\oraclebak\rmanback\autoctl\AUTOCTL_C-1512174367-20180821-03';

在这里插入图片描述
控制文件恢复了,我们可以把数据库启动到mount阶段:

RMAN> alter database mount;

在这里插入图片描述

SQL> select instance_name,status from v$instance;

在这里插入图片描述
数据库启动到mount阶段,在rman中我们就可以读取到备份集列表:

RMAN> list backup;

通过备份集列表恢复数控的数据文件:

RMAN> restore database;

在这里插入图片描述
数据文件恢复完成。
下面我们就可以看到恢复的控制文件和数据文件,但是还缺少日志文件!
在这里插入图片描述
开始恢复日志文件:

SQL> recover database using backup controlfile until cancel;

在这里插入图片描述

SQL> alter database open resetlogs;

在这里插入图片描述

SQL> select instance_name,status from v$instance;

在这里插入图片描述
检查数据:

SQL> conn mytest/mytest
SQL> select count(*) from mytt1;

在这里插入图片描述
4.4. 丢失初始化文件、控制文件数据文件和重做日志文件,进行不完全恢复

SQL> shutdown abort;			----模拟直接断电
ORACLE 例程已经关闭。
关闭oracle service 的相关服务:

在这里插入图片描述
剪切全部的控制文件、数据文件和重做日志文件
在这里插入图片描述
改名SPFILE 文件:
在这里插入图片描述
启动oracle服务:
在这里插入图片描述
制造参数文件:
将下面路径D:\app\Administrator\admin\orcl\pfile下的 init 开头的文件拷贝到 D:\app\Administrator\product\11.2.0\dbhome_1\database这个目录下:
在这里插入图片描述
在这里插入图片描述
将文件改名为initorcl.ora 如下:
在这里插入图片描述
使用sqlplus 链接到oracle的空实例:
在这里插入图片描述
使用新的参数文件将数据库启动到nomount 阶段:

SQL> startup nomount pfile='D:\app\Administrator\product\11.2.0\dbhome_1\database\initorcl.ora'

在这里插入图片描述
在这里插入图片描述
下面开始恢复数据库的各种文件:
打开新的cmd窗口,使用rman工具链接数据库:

C:\Users\Administrator>rman target /

在这里插入图片描述
从备份集中恢复数据库参数文件:
查看备份集:
在这里插入图片描述
在这里插入图片描述
在rman工具中使用备份的控制文件备份集恢复参数文件:

RMAN> restore spfile from 'D:\oraclebak\rmanback\autoctl\AUTOCTL_C-1512174367-20180817-06'; 

在这里插入图片描述
在这里插入图片描述
参数文件恢复完成后,重启数据库使数据库读取其自己的参数文件启动到nomount阶段:

RMAN> shutdown immediate;
RMAN> startup nomount;

在这里插入图片描述

SQL> select instance_name,status from v$instance;

在这里插入图片描述
在rman中再使用控制文件备份集恢复数据库的控制文件:

RMAN> restore controlfile from 'D:\oraclebak\rmanback\autoctl\AUTOCTL_C-1512174367-20180817-06';

在这里插入图片描述
恢复完控制文件就可以将数据库启动到mount阶段:

RMAN> alter database mount;

在这里插入图片描述

SQL> select instance_name,status from v$instance;

在这里插入图片描述
数据库启动到mount阶段后开始使用控制文件中记录的备份集恢复数据文件:

RMAN> restore database;

在这里插入图片描述
数据文件恢复成功,但是此时我们还缺少redo日志文件来保持数据库的一致性,但是因为原数据库的日志文件全部丢失了,现在我们使用的是从备份恢复的文件,所以无法保证数据库的一致性,所以只能忽略数据的一致性。

SQL> recover database using backup controlfile until cancel;

这里会报错,忽略继续

SQL> recover database using backup controlfile until cancel;

这里提示介质恢复已取消。
在这里插入图片描述
然后以resetlogs 的方式打开数据库,使数据库重置redo日志文件:

SQL> alter database open resetlogs;

在这里插入图片描述
检查数据库状态以及验证数据:

SQL> select instance_name,status from v$instance;
SQL> conn mytest/mytest
SQL> select count(*) from mytt1;

在这里插入图片描述
4.5. 基于时间点的恢复(常用)
创建模拟环境:

SQL> conn mytest/mytest
SQL> select table_name from user_tables;

在这里插入图片描述

SQL> select count(*) from mytt1;

在这里插入图片描述

SQL> create table mytt2 as select * from scott.dept;
SQL> insert into mytt2 select * from mytt2;			----可以多执行几次
SQL> insert into mytt1 select * from mytt1;          ----可以多执行几次
SQL> create table mytt3(id int,name varchar2(20),passwd varchar2(20));
SQL> insert into mytt3 values (111,'ksdjflkksd','klasjdfklasjdfkl');
SQL> insert into mytt3 values (222,'wlw123','wlw321123');
SQL> insert into mytt3 values (333,'aaaaa','bbbbbbbb');
SQL> insert into mytt3 select * from mytt3;		---- 可以多执行几次
SQL> commit;

修改后的数据为:

SQL> select table_name from user_tables;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;
SQL> select count(*) from mytt3;

在这里插入图片描述
记录时间节点

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
SQL> select sysdate from dual;

在这里插入图片描述
修改数据库的数据:

SQL> conn mytest/mytest
SQL> truncate table mytt1;
SQL> truncate table mytt2;
SQL> truncate table mytt3;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;
SQL> select count(*) from mytt3;

在这里插入图片描述

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
SQL> select sysdate from dual;

在这里插入图片描述
好了,现在我们把数据库恢复到第一次记录的时间节点即:“2018-08-21 17:48:15”

SQL> conn / as sysdba
SQL> shutdown immediate;

在这里插入图片描述
将数据库启动到mount阶段:

SQL> startup mount

在这里插入图片描述
使用rman恢复数据库:

RMAN> restore database;

在这里插入图片描述

RMAN> sql 'alter session set nls_date_format = "yyyy-mm-dd hh24:mi:ss"';

在这里插入图片描述

RMAN> recover database until time '2018-08-20 16:02:29';

在这里插入图片描述

RMAN> alter database open resetlogs;

在这里插入图片描述
检查数据库和数据:

SQL> select instance_name,status from v$instance;
SQL> conn mytest/mytest;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;
SQL> select count(*) from mytt3;

在这里插入图片描述
至此已经将数据库恢复到第一次的时间节点。

4.6. 基于SCN的恢复
检查数据库的状态(和上面一样):

C:\Users\Administrator>sqlplus / as sysdba
SQL> select instance_name,status from v$instance;
SQL> conn mytest/mytest;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;
SQL> select count(*) from mytt3;

在这里插入图片描述
记录数据库的scn

SQL> conn / as sysdba
SQL> select current_scn from v$database;

在这里插入图片描述
修改数据库的数据:

SQL> conn mytest/mytest
SQL> insert into mytt1 select * from mytt1;			// 可多次执行
SQL> commit;
SQL> truncate table mytt2;
SQL> drop table mytt3;

检查修改后的数据库数据:

SQL> select table_name from user_tables;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;

在这里插入图片描述
开始恢复数据:

SQL> conn / as sysdba
SQL> shutdown immediate;

使用rman恢复数据:

C:\Users\Administrator>rman target /
RMAN> startup mount;

在这里插入图片描述

RMAN> restore database;

在这里插入图片描述
恢复到之前记录的scn号:1082044

RMAN> recover database until scn 1082044;

在这里插入图片描述
使用resetlogs模式打开数据库:

RMAN> alter database open resetlogs;

检查数据库状态和数据:

SQL> select instance_name,status from v$instance;
SQL> conn mytest/mytest
SQL> select table_name from user_tables;
SQL> select count(*) from mytt1;
SQL> select count(*) from mytt2;
SQL> select count(*) from mytt3;

在这里插入图片描述
至此将数据库恢复到了之前记录的scn号时的数据。

4.7. 异机还原恢复
异机还原恢复需要注意:

  1. 在目标服务器上需要安装数据库软件。
  2. 在目标服务器上安装软件时选择仅安装数据库软件选项,这里不建库
  3. 安装好数据库软件后需要通过命令新建数据库SID
  4. 在源端服务器上需要生成pfile文件

现在开始实验:
把源库的备份文件和参数文件全部拷贝到目标端。
拷贝到目标端的备份文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果源端数据库没有pfile文件则需要通过spfile文件创建pfile文件:

C:\Users\Administrator>sqlplus / as sysdba
SQL> create pfile='D:\app\Administrator\product\11.2.0\dbhome_1\database\INITorcl.ORA' from spfile;

在这里插入图片描述
参数文件:
在这里插入图片描述
将参数文件拷贝到目标端的 $ORACLE_HOME/database 目录下:
在这里插入图片描述
修改参数文件:
原参数文件:
在这里插入图片描述
修改后参数文件:

orcl.__db_cache_size=486539264
orcl.__java_pool_size=16777216
orcl.__large_pool_size=16777216
orcl.__oracle_base='E:\app\Administrator'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=520093696
orcl.__sga_target=771751936
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=234881024
orcl.__streams_pool_size=0
*.audit_file_dest='E:\app\Administrator\admin\orcl\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='E:\app\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL','E:\app\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.diagnostic_dest='E:\app\Administrator'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_dest_1='location=E:\app\Administrator\archivelog'
*.memory_target=1287651328
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

在这里插入图片描述
创建所需要的目录:
新建文件夹:oradata\orcl
路径:E:\app\Administrator\oradata E:\app\Administrator\oradata\orcl
在这里插入图片描述
在这里插入图片描述
打开cmd窗口使用命令创建一个新实例,并设置环境变量

C:\Users\Administrator>oradim -new -sid orcl
C:\Users\Administrator>set ORACLE_SID=orcl

在这里插入图片描述
链接数据库并使用修改后的参数文件启动数据库到nomount 阶段,并创建其spfile文件,重启数据库使数据库使用spfile文件启动到nomount阶段。

C:\Users\Administrator>sqlplus / as sysdba
SQL> startup nomount pfile='E:\app\Administrator\product\11.2.0\dbhome_1\database\INITorcl.ORA';
SQL> create spfile from pfile='E:\app\Administrator\product\11.2.0\dbhome_1\database\INITorcl.ORA';
SQL> shutdown immediate
SQL> startup nomount;

在这里插入图片描述
打开新的cmd窗口,设置环境变量 ORACLE_SID=orcl ,使用rman工具链接数据库恢复其控制文件:

C:\Users\Administrator>set ORACLE_SID=orcl
C:\Users\Administrator>rman target /	
RMAN> restore controlfile from 'E:\rmanback\rmanback\autoctl\AUTOCTL_C-1512174367-20180820-01';

在这里插入图片描述
控制文件恢复完成,将数据库启动到mount 阶段,将备份集添加到控制文件:

RMAN> alter database mount;
RMAN> catalog start with 'E:\rmanback\rmanback';

在这里插入图片描述
检查备份集并删除所有失效或者不存在的备份集:
检查备份集:

RMAN> crosscheck backup;

在这里插入图片描述
删除失效或者不存在的备份集

RMAN> delete expired backup;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再次检查备份集:

RMAN> crosscheck backup;

在这里插入图片描述

RMAN> report schema;

在这里插入图片描述
恢复数据库数据文件:

run{
set newname for datafile 1 to 'E:\app\Administrator\oradata\orcl\SYSTEM01.DBF';
set newname for datafile 2 to 'E:\app\Administrator\oradata\orcl\SYSAUX01.DBF';
set newname for datafile 3 to 'E:\app\Administrator\oradata\orcl\UNDOTBS01.DBF';
set newname for datafile 4 to 'E:\app\Administrator\oradata\orcl\USERS01.DBF';
set newname for datafile 5 to 'E:\app\Administrator\oradata\orcl\EXAMPLE01.DBF';
set newname for datafile 6 to 'E:\app\Administrator\oradata\orcl\MYTEST01.DBF';
restore database;
switch datafile all;
}

在这里插入图片描述
在这里插入图片描述
修改数据库中的redo日志文件:

SQL> select * from v$logfile;

在这里插入图片描述
这里可以看到我们的日志文件路径是D盘,而我们要恢复的路径是E盘的,所以需要修改日志文件路径:

SQL> alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' to 'E:\app\Administrator\oradata\orcl\REDO01.LOG';
SQL> alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' to 'E:\app\Administrator\oradata\orcl\REDO02.LOG';
SQL> alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' to 'E:\app\Administrator\oradata\orcl\REDO03.LOG';

在这里插入图片描述

SQL> select * from v$logfile;

在这里插入图片描述
数据库介质恢复

RMAN> recover database;

在这里插入图片描述
这里报错是因为日志文件,忽略报错,我们采用 resetlogs 方式打开数据库。

SQL> alter database open resetlogs;

在这里插入图片描述
至此恢复完成。
现在可以去检查数据库的数据了。

发布了57 篇原创文章 · 获赞 85 · 访问量 9611

猜你喜欢

转载自blog.csdn.net/qq_41944882/article/details/103398217