官方定义RMAN:
首先RMAN是一个与Oracle数据库集成的程序相当于数据库的一个功能不需要被单独安装。
RMAN的最小单位是文件,也就是说他是针对文件进行备份而不可以是某个表。
RMAN的连接方式:
1)本地连接:
[oracle@server1 app]$ echo $ORACLE_SID
proe
[oracle@server1 app]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Tue Jul 7 16:48:27 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: PROE (DBID=485315595)
RMAN>
2)网络连接:
[oracle@server1 ~]$ rman target sys/oracle@192.168.0.50:1521/server1
3)服务名连接:
[oracle@server1 ~]$ rman target sys/oracle@proe
1)backupset:备份集,只针对数据进行备份。
-compress buckupset,压缩备份集,只将备份目标文件中的数据部分抽取出来,不包含数据的地方跳过。
备份集:备份集是逻辑上的,它是所有备份片的集合,备份片才是物理上的,piece handle。
2)image copy:镜像拷贝,和原数据完全一样包括结构,可以让备份文件直接代替原文件。
测试这几种类别最终的大小:
镜像拷贝:
RMAN> backup as copy tablespace example format ‘/u01/app/backup/example_copy_%T‘;
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
output file name=/u01/app/backup/example_copy_20200707 tag=TAG20200707T171203 RECID=3 STAMP=1045156330
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
Finished backup at 07-JUL-20
备份集:
RMAN> backup as backupset tablespace example format ‘/u01/app/backup/example_bs_%T‘;
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-20
channel ORA_DISK_1: finished piece 1 at 07-JUL-20
piece handle=/u01/app/backup/example_bs_20200707 tag=TAG20200707T171524 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 07-JUL-20
不加 as backupset也可以,默认就是这个。
压缩备份集:
RMAN> backup as compressed backupset tablespace example format ‘/u01/app/backup/example_c_bs_%T‘;
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-20
channel ORA_DISK_1: finished piece 1 at 07-JUL-20
piece handle=/u01/app/backup/example_c_bs_20200707 tag=TAG20200707T171834 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 07-JUL-20
查看一下这3个备份的大小:
还是有一些差距的。
查看备份:
备份集:
镜像备份:
注意:如果这个备份文件已经在系统层面删除了,在这里还是会存在。
这样再查看就不会存在了:
SYS@proe>select * from v$rman_backup_type;
WEIGHT INPUT_TYPE
---------- -------------
1 BACKUPSET 备份集
2 SPFILE spfile
3 CONTROLFILE 控制文件
4 ARCHIVELOG 归档日志文件
5 DATAFILE INCR 数据文件增量备份
6 DATAFILE FULL 数据文件全量备份
7 DB INCR 整库增量备份
8 RECVR AREA 闪回区备份
9 DB FULL 数据库全备(0级)
9 rows selected
RMAN> alter database open resetlogs;
使用resetlogs的原因是recover命令只能修复控制文件中数据库物理结构信息,而无法修改控制文件中的当前重做日志的
序列号等信息,recover命令执行完毕后,控制文件中当前在线日志序列号仍然是陈旧的。虽然使用了resetlogs,但是因
为recover database命令成功执行已提交的事务不会丢失,resetlogs仅仅是为了照顾还原的控制文件,与不完全恢复的
resetlogs是不同的。
1)备份系统表空间system:
对system表空间下的表做一些操作:
切换几次日志:
模拟系统表空间文件损坏:
此时系统出现问题崩溃:
从下面的图片来看,系统表空间文件是关键性的系统数据文件,一旦损坏数据库可以启动到mount状态但是无法打开。也就是说这个时候元数据信息是可以看到的因为已经mount数据库了。
接下来进行RMAN恢复。
查看关于系统表空间的备份信息:
还原system表空间:
修复system表空间:
启动即可:
再次查看表信息:
备份后删除的表不存在了,说明表空间恢复并不涉及表空间下的表。表仍需单独备份。
查看数据文件信息:
已经恢复。
2)非关键性数据文件:
模拟普通数据文件损坏如何通过RMAN备份进行恢复。
首先创建模拟需要的表:testtable,testtable2并相应的插入一些数据。
可以看到在TEST_1这个表空间下存在两个测试用的表。
对这个表空间进行RMAN备份
查看RMAN备份信息可以看到备份已经成功。
备份已经完成,接下来对这个表空间里面的表进行一些操作使其内容发生一些变化。我们插入一些数据。
然后我们需要将这个表空间的表的数据文件进行破坏掉。
首先查找这个表空间的数据文件在哪里。
确定文件位置后进行模拟删除。建议使用cp复制模拟删除。
数据文件模拟删除后,需要把数据库缓存刷新掉,把内存缓冲区数据写回到数据文件,然后ckpt进程就会发现错误,实例从而崩溃。
此时查看数据库的状态:
为打开状态未崩溃,说明此时数据文件已经同步想要从数据文件读数据到缓冲区时才发现文件错误,并不会导致实例崩溃。
进入RMAN恢复阶段
此时实例未崩溃所以需要将这个表空间先做离线处理。注意immediate直接离线避免脏块写入。
进行表空间还原操作:
而后进行表空间修复:
最后将表空间置于在线即可。
查看表数据可以看到后期插入的数据也已经还原。
另外一种情况就是,当数据文件损坏时实例直接崩溃,失去连接。重新连接并启动,只能将数据库启动到mount状态。这个时候直接进入RMAN进行上述表空间还原操作和表空间修复操作即可。然后将数据库open。
原文:https://www.cnblogs.com/plutozzl/p/13289393.html