RMAN(Recovery Manager)是服务器管理恢复(Server-Managed Recovery,SMR)的一种实现。SMR是一种数据库执行所需的操作以确保自身备份成功的能力,依赖于RDBMS内核中的内置代码可以完成这一功能。
RMAN使用一些PL/SQL程序包执行操作,这些程序包与其它程序包相同,必须加载到共享池中。如果共享池不够大或者结构比较零散,那么就有可能不能够执行RMAN程序包,因此,为共享池分配RMAN操作的足够内存至关重要。
RMAN默认的情况下使用PGA,只有当backup_tape_io_slaves或者dbwr_io_slaves参数中的任意一个设置为true的时候,那么RMAN就允许双路备份(或者在不同的路径上并行生成同一个备份副本),这时RMAN使用的是大池的内存。
RMAN实用程序是Dabase Utilitis套件的一部分。Database Utilitis套件是一组命令行形式的应用程序,包括Data pump、SQL*Loader、DBNE.WID和dbverify。可以这样理解,RMAN程序负责接收命令行输入,之后组装成PL/SQL代码块,放到target database上执行。真正工作的是target database。
RMAN连接target database分为客户端连接和本地连接,典型安装oracle的时候就会自动安装RMAN。RMAN分为企业版和标准版,标准版只能分配一个备份信道。安装oracle客户端的时候选择的是Administrator就会安装客户端的RMAN套件。
RMAN使用程序由两部分组成:可执行文件和recover.bsq文件。
[oracle@orcl01 u01]$ find -name recover.bsq
./app/oracle/product/11.2.0/dbhome_1/rdbms/admin/recover.bsq
recover.bsq文件实际上是库文件,可执行文件从recover.bsq文件中解析代码,生成在target database上可执行的PL/SQL代码块。
RMAN只能以专用服务器进程(SERVER = DEDICATED)连接的方式连接target database,且通常情况下以sysdba的身份连接到数据,但不需要声明身份。
[oracle@orcl01 u01]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Wed Aug 24 11:16:01 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCL (DBID=1448495022)
RMAN>
控制文件中控制数据库查询物理文件的地址,并控制每个文件的头信息,其中包括数据文件信息、重做日志文件信息和归档日志信息。控制文件还含有与数据库关联的关键文件的每一个文件的头部快照(snapshot)。
因为控制文件中包含数据库文件的信息,因此RMAN利用控制文件获取备份所需要的信息,具体的操作方式为,RMAN利用控制文件信息编译文件列表,获取检查点信息,确定可恢复性。这样做的好处为,避免了人工编辑备份列表的繁琐步骤,当新增加数据库文件时,可以不用改动备份列表脚本。
控制文件还可以用作RMAN的目录,RMAN完成数据库任何部分的备份后,都会在控制文件中添加该备份的信息,包括备份的开始时间和结束时间的检查点信息,备份文件的位置等,这样可以快速的进行恢复。
控制文件中存放着归档日志信息和备份的信息,那么长期以往,势必控制文件会增长的很大,对此控制文件必须能够删除某些不再需要的数据。
控制文件的内部数据分为两类:
循环重用记录,以轮询(round_robin)的方式被重用
非循环重用记录,不能被删除
SQL> show parameter control_file_record_keep_time;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_file_record_keep_time参数限制了循环重用记录必须保存的天数,默认为7天,可以配置此参数保存更久的备份信息。
控制文件是一个非常繁忙的文件,它存储数据库的结构信息,这些信息包括英语恢复的检查点SCN信息,连续的SCN和文件管理对于数据库的生命周期来说至关重要,因此数据库必须能够持续的使用控制文件。
这样会对RMAN带来一个问题,RMAN开始备份每个数据文件时需要得到一个一致的控制文件视图,此时RMAN需要知道备份开始时的最新的检查点信息和文件结构信息。开始备份后,需要这些信息在备份期间保持一致。除了备份期间锁定控制文件外,没有其它的办法,但是就意味着数据在此期间要hang住,这是不可能的。
为了解决这个问题,RMAN采用快照控制文件(snapshot controlfile),快照控制文件是控制文件的副本,具体操作为,在备份开始时,RMAN根据控制文件内容刷新快照控制文件,再次期间会短暂锁定控制文件,随后RMAN会切换到快照控制文件并且在备份期间使用快照控制文件。
[oracle@orcl01 u01]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Wed Aug 24 14:22:06 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCL (DBID=1448495022)
RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
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 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/11.2.0/dbhome_1/dbs/snapcf_orcl.f'; # default
可以看出快照控制文件默认存放在$ORACLE_HOME/dbs/目录下,默认名称为snapcf_.f,可以通过CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘
RMAN> configure snapshot controlfile name to '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_orcl.ora';
new RMAN configuration parameters:
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_orcl.ora';
new RMAN configuration parameters are successfully stored
RMAN生成一个客户端到target database的客户端连接,并创建两个服务器进程。其中的主要进程生成对SYS下的数据包调用,从而执行备份和恢复的操作,该进程会在备份和还原期间协调信道进程的工作。
主要进程调用两个SYS数据包:DBMS_RCVMAN数据包和DBMS_BACKUP_RESTORE数据包。DBMS_RCVMAN数据包用来访问控制文件中的表并且将此信息传递给RMAN,使RMAN可以构建准确的数据库结构的备份还原操作。DBMS_BACKUP_RESTORE数据库负责备份数据文件和控制文件以及归档日志文件。
另外一个进程为次要进程(影子进程)轮询RMAN中的所有长事务(long-running transaction)并在内部记录信息,在v$session_longops视图中可以查看结果。
SQL> select sid,
serial#,
context,
sofar,
totalwork,
round(sofar / totalwork * 100, 2) as "%_COMPLETE "
from v$session_longops
where opname like 'RMAN%'
and opname not like '%aggregate%'
and totalwork != 0
and sofar <> totalwork ;
SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE
---------- ---------- ---------- ---------- ---------- ----------
41 3299 1 96252 168320 57.18
除了这两个进程外,RMAN还会为每个分配的信道单独创建一个进程,该进程在备份期间协调读取数据文件和写入指定位置的操作。