Oracle数据库的RMAN备份与恢复

Oracle RMAN 备份恢复

1.什么是RMAN

RMAN在数据库服务器的帮助下实现数据库文件、控制文件、数据库文件和控制文件的映像副本,以及归档日志文件,数据库服务器参数文件的备份。RMAN也允许使用脚本文件实现数据的备份与恢复,而且这些脚本保存在数据库内,而不需要编写基于OS的脚本文件。RMAN备份的文件自动保存在一个系统指定的目录下,文件的名称也由RMAN自己维护。当实现数据库恢复操作时,恢复指令简洁,RMAN自动寻找需要的文件实现数据恢复。减少了传统的导出程序中人为错误的发生。

2.RMAN有什么优点

  • · 支持增量备份:RMAN采用备份级别实现增量备份,在一个完整备份的基础上,采用增量备份,和传统的备份方式相比,减少了备份的数据量。
  • · 自动管理备份文件:RMAN备份的数据是RMAN自动管理的,包括文件名字,备份文件存储目录,以及识别最近的备份文件,搜索恢复时需要的表空间、模式或数据文件等备份文件。
  • · 自动化备份与恢复:在备份和恢复操作时,使用简单的指令就可以实现备份与恢复,且执行过程完全由RMAN自己维护。
  • · 不产生重复信息:使用RMAN的联机备份不产生重做信息。
  • · 恢复目录:RMAN的自动化备份与恢复功能应该归功于恢复目录的使用,RMAN直接在其中保存了备份和恢复脚本。
  • · 支持映像复制:使用RMAN也可以实现映像复制,映像是以操作系统上的文件格式存在,这种复制方式类似于用户管理的联机备份方式。
  • · 新块的比较特性:这是RMAN支持增量备份的基础,该特性使得备份时,跳过数据文件中从未使用过的数据块的备份,备份数据量的减少直接导致了备份存储空间需求和备份时间的较少。
  • · 备份的数据文件压缩处理:RMAN提供了一个参数说明是否对文件进行压缩,压缩的备份文件以二进制格式存在,可以减少占用的存储空间。
  • · 备份文件有效性检查功能:在恢复前往往需要验证备份文件的有效性。

3.快闪恢复区

快闪恢复区是存储与备份和恢复数据文件以及相关信息的存储区。快闪恢复区保存了每个数据文件的备份、增量备份、控制文件备份以及归档重做日志备份。Oracle也允许在快闪恢复区中保存联机重做日志的冗余副本以及当前控制文件的冗余副本,还有Oracle中闪回特性中的闪回日志也保存在快闪恢复区中。

· 快闪恢复区的优点:实现了备份文件的自动管理,是备份和恢复数据库更简单,并且可以几种管理磁盘空间,但要求恢复区的空间足够大,以容纳备份的数据。

4.相关参数设置

查看快闪恢复区的参数信息:

SQL> show parameter db_recovery_file_dest;

修改快闪恢复区的参数:

SQL> alter system set db_recovery_file_dest_size=2G

查看快闪恢复区的位置以及空间使用信息:

SQL> select name, space_limit, space_used, number_of_files from v$recovery_file_dest;

解决快闪恢复区的空间不足问题:

Method1:

SQL> alter system set db_recovery_file_dest_size=4G

Method2:

SQL> alter system set db_reocvery_file = '/u01/backup'

5.RMAN相关参数配置

rman配置参数

RMAN configuration parameters for database with db_unique_name PROD are:

① 保留策略(窗口时间、冗余级别)

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

② 备份优化

CONFIGURE BACKUP OPTIMIZATION ON;

③ 默认设备类型

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

④ 自动备份策略

CONFIGURE CONTROLFILE AUTOBACKUP ON;

⑤ 自动备份路径

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/backup/control/%F';

⑥ 备份级并行度

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

⑦ 备份映像路径

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

⑧ 归档日志文件路径

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

⑨ 配置通道

CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT  '/home/oracle/backup/%d_%T_%U.bak';

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default

CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/snapcf_PROD.f'; # default

实践环节

1.快闪恢复区

【1】无启用快闪恢复区时,要指定路径,下面以备份控制文件为例:

RMAN> connect target /
RMAN> backup current controlfile format '/u01/app/oracle/backup_ctl_%u.dbf';

【2】启用快闪恢复区时,无需指定路径,下面以备份控制文件为例:

RMAN> connect target /
RMAN> backup current controlfile;

【3】压缩备份数据库

RMAN> connect target
RMAN> backup as compressed backupset database;

2.联机备份

RMAN联机备份需要的准备工作:

SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>archive log list;

