ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle RMAN快速入门指南(转)

Oracle RMAN快速入门指南(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-07-14 13:18:06 0 删除 编辑
这篇文章主要介绍RMAN的常用方法其中包含了作者一些自己的经验里面的实验也基本全在WIN 2K和ORACLE 8.1.6环境下测试成功(因为这个环境比较容易实现)

本文借鉴了网上一些高手的相关文章希望大侠们不要见怪此处一并谢过

这篇文章主要是在北京出差期间写的回到家后整理修改了一下时间比较仓促同时因为篇幅有限一些技术细节不能一一覆盖了只希望能够帮助新手入门的作用想真正熟练掌握RMAN必须经过较长时间的实践磨练才可以尤其需要在工程中获得宝贵的故障解决经验
1.什么是RMAN
RMAN可以用来备份和还原数据库文件、归档日志和控制文件它也可以用来执行完全或不完全的数据库恢复

注意:RMAN不能用于备份初始化参数文件和口令文件

RMAN启动数据库上的Oracle服务器进程来进行备份或还原备份、还原、恢复是由这些进程驱动的

RMAN可以由OEM的Backup Manager GUI来控制但在本文章里不作重点讨论
2. Terminology专业词汇解释2.1. Backup sets备份集合
备份集合有下面的特性:
  包括一个或多个数据文件或归档日志
  以oracle专有的格式保存
  有一个完全的所有的备份片集合构成
  构成一个完全备份或增量备份
2.2. Backup pieces备份片
一个备份集由若干个备份片组成每个备份片是一个单独的输出文件一个备份片的大小是有限制的;如果没有大小的限制 备份集就只由一个备份片构成备份片的大小不能大于使用的文件系统所支持的文件长度的最大值
2.3. Image copies镜像备份
镜像备份是独立文件(数据文件、归档日志、控制文件)的备份它很类似操作系统级的文件备份它不是备份集或备份片也没有被压缩
2.4. Full backup sets全备份集合
全备份是一个或多个数据文件中使用过的数据块的的备份没有使用过的数据块是不被备份的也就是说oracle 进行备份集合的压缩
2.5. Incremental backup sets增量备份集合
增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块 与完全备份相同增量备份也进行压缩
2.6. File multiplexing
不同的多个数据文件的数据块可以混合备份在一个备份集中
2.7. Recovery catalog resyncing 恢复目录同步
使用恢复管理器执行backup、copy、restore或者switch命令时恢复目录自动进行更新但是有关日志与归档日志信息没有自动记入恢复目录需要进行目录同步使用resync catalog命令进行同步

RMAN>resync catalog; RMAN-03022:正在编译命令:resync RMAN-03023:正在执行命令:resync RMAN-08002:正在启动全部恢复目录的 resync RMAN-08004:完成全部 resync
3. 恢复目录3.1.恢复目录的概念
恢复目录是由RMAN使用、维护的用来放置备份信息的仓库RMAN利用恢复目录记载的信息去判断如何执行需要的备份恢复操作

恢复目录可以存在于ORACLE数据库的计划中

虽然恢复目录可以用来备份多个数据库建议为恢复目录数据库创建一个单独的数据库

恢复目录数据库不能使用恢复目录备份自身
3.2.建立恢复目录
第一步在目录数据库中创建恢复目录所用表空间:

SQL> create tablespace rman_ts datafile "d:oracleoradata man man_ts.dbf" size 20M; 表空间已创建

第二步在目录数据库中创建RMAN 用户并授权:

SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts; 用户已创建 SQL> grant recovery_catalog_owner to rman; 授权成功 SQL> grant connect, resource to rman; 授权成功

第三步在目录数据库中创建恢复目录

C:>rman catalog rman/rman 恢复管理器:版本8.1.6.0.0 - Production RMAN-06008:连接到恢复目录数据库 RMAN-06428:未安装恢复目录 RMAN>create catalog tablespace rman_ts; RMAN-06431:恢复目录已创建

注意:虽然使用RMAN不一定必需恢复目录但是推荐使用因为恢复目录记载的信息大部分可以通过控制文件来记载RMAN在恢复数据库时使用这些信息不使用恢复目录将会对备份恢复操作有限制
3.3.使用恢复目录的优势
可以存储脚本;

记载较长时间的备份恢复操作;
4. 启动RMAN
RMAN为交互式命令行处理界面也可以从企业管理器中运行

为了使用下面的实例先检查环境符合:

  the target database is called "his" and has the same TNS alias
  user rman has been granted "recovery_catalog_owner "privileges
  目标数据库的连接用户为internal帐号或者以其他SYSDBA类型帐号连接  
  the recovery catalog database is called "rman" and has the same TNS alias
  the schema containing the recovery catalog is "rman" (same password)

在使用RMAN前设置NLS_DATE_FORMAT 和NLS_LANG环境变量很多RMAN LIST命令的输出结果是与日期时间相关的这点在用户希望执行以时间为基准的恢复工作也很重要

下例是环境变量的示范:

NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS

为了保证RMAN使用时能连接恢复目录恢复目录数据库必须打开目标数据库至少要STARTED(unmount)否则RMAN会返回一个错误目标数据库必须置于归档模式下
4.1.使用不带恢复目录的RMAN
设置目标数据库的 ORACLE_SID 执行:

% rman nocatalog RMAN> connect target RMAN> connect target internal/@his
4.2.使用带恢复目录的RMAN
% rman rman_ts rman/rman@rman RMAN> connect target % rman rman_ts rman/rman@rman target internal/@his
4.3.使用RMAN
一旦连接到目标数据库可以通过交互界面或者事先存储的脚本执行指定RMAN命令下面是一个使用RMAN交互界面的实例:

RMAN> resync catalog; RMAN-03022:正在编译命令:resync RMAN-03023:正在执行命令:resync RMAN-08002:正在启动全部恢复目录的 resync RMAN-08004:完成全部 resync

使用脚本的实例:

RMAN> execute script alloc_1_disk;

创建或者替代存储的脚本:

RMAN> replace script alloc_1_disk { 2> allocate channel d1 type disk; 3> }

5.注册或者注销目标数据库

5.1.注册目标数据库

数据库状态:

恢复目录状态:打开

目标数据库:加载或者打开

目标数据库在第一次使用RMAN之前必须在恢复目录中注册:

第一步启动恢复管理器并且连接目标数据库:

C:>rman target internal/oracle@his catalog rman/rman@rman 恢复管理器:版本8.1.6.0.0 - Production RMAN-06005:连接到目标数据库:HIS (DBID=3021445076) RMAN-06008:连接到恢复目录数据库

第二步注册数据库:

RMAN> register database; RMAN-03022:正在编译命令:register RMAN-03023:正在执行命令:register RMAN-08006:注册在恢复目录中的数据库 RMAN-03023:正在执行命令:full resync RMAN-08002:正在启动全部恢复目录的resync RMAN-08004:完成全部resync

5.2.注销目标数据库

RMAN提供了一个注销工具叫DBMS_RCVCAT工具包请注意一旦注销了该目标数据库就不可以使用恢复目录中含有的备份集来恢复数据库了

为了能注销数据库需要获得数据库的标识码(DB_ID)和数据库键值(DB_KEY)其中连接目标数据库时将会获得DB_ID

C:>rman target internal/oracle@his catalog rman/rman@rman 恢复管理器:版本8.1.6.0.0 - Production RMAN-06005:连接到目标数据库:HIS (DBID=3021445076) RMAN-06008:连接到恢复目录数据库
其中DBID=3021445076利用DBID=3021445076查询数据库键值码连接到目标数据库查询db表:

SQL> select * from db; DB_KEY DB_ID CURR_DBINC_KEY ---------- ---------- -------------- 1 3021445076 2

获得DB_KEY=1这样该目标数据库DB_KEY=1DBID=3021445076利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:

SQL> execute dbms_rcvcat.unregisterdatabase(1,3021445076); PL/SQL 过程已成功完成

至此注销数据库操作完成
6.操作已有的备份6.1.加入目录数据库
数据库状态:

恢复目录:打开

目标数据库:加载或者打开

如果存在8.x版本以前创建的备份数据想注册到目标数据库可以采用如下手工方式加入到恢复目录中

RMAN> catalog datafilecopy "/oracle/ .... /system01.dbf";

使用如下命令显示恢复目录中包含的文件

RMAN> list copy of database;

6.2.从目录数据库中删除

第一步:查看备份信息:

RMAN>list backup; RMAN-03022:正在编译命令:list

备份集列表

关键字 Recid 标记 LV 集合标记 集合计数 完成时间 ------- ---------- ---------- -- ---------- ---------- ---------------------- 1104 2 501364455 0 501364446 2 06-8月 -03

备份段列表

关键字 Pc# Cp# 状态 完成时间 段名 ------- --- --- ----------- ---------------------- ------------------------ 1106 1 1 AVAILABLE 06-8月 -03 D:ORACLEORA81DATABASE2EU4DMU_1_1

数据文件包括列表

文件 名称 LV 类型 检查点SCN 检查点时间 ---- ------------------------------------- -- ---- ---------- ------------- 3 D:ORACLEORADATAHISUSERS01.DBF 0 Full 160052 06-8月 -03

备份集的关键字为1104

第二步:定义delete通道:

RMAN>allocate channel for delete type disk; RMAN-03022:正在编译命令:allocate RMAN-03023:正在执行命令:allocate RMAN-08030:分配的通道:delete RMAN-08500:通道 delete:sid=19 devtype=DISK

第三步:删除backupset备份集

RMAN>change backupset 1104 delete; RMAN-03022:正在编译命令:change RMAN-08073:已删除备份段 RMAN-08517:备份段 handle=D:ORACLEORA81DATABASE2EU4DMU_1_1 recid=2 stamp=50 1364447 RMAN-03023:正在执行命令:partial resync RMAN-08003:启动部分恢复目录的 resync RMAN-08005:完成部分 resync

注意:部分执行删除备份集、备份片或者维护恢复目录的命令需要先指定通道如:

RMAN>allocate channel for delete type disk; RMAN>allocate channel for maintenance type disk;
7.在非归档模式下备份
数据库状态:

恢复目录:打开

目标数据库:例程启动或者数据库加载

恢复目录数据库需要打开目标数据库必须启动(或者加载)因为目标数据库不在归档模式下所以当进行备份恢复操作的时候数据库无法打开不可以将表空间置于热备份模式上进行等同于文件系统级的拷贝如果在非归档模式数据库打开的状态下不能进行数据文件的备份
7.1.数据库完全备份
RMAN> run { 2> # backup the complete database to disk 3> allocate channel dev1 type disk; 4> backup 5> full 6> tag full_db_backup 7> format "/oracle/backups/db_t%t_s%s_p%p" 8> (database); 9> release channel dev1; 10> }

行#
2: 表明该行为注释行(#是注释符)
3&9: See section 15 - Channels通道定义
5: Full backup (default if full or incremental not specified)完全备份模式(缺省模式)
6: Meaningful string (<=30 chars)(备份集标识<=30个字符)
7: Filename to use for backup pieces, including substitution variables. 备份片使用的文件名可以包含代替变量
8: Indicates all files including controlfiles are to be backed up表明备份所有数据文件包括控制文件

通过下面的命令显示恢复目录中记载的备份集信息:

RMAN> list backupset of database;
7.2.备份表空间
RMAN> run { 2> allocate channel dev1 type disk; 3> backup 4> tag tbs_users_read_only 5> format "/oracle/backups/tbs_users_t%t_s%s" 6> (tablespace users) 7> }

使用下列命令来显示恢复目录中该表的备份信息:

RMAN> list backupset of tablespace users;

假设USERS表空间在备份后被置为READ ONLY表空间以后的全库备份就可以不用备份该表空间为了达到这个目的可以在以后的备份中指定"skip readonly"

注意目标数据库不需要一定打开只要加载就可以因为表空间的信息存储在控制文件中
7.3.备份单独数据文件
RMAN> run { 2> allocate channel dev1 type "SBT_TAPE"; 3> backup 4> format "%d_%u" 5> (datafile "/oracle/dbs/sysbigdb.dbf"); 6> release channel dev1; 7> }

行#
2: 使用MML(media manager layer)分配磁带驱动器必须指定类型为SBT_TAPE;

注意因为没有指定标识所以标识为空;

使用下面的命令显示恢复目录中备份的表空间:

RMAN> list backupset of datafile 1;
7.4.备份数据文件
RMAN> run { 2> allocate channel dev1 type "SBT_TAPE"; 3> copy datafile "/oracle/dbs/temp.dbf" to "/oracle/backups/temp.dbf"; 4> release channel dev1; 5> }

使用下面的命令显示恢复目录中的文件拷贝:

RMAN> list copy of datafile "/oracle/dbs/temp.dbf";

拷贝数据文件和备份数据文件是不一样的数据文件拷贝是一个该文件的镜像文件的备份产生一个备份集
7.5.备份控制文件
RMAN> run { 2> allocate channel dev1 type "SBT_TAPE"; 3> backup 4> format "cf_t%t_s%s_p%p" 5> tag cf_monday_night 6> (current controlfile); 7> release channel dev1; 8> }

注意:数据库完全备份将自动备份控制文件
8.归档模式下的备份
数据库状态:

恢复目录:打开

目标数据库:例程启动数据库加载或者打开

备份操作使用的命令与非归档模式下基本一样
8.1. Backing up archived logs 备份归档日志
下面的脚本备份归档日志:

RMAN> run { 2> allocate channel dev1 type disk; 3> backup 4> format "/oracle/backups/log_t%t_s%s_p%p" 5> (archivelog all) 6> release channel dev1; 7> }

下面的脚本归档日志从# 90 to 100:

RMAN> run { 2> allocate channel dev1 type disk; 3> backup 4> format "/oracle/backups/log_t%t_s%s_p%p" 5> (archivelog from logseq=90 until logseq=100 thread 1); 6> release channel dev1; 7> }

下面的脚本备份在24小时内产生的归档日志在备份完成后会自动删除归档日志如果备份失败归档日志不会被删除

RMAN> run { 2> allocate channel dev1 type disk; 3> backup 4> format "/oracle/backups/log_t%t_s%s_p%p" 5> (archivelog from time "sysdate-1" all delete input); 6> release channel dev1; 7> }

使用下面的命令显示恢复目录中的归档日志:

RMAN> list backupset of archivelog all;

注意:RMAN找到归档日志后会备份指定日志如果无法找到日志它也不会返回错误信息
8.2. Backing up the online logs 备份联机日志
联机日志不能用RMAN来备份必须先将其归档

为了实现这点必须在RMAN中执行如下SQL语句:

RMAN> run { 2> allocate channel dev1 type disk; 3> sql "alter system archive log current"; 4> backup 5> format "/oracle/backups/log_t%t_s%s_p%p" 6> (archivelog from time "sysdate-1" all delete input); 7> release channel dev1; 8> }

上面的脚本可以在执行完一个完整的联机数据库备份后执行确保所有的重做日志可以将数据库恢复到一个一致性的状态

注意:不可以标识归档日志备份集
9. 增量备份
N级别增量备份备份从最近的N级别或者更小级别以来的所有更改过的数据块内容增量备份分为两种一种是累积增量备份一种是非累积增量备份

累积增量备份包括自最后一次在更低级别进行备份以来所有改动过的数据块

非累积增量备份包括自前一次在同级或者更低级别进行备份以来改动过的数据块
9.1. Level 0--增量备份策略的基础
Level 0 是增量备份策略的基础--the basis of the incremental backup strategy

RMAN> run { 2> allocate channel dev1 type disk; 3> backup 4> incremental level 0 5> filesperset 4 6> format "/oracle/backups/sunday_level0_%t" 7> (database); 8> release channel dev1; 9> }

Line#
4: 0级备份
5: 定义每个backupset 的最大文件数

使用LIST语句查看数据库备份集的列表显示中 "type" 将显示 "Incremental""LV"列将显示"0"
9.2. 使用增量备份的案例
一个典型的增量备份案例如下:
   星期天晚上 - level 0 backup performed
   星期一晚上 - level 2 backup performed
   星期二晚上 - level 2 backup performed
   星期三晚上 - level 1 backup performed
   星期四晚上 - level 2 backup performed
   星期五晚上 - level 2 backup performed
   星期六晚上 - level 2 backup performed
   星期天晚上 - level 0 backup performed
10. 恢复
恢复案例如下:
10.1. Database opendatafile deleted 数据库打开时文件被删除
数据文件在数据库打开时被删除有两种方法可以对打开的数据库进行恢复:还原数据文件或者表空间下面两个实例显示了该方法:

(a) Datafile recovery 数据文件恢复

RMAN> run { 2> allocate channel dev1 type disk; 3> sql "alter tablespace users offline immediate"; 4> restore datafile 4; 5> recover datafile 4; 6> sql "alter tablespace users online"; 7> release channel dev1; 8> }

(b) Tablespace recovery 表空间恢复

RMAN> run { 2> allocate channel dev1 type disk; 3> sql "alter tablespace users offline immediate"; 4> restore tablespace users; 5> recover tablespace users; 6> sql "alter tablespace users online"; 7> release channel dev1; 8> }

注意:如果还原系统表空间文件数据库必须关闭因为系统表空间不可以脱机
10.2. Complete restore (lost online redo) and rollforward - database closed 完全还原(丢失联机日志)并且前滚 - 数据库关闭
RMAN> run { 2> allocate channel dev1 type disk; 3> set until logseq=105 thread=1; 4> restore controlfile to "/oracle/dbs/ctrltargdb.ctl"; 5> replicate controlfile from "/oracle/dbs/ctrltargdb.ctl"; 6> restore database; 7> sql "alter database mount"; 8> recover database; 9> sql "alter database open resetlogs"; 10> release channel dev1; 11> }

Notes:
"set until" 命令指明恢复到指定的日志文件这一点在数据文件恢复时很重要否则RMAN将试图恢复最近的数据文件该数据文件可能在指定的日志以前
"replicate controlfile" 复制还原的控制文件到INIT.ORA指定的控制文件

如果数据库使用WITH RESETLOGS打开则需要使用RESET DATABASE命令注册改变后的数据库在使用RESETLOGS命令打开数据库后强烈建议做一个完全的数据库备份
10.3. 还原数据文件的子集完全恢复
RMAN> run { 2> allocate channel dev1 type disk; 3> sql "alter database mount"; 4> restore datafile 2; 5> restore datafile 3; 6> restore archivelog all; 7> recover database; 8> sql "alter database open"; 9> release channel dev1; 10> }
11. 脚本
创建或者取代脚本:

RMAN> create script alloc_disk { 2> # Allocates one disk 3> allocate channel dev1 type disk; 4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200; 5> } RMAN> replace script rel_disk { 2> # releases disk 3> release channel dev1; 5> } RMAN> replace script backup_db_full { 2> # Performs a complete backup 3> execute script alloc_disk; 4> backup 5> ..... 6> execute script rel_disk; 7> }

前两个脚本分别用来分配和回收通道

alloc_disk 脚本还额外指定了备份片的最大兆字节数备份时可以同时打开的输入文件的最大数目以及每秒钟读每个输入文件的数据缓冲区的最大数目

第三个脚本调用先前存储的两个脚本进行数据库备份

运行存储脚本的示范:

RMAN> run { 2> execute script backup_db_full; 3> }

注意:存储的脚本必须在{ .... execute
请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    3488
  • 访问量
    2621371