RMAN在数据库服务器的帮助下实现数据库文件、控制文件、数据库文件和控制文件的映像副本,以及归档日志文件,数据库服务器参数文件的备份。RMAN也允许使用脚本文件实现数据的备份与恢复,而且这些脚本保存在数据库内,而不需要编写基于OS的脚本文件。RMAN备份的文件自动保存在一个系统指定的目录下,文件的名称也由RMAN自己维护。当实现数据库恢复操作时,恢复指令简洁,RMAN自动寻找需要的文件实现数据恢复。减少了传统的导出程序中人为错误的发生。
快闪恢复区是存储与备份和恢复数据文件以及相关信息的存储区。快闪恢复区保存了每个数据文件的备份、增量备份、控制文件备份以及归档重做日志备份。Oracle也允许在快闪恢复区中保存联机重做日志的冗余副本以及当前控制文件的冗余副本,还有Oracle中闪回特性中的闪回日志也保存在快闪恢复区中。
· 快闪恢复区的优点:实现了备份文件的自动管理,是备份和恢复数据库更简单,并且可以几种管理磁盘空间,但要求恢复区的空间足够大,以容纳备份的数据。
查看快闪恢复区的参数信息:
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'
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】无启用快闪恢复区时,要指定路径,下面以备份控制文件为例:
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;
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';
}
备份语句:
备份数据库:backup database;
备份表空间:backup tablespace users;
备份数据文件:
mkdir /u01/app
backup as backupset datafile 1 format '/u01/backup/datafile_1_%U';
备份控制文件:backup current controlfile;
RMAN增量备份:
0级备份
RMAN> backup incremental level 0 database;
1级备份
RMAN> backup incremental level 1 database;
快速增量备份:
前提:开启块跟踪
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;
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;
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';
SQL> startup mount;
[oracle@ocm ~]$ rman target system/oracle
RMAN> backup as compressed backupset database;
SQL> create table test1 as select * from dba_segments;
[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;
注意:此时表的数据已经全部丢失。也就是说自上次备份以来的所有数据全部丢失。
模拟丢失数据文件
[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打开数据库。
模拟丢失日志文件和数据文件
[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;
}
需求:先为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';
}
问题描述:
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';
}
问题描述:
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';
}
问题描述:
自行在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';
}
问题描述:
在备份后创建新表空间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';
}
故障模拟:丢失所有联机在线日志
请解决故障,并确保数据库恢复正常服务。
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;
故障模拟:删除所有控制文件和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> }
问题描述:
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> }
run {
delete backupset;
backup incremental level 0 database tag 'levle0' format '/newdata/orcl/backup/%U';
}