rman备份与还原(一)rman工作原理

来源:互联网 发布:千里眼软件 编辑:程序博客网 时间:2024/05/17 09:05

Rman备份与还原

推荐的oracle官方文档http://tahiti.oracle.com

需要翻墙的技术文档资源http://www.slideshare.net

恢复管理器, Recovery Manager, 简陈 RMAN。 RMAN 实现是服务器管理恢复(Server Managed Recovery: SMR)。SMR 是一种数据库执行所需要的操作以确保自身备份成功的能力,依赖于Oracle RDBMS 内核中的内置代码可以完成这一功能。SMR 的功能主要体现在能够减少用户的操作。

 

 rman的原理

1.1.           SMR实现过程

RMAN 是SMR的具体实现,RMAN 是一个独立的应用程序,它负责建立到Oracle 数据库的客户端连接,以访问数据库内部的备份和恢复数据包。

RMAN 的核心命令是解释程序,命令解释程序接受所输入的命令,并将这些命令转换为在数据库上执行的远程调用(Remote Procedure call: RPC).

要强调的是,RMAN 只是做少量的工作。虽然时间的协调非常重要,但是备份和恢复一个数据库的具体工作实际上是由目标数据库上的进程完成的。

RMAN 是Database Utilities的一部分。Database Utilities是一组命令行形式的使用程序,包括Import,export,sql*loader和 dbverify。 典型的安装Oracle 时会自动安装RMAN。

RMAN 分企业版和标准版2种,如果只能使用标准版的RMAN,那么RMAN 就只能分配一个通道。

RMAN 由两部分组成,可执行文件和recover.bsq 文件

Recover.bsq 文件实质上是库文件,RMAN程序从recover.bsq 文件中析取代码来创建在目标数据库上执行的PL/SQL 调用。

Recover.bsq 文件是整个操作的中枢。这个文件始终保持链接,并在逻辑上构成RMAN 客户端使用程序。

思考:recover.bsq 文件在什么目录下面?

