一. Rman备份与恢复
-
Rman工具简介
RMAN(Recovery Manager)是随Oracle服务器软件一同安装的工具软件,它可以用来备份和恢复数据库文件、归档日志和控制文件,用来执行完全或不完全的数据库恢复。与传统工具相比,RMAN具有独特的优势:跳过未使用的数据块。当备份一个RMAN备份集时,RMAN不会备份从未被写入的数据块,而传统的方式无法获知那些是未被使用的数据块。RMAN使用Oracle特有的二进制压缩模式,与传统备份的压缩方式相比,能够最大程度地压缩数据块中的一些典型数据。 -
使用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. 异机还原恢复
异机还原恢复需要注意:
- 在目标服务器上需要安装数据库软件。
- 在目标服务器上安装软件时选择仅安装数据库软件选项,这里不建库
- 安装好数据库软件后需要通过命令新建数据库SID
- 在源端服务器上需要生成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;
至此恢复完成。
现在可以去检查数据库的数据了。