联机备份整个数据库·

RMAN> backup as compress backupset database plus archivelog delete all input;

觉得速度太慢了,怎么办?可以配多几个通道

RMAN> run {
  allocate channel ch1 device type disk;
  allocate channel ch2 device type disk;
  backup as backupset format '/u01/backup/%U'
  (datafile 1,4 channel ch1)
  (datafile 2,3,5 channel ch2);
  sql 'alter system archive log current';
}

3.备份语句

备份语句:

备份数据库:backup database;
备份表空间:backup tablespace users;
备份数据文件:
mkdir /u01/app
backup as backupset datafile 1 format '/u01/backup/datafile_1_%U';
备份控制文件:backup current controlfile;

4.增量备份

RMAN增量备份:

0级备份
RMAN> backup incremental level 0 database;
1级备份
RMAN> backup incremental level 1 database;

5.快速增量备份

快速增量备份:

前提:开启块跟踪
SQL> alter database enable block change tracking using file '/u01/app/oracle/oradata/chtrack.log';

检查:查看是否开启了快跟踪
SQL> select filename, status, bytes from v$block_change_tracking

更改:更改块跟踪文件的存储位置
SQL> alter database rename file '/u01/app/oracle/oradata/chtrack.log' to '/u01/app/oracle/oradata/chtrack1.log';

设定:禁用快跟踪特性
SQL> alter database disable block change tracking;

6.在映像副本上应用增量备份

RMAN> run {
               backup incremental level 1 for recover of copy with tag 'incr_copy_backup' database;
               recover copy of database with tag 'incr_copy_backup'
               }

第一次执行:
语句1表示生成级别为1的tag值为incr_copy_backup,针对整个数据库并且应用于增量备份的映像副本。
语句2由于没有增量备份,因此不会执行,也不会报错。

第二次执行:
由于有了第一次的0级备份,因此会生成一个1级别的增量备份,执行第二条语句时,会将第一条语句生成的增量备份应用到第一次所生成的映像副本上,以后的每一次都会生成一个增量备份,并将生成的增量备份应用到映像副本上。若需要恢复,先恢复映像副本,然后再应用最近一次增量备份以来的所有归档日志,就可以实现数据库的完全恢复。

创建和维护恢复目录

恢复目录保存了RMAN信息库的信息,Oracle建议使用恢复目录保存RMAN信息库,再信息库中保存了数据文件备份集或映像复制。表空间和数据文件信息以及RMAN的配置信息,使用恢复目录RMAN在一定条件下读取目标库的控制文件来更新恢复目录中保存的关于控制文件、数据文件等信息。

Step1:创建一个表空间(prod数据库)
SQL> create tablespace rcat_tbs temporary datafile '/u01/app/oracle/oradata/rcat_tbs01.dbf' size  100m;

Step2:创建恢复目录用户
SQL> create user rcat_owner identified by oracle default tablespace rcat_tbs temporary tablespace temp;
SQL> alter user rcat_owner quota unlimited on rcat_tbs;

Step3:为恢复目录用户授权
SQL> grant recovery_catalog_owner to rcat_owner;
SQL> grant connect, resource to rcat_owner;

Step4:连接到目录数据库并创建恢复目录
[oracle@ocm ~]$ rman catalog rcat_owner/oracle@prod
RMAN> create catalog tablespace rcat_tbs;

Step5:在恢复目录中注册目标数据库
[oracle@ocm ~]$ rman target system/oracle@oracle catalog rcat_owner/oracle@prod
RMAN> register database;
RMAN> resync catalog;

RMAN脚本管理

Step1:创建RMAN备份脚本
RMAN> create script rman_backup {
   sql 'alter system checkpoint';

   backup database format '/u01/backup/offline_backup/back_%u.dbf';

   backup current controlfile format'/u01/backup/offline_backup/back_ctl_%u.dbf';
}


Step2:执行脚本
RMAN> run {execute script rman_backup;}


Step3:调用操作系统文件执行RMAN指令
[oracle@ocm ~]$ rman target system/oracle@oracle catalog rcat_owner/oracle@prod cmdfile 'rman_backup.rcv'


Step4:将脚本文件转换为操作系统文件

RMAN> print script rman_backup to file 'rman_backup.txt';

RMAN非归档模式下的完全恢复

1、控制文件、数据文件、重做日志文件丢失的恢复

SQL> startup mount;

[oracle@ocm ~]$ rman target system/oracle
RMAN> backup as compressed backupset database;
SQL> create table test1 as select * from dba_segments;

2.模拟删除所有控制文件、数据文件、重做日志文件