find /*  -name  recover.bsq

注意: 
recover.bsq 文件和 RMAN程序的版本必须是相同,否则不能正常工作。

 

1.2.           RMAN 与数据库权限

RMAN 需要访问目标数据库上sys用户存在的各种数据包,还需要具有启动和关闭目标数据库的权限。

因此RMAN 通常以sysdba用户身份连接到目标数据库。如果以不具有sysdba 权限的用户连接到目标数据库,RMAN 会报ORA-01031: insufficient privileges 错误。

验证一下:

SQL>CREATE USER RMAN IDENTIFIED BY RMAN;

SQL>GRANT CONNECT,RESOURCE TO RMAN;

SQL>EXIT;

$rman  target  rman/rman

RMAN>

 

小注:

在一般情况下,大多数Unix系统中都有一个Oracle用户,它是dba组的一个成员。 这是最初安装Oracle软件的用户,如果以Oracle用户登录,在RMAN中以什么身份连接就变的不重要,它将总是作为sysdba互用来连接目标数据库,并且能够访问sys模式,同时也具有启动和关闭数据库的能力。

在windows平台上,Oracle会创建一个ORA_DBA本地组,并将安装Oracle软件的用户添加到这个本地组中。

如果作为dba组成员之外的用户登录并需要使用RMAN,就必须创建和使用一个口令文件来连接到目标数据库。如果要使用一个客户系统通过网络来连接RMAN,也需要创建和使用一个口令文件。

 

1.3.           运行 RMAN

RMAN是一个客户端应用程序,它通过Oracle Net Service连接来与目标数据库连接。如果目标数据库位于ORACLE_HOME主目录中,运行同样位于这个主目录中的RMAN程序,ORACLE net连接就会是一个本地连接。

只要在Oracle环境中设置了合适的ORACLE_SID 变量,就不需要为这个连接提供一个Oracle net别名。否则,我们必须配置tnsnames.ora文件,在文件中指定目标数据库,并且在将要运行RMAN的位置上完成这个操作。

1.4.1.      远程运行RMAN

如果我们负责管理很多的数据库。最好在单个客户端系统上将应用程序合并,这样就可以在这个客户端系统上更好的管理tnsnames.ora 文件内容。

1.4.2.      在目标数据库的ORACLE_HOME 中运行本地RMAN

恢复目录: 用于存储RMAN 备份的历史记录,它含有有关备份发生时间,备份内容和备份大小的元数据。 历史记录中还含有恢复备份所需的关键信息。 元数据是从默认位置(目标数据库控制文件)析取的,并保留在用户模式的数据库表内。

如果要建立一个RMAN 和 目标数据库之间的远程连接,需要创建一个使用专用服务器进程连接到目标数据库的tnsnames.ora 条目。 因为RMAN 不能使用共享服务器(通常称多线程服务器或者MTS)来建立数据库连接。

MYICD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myicd)
    )
  )

从每个目标数据库中本地运行RMAN 实际上是管理具有数百或者上千数据库目标的大型企业的唯一方法。 因为RMAN一直具有兼容性问题,将rman.exe 与目标数据库紧密绑定可在长期运行中节省时间。虽然这种方式部署RMAN 备份存在一些缺陷,但这也是最佳方式.

1.4.           数据库控制文件  --重点

思考: 控制文件都记录了哪些信息?

记录数据文件信息:

控制文件平常的作用是负责数据库的物理结构,控制文件,控制数据库查找物理文件的位置,并控制每个文件当前包含(或应当包含)的头信息,其内容包括数据文件信息,重做日志信息和归档文件信息。 

控制文件还含有与数据库关联的关键文件的每一个文件头的快照(snapshot)。 

由于控制文件存储的是数据库文件信息,所以RMAN 会利用控制文件获取备份所需的信息,具体的操作方式是: RMAN 使用控制文件来编译文件列表,得到检查点信息,并确定可恢复性。

通过直接访问控制文件,RMAN可以编译文件列表而不需要用户创建文件列表,这样避免了备份脚本时的一个非常繁琐的步骤,并且在添加一个新文件时不需要更改这个脚本。控制文件会存储新文件的信息,因此RMAN也能从控制文件中得到这个信息。

作为rman的目录:

控制文件还能用作RMAN 目录。RMAN完成数据库任何部分的备份后,会在控制文件中添加该备份的记录,以及说明备份开始和结束时间的检查点。

这也是从Oracle 7 到Oracle 8 版本控制文件大小呈指数增长的一个主要原因:控制文件中存在RMAN记录。控制文件中的这些记录通常成为元数据,它和实际备份中记录的数据有 ,它也可以存储在恢复目录中。

1.4.1.      在控制文件中重用记录

控制文件将内部数据记录分为两类:循环重用记录和非循环重用记录。

循环重用记录包含可以从控制文件中删除的信息。如:归档日志历史信息可以被删除,并且不会影响产品数据库。  
非循环重用记录是那些不能被删除的记录,

非循环重用记录包括数据文件列表和日志文件列表。

        

控制文件的视图

select type,record_size from v$controlfile_record_section;

 

思考:是哪个参数控制这个功能的? 

show parameter control_file_

数据库参数CONTROL_FILE_RECORD_KEEP_TIME以天为单位(默认值为7天),因此在默认情况下,Oracle 会将RMAN备份和恢复记录保存7天。 可以将该参数设置为0到365之间的任意值。

此外,设置为0时,将禁止扩展控制文件,并且会使得RMAN备份的保存周期不稳定。

SQL> select name,value from v$parameter where name='control_file_record_keep_time';

SQL> alter system set control_file_record_keep_time=20;

SQL> show parameter control_file_record_keep_time

1.4.2.      快照控制文件

快照控制文件的默认路径

$ORACLE_HOME/dbs

RMAN>SHOW ALL

CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/10.2.0/db_1/dbs/snapcf_orcl10g.f'

 

开始备份后,RMAN需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。除非RMAN在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。

锁定控制文件意味着数据库不能执行检查点操作和切换日志,或则不能产生新的归档日志,这些操作是不可能的。RMAN使用快照控制文件(snapshot controlfile)来解决前面提出的问题,快照控制文件是控制文件的副本。RMAN只在备份和同步操作期间使用快照控制文件。

这些操作开始时,RMAN会根据实际控制文件来刷新快照控制文件,这样会短暂的锁住控制文件,随后,RMAN 会切换到快照并在备份持续使用这个快照。 

这种方式具有读取一致性,且不妨碍数据库活动。在默认情况下,快照控制文件位于UNIX 平台上的ORACLE_HOME/dbs 目录中,或者是在windows 的ORACLE_HOME/database 目录下。 

1.5.           RMAN 服务器进程

RMAN 生成一个到目标数据库的客户连接,并创建两个服务器进程。其中主要进程生成对SYS用户中的数据包的调用,从而执行备份和恢复操作,该进程会在备份和还原期间协调通道进程的工作。

另外一个次要的进程(或影子进程)轮询RMAN中的所有长事务(long-running transaction)并在内部记录信息。

在V$version_longops 视图中可以查看到下面的轮询结果:
SELECT   sid,
         serial#,
         context,
         sofar,
         totalwork,
         ROUND (sofar / totalwork * 100, 2) "%_complete"
  FROM   V$SESSION_LONGOPS
 WHERE       opname LIKE 'PMAN'
         AND opname NOT LIKE '%aggregate%'
         AND totalwork != 0
         AND sofar <> TOTALWORK

还可以在v$version视图中查看这些进程。RMAN分配一个通道时,它会在输出中提供如果所示的会话ID信息:
分配的通道: ORA_DISK_1
    通道ORA_DISK_1: SID=19 设备类型=DISK

SID 信息对应与v$session 中的SID 列。
SQL> col client_info format a30
SQL> col program format a15
SQL> select sid,saddr,paddr,program,client_info from v$session where sid=19;
       SID SADDR    PADDR    PROGRAM         CLIENT_INFO
---------- -------- -------- --------------- ------------------------------
        19 A9CCBD10 AA728C44 rman.exe        rman channel=ORA_DISK_1

 

 

1.5.1.      RMAN 通道进程

除了默认的两个进程外,在备份还原操作期间还会为分配的每个通道单独的创建一个进程。RMAN将通道视为目标数据库上的服务器进程,该进程在备份期间协调读取数据文件和写入指定位置的操作,在还原期间则协调读取备份位置和在数据文件位置写入数据块的操作。 

与后台RMAN进程一样,可以从数据字典(data directory)跟踪通道进程。并且将通道进程在OS级别(OS level)上与一个SID关联。正是这些通道进程的活动被轮询的影子进程记录到V$SESSION_LONGOPS视图中。

1.6.           RMAN 使用的SYS数据包  -- 重点

RMAN服务器进程在协调通道工作时要访问两SYS数据包:DBMS_RCVMAN数据包 和DBMS_BACKUP_RESTORE数据包,这两个包包含了目标数据库中RMAN的所有功能。

1.6.1.      SYS.DBMS_RCVMAN 数据包

DBMS_RCVMAN数据包用来访问控制文件中的信息并将此信息传递给RMAN,使用RMAN可以构建准确反应数据库结构的备份和还原操作。DBMS_RCVMAN包负责在执行任何操作前设置time运算符和校验数据文件头中的检查点信息,数据文件的位置和大小,以及有关节点相似性(在RAC环境中)和磁盘相似性的其他信息。

这种信息会影响RMAN的性能,并且RMAN在构建实际备份/还原命令之前自动执行负载均衡(load-balancing)算法和性能增强(performance-enhancing)算法。

1.6.2.      SYS.DBMS_BACKUP_RESTORE 数据包

SYS.DBMS_RCVMAN包访问控制文件并校验所有必须的信息。这些必须的信息被传递回RMAN服务器进程,RMAN服务器进程随后会基于recover.bsq 文件中的代码创建一些PL/SQL块。 

这些PL/SQL块含有对DBMS_BACKUP_RESOTRE数据包的调用,实际上RMAN 中是由DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log。

RMAN接收从DBMS_RCVMAN数据包返回的信息,并在通道间基于负载均衡算法分配工作,然后创建一系列DBMS_BACKUP_RESTORE数据包调用。

在V$SESSION_LONGOPS视图中可以跟踪的是DBMS_BACKUP_RESTORE数据包的工作。它执行备份和还原操作,此外还可以以受限方式访问控制文件。

DBMS_BACKUP_RESTORE数据包访问控制文件以备份该文件(实际上是控制文件的快照),在备份完成后写入备份信息。

一旦完成了一个备份集, DBMS_BACKUP_RESTORE数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名的信息。

1.6.3.      内核中的RMAN 数据包

创建数据库时,运行cataproc.sql脚本可以默认安装上述两个RMAN数据包。数据库创建期间无法跳过这一步骤。所以在8i 以后的每个版本里都存在rman包。

这些RMAN数据包还有一个重要的特性,他们被硬编码到Oracle软件的库文件中,因此及时没有打开数据库也可以调用这些数据包。

大多数数据包只在数据库打开时才能被使用,不过RMAN可以在数据库实例处于nomout或者mount 时编写对DBMS_BACKUP_RESTORE 数据包的调用。

小结:

1.开始备份--》创建快照控制文件 --》SYS.DBMS_RCVMAN --》读取控制文件中的信息,并效验

2.RMAN服务器进程-->recover.bsq库文件中的代码创建一些PL/SQL块-->DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log

3. 这些RMAN数据包还有一个重要的特性,他们被硬编码到Oracle软件的库文件中,因此及时没有打开数据库也可以调用这些数据包。

1.7.           备份数据块 –重点

即使是高级备份技术,备份的单元依然是数据文件,最终进行备份的OS使用程序将查看并备份整个文件,因此需要特别注意保证Oracle数据块的完整性。

简单点说,就是我们使用其他的技术备份的时候,只能基于文件的备份,比如我们的冷备,就是在操作系统级别,把整个文件复制一份。

因为RMAN是集成在RDBMS中的,它是在数据块层面访问数据,因为这点,也使得RMAN具有诸多优势,因此我们可以更有效的利用数据块进行备份和恢复。

1.7.1.      数据块备份概述

数据块备份的工作原理:RMAN 基于备份算法规则来编译要备份的文件列表。

基于通道数和同时备份的数据文件数,RMAN在Oracle共享内存段中创建一些内存缓冲区。一般在PGA中,不过有时内存缓冲区会被推入SGA。

通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些数据块。

一个缓冲区被填充时,输入缓冲区中的数据块会被推入输出缓冲区。 数据文件中的每个数据块都会发生这种内存对内存的写操作(memor-to-memory write)。

如果数据块符合备份的标准并且内存对内存的写操作没有检测到讹误(corruption),则这些数据块会保留在输出缓冲区中直至输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或者磁盘)。

一旦所有文件已通过内存缓冲区过滤,就完成了备份片,同时RMAN会在目标数据库的控制文件中写入备份片的完成时间和备份片的名称。

1.7.2.      1.7.2块级备份的优点

每个数据块从磁盘移入内存时都会发生内存对内存的写操作,在这个操作期间会检查数据块的讹误。讹误检查是RMAN的一个重要特性。

访问数据块时可以选择 空值压缩(null compression),我们可以删除从来没有使用过的数据块(头为0),并在执行内存对内存的写操作时丢弃这些数据块,因此,我们只需要备份使用过的数据块,从而执行更有效的备份操作。

RMAN在备份期间不要求保证数据块的一致性。RMAN 对数据块的访问允许RMAN 与写‘脏’缓冲区的DBWR进程协调,并且在将这个数据块读入内存以前,它可以等待直至数据块达到一致,因此数据块不会被转存为redo,并且备份中的数据块总是一致的。

思考:在非归档模式下能不能使用RMAN?

如果是非归档模式,rman 不允许我们在数据库打开时备份一个数据文件,否则会报如下错误:ora-19602:
cannot backup or copy active file in NOARCHIVELOG mode

1.8.           内存中的RMAN

1.8.1.      内存中的缓冲区

RMAN会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。内存的利用与PGA(有时是SGA)的总体大小有关。内存缓冲区分为输入缓冲区和输出缓冲区。输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。

1.8.2.      输入内存缓冲区

备份数据库时,输入内存缓冲区的大小和数据取决于实际执行的备份命令,事实上它主要取决于在一个备份中多路复用(multiplexing)的文件数。多路复用指的是在同一个备份片中备份某数据块的文件数。

为了保持合理范围的内存分配,根据一起备份的文件数,分配内存缓冲大小需要应用下面的规则。

1)如果备份集内的文件数小于或者等于4个,RMAN 会为每个文件分配4个大小为1MB的缓冲区。缓冲区总和小于或者等于16MB。

2)如果备份集内文件数多余4个但少于等于8个,RMAN会为每个文件分配4个大小为512KB的缓冲区。缓冲区总和确保少于或者等于16MB。

3)如果多路复用的文件数多余8个,RMAN 会为每个文件分配4个大小为128KB的缓冲区。这就确保每个要备份的文件占用512KB的缓冲区内存。

上面的数字一定要记清楚,现在我们看一个示例:

如果分配两个通道来备份具有32个数据文件的数据库,RMAN会怎么分配通道?是不是每个通道16个数据文件?

RMAN会根据负载均衡来分配两个通道,而不是为每个通道分配16个文件。如果某些文件比另外的文件大的多,我们可能在一个备份集内备份8个文件,在另一个备份集内备份24个文件。

可以使用如下的查询来监控备份运行时基于每个每个文件的缓冲区大小:
  SELECT set_count,
     device_type,
           TYPE,
           filename,
           buffer_size,
           buffer_count,
           open_time,
           close_time
        FROM   v$backup_async_io
        ORDER BY   set_count,
           TYPE,
           open_time,
           close_time;

1.9.           恢复目录(catalog

恢复目录存储的是与RMAN备份有关的元数据。在某种意义上,恢复目录可以看做是保存RMAN备份和恢复所需的相关信息的副本。恢复目录仅仅是一些数据包,表,索引和视图。

一个恢复目录可以存储多个目标数据库的信息,这样可以集中管理许多不同数据库的备份,通过SQL可以查询恢复目录的视图,由此确定在恢复目录中注册的每个目标数据库的备份数,备份大小和备份范围。

1.9.1.      nocatalog模式

我们在前面提到过Nocatalog方式,它就是用control file作为catalog,每一次备份都要往控制文件里面写好多备份信息,控制文件里面会有越来越多的备份信息。因此,当使用rman nocatalog方式备份时,备份controlfile是非常重要的。

使用rman nocatalog恢复时,数据库必须是处于“mount”状态的。而Oracle startup mount的前提条件是control必须存在。因此,你必须在恢复datafile之前先恢复controlfile。

使用rman catalog方式时,可以startup nomount然后restore controlfile;但使用rman nocatalog时,必须先用文件方式恢复controlfile。

1.9.2.      Catalog 示例

Catalog 则必须要首先要创建目录备份数据库,建立恢复目录。示例如下

创建Catalog所需要的表空间

SQL>create tablespace rman_ts  datafile '/u01/oracle/oradata/ora10g/rmants.dbf'  size 20M;

2.创建RMAN用户并授权

SQL>create user rman identified by rman default tablespace rman_ts quota unlimited on rman_ts;

SQL>grant recovery_catalog_owner to rman;(grant connect to rman)

查看角色所拥有的权限: select * from dba_sys_privs where grantee='RECOVERY_CATALOG_OWNER';

(RECOVER_CATALOG_OWNER,CONNECT,RESOURCE)

3.创建恢复目录

oracle>rman catalog rman/rman
RMAN>create catalog tablespace rman_ts;
RMAN>register database;(database
target database)
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete
RMAN> connect target /;

以后要使用备份和恢复,需要连接到两个数据库中,命令:

oracle>rman target / catalog rman/rman (第一斜杠表示target数据库,catalog表示catalog目录 rman/rman表示catalog用户名和密码)

1.9.3.            总结:

1.2  RMAN 与数据库权限

ORA-01031: insufficient privileges 错误。 

1.3 RMAN 备份的网络拓扑结构

1.3.1 远程运行RMAN

1.3.2 在目标数据库的ORACLE_HOME 中运行本地RMAN

1.4 数据库控制文件  --重点

1.5 RMAN 服务器进程

RMAN 生成一个到目标数据库的客户连接,并创建两个服务器进程。其中主要进程生成对SYS用户中的数据包的调用,从而执行备份和恢复操作,该进程会在备份和还原期间协调通道进程的工作。
另外一个次要的进程(或影子进程)轮询RMAN中的所有长事务(long-running transaction)并在内部记录信息。 

1.6 RMAN 使用的SYS数据包  -- 重点

1.6.1  SYS.DBMS_RCVMAN 数据包

1.6.2 SYS.DBMS_BACKUP_RESTORE 数据包

这些PL/SQL 块含有对DBMS_BACKUP_RESOTRE 数据包的调用,实际上RMAN 中是由DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log 

一旦完成了一个备份集, DBMS_BACKUP_RESTORE 数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名的信息。

1.6.3 内核中的RMAN 数据包

1.7 备份数据块 –重点

1.8 内存中的RMAN

1.8.2 输入内存缓冲区

1.9 恢复目录(catalog