分类: Oracle
2011-08-17 14:39:00
rman操作
建立恢复目录
第一步,在目录数据库中创建恢复目录所用表空间:
SQL> create tablespace rman_ts datafile "d:\oracle\oradata\rman\rman_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
C:\Documents and Settings\Administrator>rman catalog rman/rman
恢复管理器: Release 10.2.0.4.0 - Production on 星期六 9月 25 09:14:19 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到恢复目录数据库
RMAN>
RMAN>create catalog tablespace rman_ts;
RMAN-06431:恢复目录已创建
P.S.
注意:虽然使用RMAN不一定必需恢复目录,但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。
RMAN> register database;
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=1,DBID=3021445076,利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:
SQL> execute dbms_rcvcat.unregisterdatabase(1,3021445076);
PL/SQL 过程已成功完成。
至此,注销数据库操作完成。
数据库完全备份
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> }
RUN
{
ALLOCATE CHANNEL c1 DEVICE TYPE sbt; #磁带
BACKUP DATABASE PLUS ARCHIVELOG;
}
RUN
{
ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT '/disk1/backups/%U';
ALLOCATE CHANNEL disk2 DEVICE TYPE DISK FORMAT '/disk2/backups/%U';
BACKUP DATABASE PLUS ARCHIVELOG; # AS COPY is default when backing up to disk
}
通过下面的命令显示恢复目录中记载的备份集信息:
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> }
注意:数据库完全备份将自动备份控制文件。
. 增量备份
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" 。
一个典型的增量备份案例如下:
星期天晚上 - 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 open,datafile 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