[oracle@ocm ~]$ rm -rf u01/app/oracle/oradata/orcl/*.*

恢复控制文件:
RMAN> restore controlfile from '/u01/app/c-201919196718-20190401'
启动数据库到mount状态:
SQL> alter database mount;
恢复数据库
RMAN> restore database;
RMAN> recover database noredo;
检验:创建的表是否存在
SQL> select count(*) from test1;

注意:此时表的数据已经全部丢失。也就是说自上次备份以来的所有数据全部丢失。

3、只有数据文件丢失

模拟丢失数据文件

[oracle@ocm ~]$ rm -rf users01.dbf
SQL> startup;  //报错

使用RMAN恢复该数据文件

RMAN> restore datafile 4;

恢复数据文件

RMAN> recover datafile 4;

【注】以上过程没有覆盖日志文件,当日志文件被覆盖之时,需要使用一下命令实现不完全恢复。

RMAN> recover datafile 4 until cancel;

根据提示,直接输入cancel,在介质恢复完成后,使用resetlogs打开数据库。

4、联机重做日志文件和数据文件损坏的恢复

模拟丢失日志文件和数据文件

[oracle@ocm ~]$ rm -rf *.dbf

[oracle@ocm ~]$ rm -rf *.log
SQL> startup force    //开启到mount状态
RMAN> restore database;
RMAN> recover database until cancel;
SQL> alter database open resetlogs;

问:数据文件如何恢复到其他磁盘目录下?

RMAN> run {
   set newname for datafile '/u01/app/oracle/oradata/orcl/system01.dbf' to '/u02/app/oracle/oradata/orcl/system01.dbf';

   set newname for datafile '/u01/app/oracle/oradata/orcl/users01.dbf' to '/u02/app/oracle/oradata/orcl/users01.dbf';

   restore database from tag = TAG20180401t131419;
   switch datafile all;
}

RMAN归档模式下的完全恢复

1、丢失一个系统表空间对应的数据文件的恢复

需求:先为system表空间添加一个数据文件system02.dbf,存放至/newdata/orcl目录下,文件大小100m,使用sys用户在system表空间上创建表t1,表内容和u01用户的 t1表一致。

故障模拟:system02.dbf数据文件丢失

请解决故障,并找回sys.t1表

SQL> alter tablespace system add datafile '/newdata/orcl/system02.dbf' size 100m;
SQL> create table t1 tablespace system as select * from u01.t1;
[oracle@orcl orcl]$ rm system02.dbf
SQL> startup force(报错)

RMAN> run {
sql 'alter database datafile 7 offline';
restore tablespace system;
recover tablespace system;
sql ' alter database datafile 7 online';
sql ' alter database open';
}

2、丢失一个非系统表空间的数据文件的恢复

问题描述:

u01用户在data01表空间上创建一张t2表,表内容和u01用户的t1表一致

故障模拟:data01.dbf数据文件丢失

请解决故障,并找回u01.t2

SQL> conn u01/oracle;
SQL> create table t2 tablespace data01 as select * from t1;

[oracle@orcl orcl]$ rm data01*.dbf
SQL> conn as sysdba
SQL> alter system flush buffer_cache;
SQL> conn u01/oracle
SQL> select * from t2;(报错)

RMAN> run {
sql 'alter database datafile 5,6 offline';
restore tablespace data01;
recover tablespace data01;
sql 'alter database datafile 5,6 online';
}

3、丢失一个非系统表空间的数据文件的恢复

问题描述:

u01用户在data01表空间上创建一张t3表,表内容和u01用户的t1表一致

故障模拟:data01.dbf数据文件丢失,并且由于磁盘损坏,原路径已经不能恢复,文件需要恢复至其他路径(自拟)

请解决故障,并找回u01.t3

SQL> conn u01/oracle;

SQL> create table t3 tablespace data01 as select * from t1;

[oracle@orcl orcl]$ rm data01*.dbf

SQL> conn as sysdba

SQL> alter system flush buffer_cache;

SQL> conn u01/oracle

SQL> select * from t3;(报错)

RMAN> run {
sql 'alter database datafile 5,6 offline';
set newname for datafile 5 to ‘/newdata/orcl/data01/data01a.dbf’;
set newname for datafile 6 to ‘/newdata/orcl/data01/data01b.dbf’;
restore tablespace data01;
switch datafile all;
recover tablespace data01;
sql 'alter database datafile 5,6 online';
}

4、丢失多个数据文件的恢复

问题描述:

自行在system,data01表空间上模拟数据

故障模拟:system01.dbf,data01.dbf,temp1表空间对应的数据文件丢失

请解决故障,并找回丢失的数据(请在第一时间恢复数据库对外服务提供,并且确保所有文件状态正常)

SQL> create table data tablespace system as select * from u01.t1;

SQL> create table data2 tablespace data01 as select * from u01.t1;

[oracle@orcl orcl]$ rm system01.dbf

[oracle@orcl orcl]$ rm temp01.dbf

[oracle@orcl data01]$ rm data01a.dbf

SQL> alter system flush buffer_cache;

SQL> select * from data; (强制弹出nolog)



[oracle@orcl dbs]$ kill -9 26993

[oracle@orcl dbs]$ sqlplus as sysdba

SQL> startup mount;

[oracle@orcl ~]$ rman target /
RMAN> run {
sql 'alter database datafile 1,3,5 offline';
restore database;
recover database;
sql 'alter database datafile 1,3,5 online';
sql 'alter database open';
}

5、丢失没有备份的数据文件的恢复

问题描述:

在备份后创建新表空间data02,对应数据文件/newdata/orcl/data02.dbf,数据文件大小20m

在该表空间上自行创建表,模拟数据

故障模拟:data02.dbf丢失

请解决故障,并找回丢失的数据

SQL> create tablespace data02 datafile '/newdata/orcl/data02.dbf' size 20m;

SQL> create table test(id int) tablespace data02;

SQL> insert into test values(1);

[oracle@orcl orcl]$ rm data02.dbf

切换一个会话,然后刷新,查询报错

SQL> alter system flush buffer_cache;

RMAN> run {
sql 'alter database datafile 7 offline';
restore datafile 7;
recover datafile 7;
sql 'alter database datafile 7 online';
}

6、丢失所有日志文件的恢复

故障模拟:丢失所有联机在线日志
请解决故障,并确保数据库恢复正常服务。

SQL> select * from v$logfile;
 SQL> select * from v$log;        当前日志组为1
 [oracle@orcl orcl]$ rm redo*
 SQL> alter system switch logfile;
 
 SQL>       数据库夯住了
 SQL> select * from v$log;        当前日志组为3
 SQL> alter database clear unarchived logfile group 1;
 SQL> alter database clear unarchived logfile group 2;
 SQL> shutdown immediate;
 SQL> startup mount;
 SQL> recover database until cancel;
 SQL> alter database open resetlogs;

7、丢失所有控制文件和spfile的恢复

故障模拟:删除所有控制文件和spfile
请解决故障,并确保数据库恢复正常服务。

1.catalog模式下同时丢失所有控制文件和参数文件:
SQL> select dbid from v$database;


SQL> show parameter control;

SQL> show parameter spfile;



 [oracle@orcl dbs]$ rm spfileorcl.ora

[oracle@orcl orcl]$ rm ora_control*

 SQL> startup force;
RMAN> run {
2> set dbid=1528042952;
3> restore spfile from autobackup;
4> shutdown immediate;
5> restore controlfile from autobackup;
6> startup mount;
7> recover database;
8> alter database open resetlogs;
9> }

nocatalog模式下同时丢失所有控制文件和参数文件:

SQL> select dbid from v$database;


SQL> show parameter control;

SQL> show parameter spfile;


[oracle@orcl dbs]$ rm spfileorcl.ora
[oracle@orcl orcl]$ rm ora_control*

SQL> startup force;
RMAN> run {
2> set dbid=1528042952;
3> restore spfile from '/newdata/orcl/backup/control/c-1528042952-20190218-09';
4> shutdown immediate;
5> restore controlfile from '/newdata/orcl/backup/control/c-1528042952-20190218-09';
6> startup mount;
7> recover database;
8> alter database open resetlogs;
9> }

8、基于时间点的不完全恢复

问题描述:

u01用户在data02表空间上创建一张t4表,表内容和u01用户的t1表一致

故障模拟:彻底删除t4表

使用基于时间点的不完全恢复找回t4表,将数据库以open resetlogs方式打开。

SQL> conn u01/oracle
SQL> create table t4 tablespace data02 as select * from t1;
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
SQL> select sysdate from dual;
SQL> drop table t4 purge;


RMAN> run {
2> startup force mount;
3> set until time =”to_date(‘2019-02-19 12:42:02',’yyyy-mm-dd hh24:mi:ss’)";
4> restore database;
5> recover database;
6> sql 'alter database open resetlogs';
7> }

9、删除所有备份,重新对数据库做0级备份。

run {
delete backupset;
backup incremental level 0 database tag 'levle0' format '/newdata/orcl/backup/%U';
}

你可能感兴趣的:(数据库,oracle)