----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- 进入RMAN
1>、连接本地数据库
通过rman连接本地数据库非常简单,以windows平台为例,进入到命令提示符界面:
C:\\Documents and Settings\\Administrator>set oracle_sid=jssweb
C:\\Documents and Settings\\Administrator>rman target /
恢复管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
连接到目标数据库: JSSWEB (DBID=3391142503)
RMAN>
注:如果本地库只有一个实例,则不需要指定oracle_sid。Rman会自动连接到默认实例。
当然,你也可以先启动rman,然后再通过connect来连接目标数据库,如下:
C:\\Documents and Settings\\Administrator>set oracle_sid=jssweb
C:\\Documents and Settings\\Administrator>rman
恢复管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
RMAN> connect target /
连接到目标数据库: JSSWEB (DBID=3391142503)
RMAN>
2>、连接远程数据库
如果要连接的目标数据库是一个远程数据库,那么必须在建立连接时指定一个有效的网络服务名,同时你本地的tnsname.ora文件中也必须已经建立了该网络服务名的正确配置。示例如下:
C:\\Documents and Settings\\Administrator>rman target sys/change_on_install@testdb
日志输出功能。这个功能也非常简单,如下:
C:\\Documents and Settings\\Administrator>rman target / log d:\\logs\\rman_log.txt RMAN>
rman会将执行的结果直接输出到指定的d:\\logs\\rman_log.txt文件,一旦脚本放入后台执行出现问题,我们可以根据rman_log文件来辅助分析。
----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 启动和关闭数据库
RMAN> shutdown immediate RMAN> startup
当然,你也可以执行startup mount,然后再利用alter database open命令打开数据库以及shutdown normal,shutdown abort等。总之启动和关闭的命令跟SQL环境下相比就仨字儿:完全一模一样。
执行操作系统命令
Rman支持通过执行host命令暂时退出rman的命令提示符而进入到操作系统的命令环境,如下例: RMAN> host;
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
C:\\Documents and Settings\\Administrator>cd \\
C:\\>exit
主机命令完成
RMAN>
执行完系统命令后可以再通过执行exit退出到rman命令提示符下。
三、执行SQL语句
在rman中执行sql语句稍嫌复杂。
在RMAN的命令提示符后输入SQL命令,然后在一对单引号(双引号亦可)中输入要执行的SQL语句,例如:
RMAN> SQL 'ALTER SYSTEM ARCHIVE LOG ALL';
-------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- RMAN显示命令 1 列出对应物
RMAN>list incarnation;
2 列出备份
2.1概述可用的备份 RMAN>list backup summary; B 表示 backup F 表示 FULL
A 表示 archive log
0 1 表示 incremental backup
S 说明备份状态 (A AVAILABLE X EXPIRED )
2.2按备份类型列出备份 RMAN>list backup by file;
按照 数据文件备份,归档日志备份,控制文件备份,服务器参数文件备份 列出
2.3列出详细备份 RMAN>list backup;
2.4列出过期备份 RMAN>list expired backup; RMAN>DELETE [NOPROMPT] EXPIRED BACKUP # 删除失效的备份集
2.5列出表空间和数据文件备份
list backup of tablespace 和list backup of datafile 输出和list backup 相似
如:list backup of tablespace user_tbs; list backup of datafile 3;
2.6列出归档日志备份 RMAN>list archivelog all; 简要信息 RMAN>list backup of archivelog all; 详细信息
2.7列出控制文件和服务器参数文件
RMAN>list backup of controlfile; RMAN>list backup of spfile;
===================================================== ===================================================== RMAN 的 report命令
1. 报告最近没有被备份的数据文件 RMAN>report need backup days=3;
2. 报告备份冗余或恢复窗口
RMAN>report need backup redundancy=2;
RMAN>report need backup recovery window of 2 days;
3. 报告数据文件的不可恢复操作 RMAN>report unrecoverable;
4. 报告数据库模式
RMAN>report schema;
5. 报告丢弃的备份
如果使用了保存策略,备份会标记为丢弃状态 RMAN>report obsolete; 删除丢弃状态备份RMAN>delete [NOPROMPT] obsolete;
===================================================== ===================================================== RMAN的crosscheck 命令
1 备份集有两种状态A(Available,RMAN认为该项存在于备份介质上)X(Expired,备份存在于控制文件或恢复目录中,但是并没有物理存在于备份介质上)
2 crosscheck 的目的是检查RMAN 的目录以及物理文件,如果物理文件不存在于介质上,将标记为Expired。如果物理文件存在,将维持Available。如果原先标记为Expired 的备份集再次存在于备份介质上(如恢复了损坏的磁盘驱动器后),crosscheck将把状态重新从Expired标记回Available。
3 crosscheck 输出分两部分。第一部分列出确定存在于备份介质上的所有备份集片,第二部分列出不存在于备份介质上的备份集片,并将其标记为Expired。当设置备份保存策略后,一个备份过期,crosscheck之后标记为丢弃的备份状态依旧为availabel,要删除丢弃备份delete obsolete。
4 示例:
crosscheck backup
crosscheck backup of datafile 1;
crosscheck backup of tablespace users; crosscheck backup of controfile; crosscheck backup of controlfile;
crosscheck backup tag='SAT_BACKUP';
crosscheck backup completed after 'sysdate - 2'
crosscheck backup completed between 'sysdate - 5' and 'sysdate -2 ' crosscheck backup device type sbt;
crosscheck archivelog all;
crosscheck archivelog like '%ARC00012.001' crosscheck archivelog from sequence 12; crosscheck archivelog until sequence 522;
===================================================== ===================================================== RMAN 的validate 命令
1 validate 命令验证备份集片是否能够被还原
2 list backup summary; 得到了备份集得主键ID如40,然后validate backupset 40; ===================================================== ===================================================== RMAN 的备份保存策略以及change ,delete命令
0.带delete参数的change 命令删除备份集,从备份介质,并且从控制文件和恢复目录中删除。
change backupset 117,118 delete; change backuppiece 1304 delete;
change archivelog until logseq =544 delete;
1.两类策略:恢复窗口备份保存策略(recovery windows backup retension policy) 基于时间
备份冗余备份保存策略(backup redundancy backup retension policy) 基于备份的数量
两类策略互相排斥
2.即使使用了备份保存策略,备份到期并不删除,只是在RMAN目录中标记为丢弃,看到的状态依旧为available;
要查看标记为丢弃的备份 report obsolete,只有使用delete obsolete才真正物理删除。
3.configure retension policy to recovery window of 7 days; configure retension policy to redundancy 3; 显示结果 show all;
4.查看到期丢弃的备份时,可能需要手工保存一些备份 ,可以使用change 命令带keep 参数,使用这个命令后,那些被修改的备份将被认为是个long-term backup,不在受保存策略影响也就是说delete obsolete 也不删除。
5.要使备份时候不受保存策略影响 ,使用带keep参数的backup 命令 backup database keep forever; backup database keep 5 days;
6.change 命令功能
可以修改备份为永久保存并将以及该备份的相关的日志保存下来,保证总能将备份恢复到当前时间点
change backupset 31 keep forever logs;
可以设置备份丢弃的新日期 ,将备份在多保存7 天,7 天后将删除 change backupset 32 keep until time 'sysdata + 7' logs;
7.change 可以将备份集设置为unavailable change backupset 33 unavailable;
标记为unavailable状态的备份集并不参与crosscheck;
===================================================== ===================================================== RMAN 的备份命令
1、使用backup database命令执行备份 RMAN> BACKUP DATABASE;
执行上述命令后将对目标数据库中的所有数据文件进行备份,由于没有显式指定FORMAT参数,rman会自动为每个备份片段命名,并保存在ORACLE_HOME/database目录下。
当然,也可以通过显式指定format参数来自定义备份片段的命令规则,比如: RMAN> BACKUP DATABASE FORMAT 'D:\\BACKUP\\%U'; 2、备份表空间
只要实例启动并处于加载状态,不论数据库是否打开,都可以在rman中对表空间进行备份,而且不需要像手动备份那样先'ALTER TABLESPACE ... BEGIN BACKUP'。例如: RMAN> backup tablespace jweb;
同样,我们在使用backup tablespace也可以通过显式指定format参数自定义备份片段名称。
3、备份指定数据文件
首先可以先通过数据字典DBA_DATA_FILES查询出表空间对应的数据文件及其序号,例如:
select file_name,file_id,tablespace_name from dba_data_files
然后再通过BACKUP DATAFILE备份指定序号的数据文件,例如: RMAN> BACKUP DATAFILE n; 也可以具体指定文件名
注:n=指定的的数据文件序号,如果需要备份的数据文件有多个,n=多个序号,中间以逗号分隔即可。
4、备份控制文件
1>.最简单的方式,通过CONFIGURE命令将CONTROLFILE AUTOBACKUP置为ON。 RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
然后你再通过rman做任何备份操作的同时,都会自动对控制文件做备份。 2>.对编号为1的数据文件,即SYSTEM表空间的数据文件做备份时,RMAN也会自动对控制文件做备份。
3>.手动执行备份命令。
RMAN> BACKUP CURRENT CONTROLFILE;
4>.执行BACKUP时指定INCLUDE CURRENT CONTROLFILE参数,例如: RMAN> BACKUP DATABASE INCLUDE CURRENT CONTROLFILE;
5、备份归档日志文件
归档日志对于数据库介质恢复相当关键,其虽然不像控制文件那样一旦损坏则数据库马上崩溃但重要性丝毫不减。归档日志文件能确保我们将数据库恢复到备份之前的任意时刻。在RMAN中备份归档日志有两种方式:
1>、利用BACKUP ARCHIVELOG命令备份 RMAN> BACKUP ARCHIVELOG ALL;
2>、在BACKUP过程中利用PLUS ARCHIVELOG参数备份,例如: RMAN> BACKUP DATABASE PLUS ARCHIVELOG; 则在备份数据库的同时自动对所有归档文件进行备份。这种方式与上种有什么区别呢,区别太明显了,BACKUP.....PLUS ARCHIVELOG命令在备份过程中会依次执行下列步骤: a>.运行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前redolog进行归档。 b>.执行BACKUP ARCHIVELOG ALL命令备份所有已归档日志。 c>.执行BACKUP命令对指定项进行备份。
d>.再次运行ALTER SYSTEM ARCHIVE LOG CURRENT对当前redolog归档。 e>.对新生成的尚未备份的归档文件进行备份。
在完成归档日志文件备份后,我们通过需要删除已备份过的归档文件(归档文件记录下了数据库进行过的所有操作,如果您的数据库操作频繁而且量大,那归档文件大小也是相当恐怖,备份后删除释放存储空间是相当有必要地)。RMAN提供了DELETE ALL INPUT参数,加在BACKUP命令后,则会在完成备份后自动删除归档目录中已备份的归档日志。
6、建立增量备份
建立增量备份也是相当简单,实质就是一个参数INCREMENTAL LEVEL=n,在执行BACKUP命令时加上即可,例如,建立一个增量级别0的全库备份: RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE; 再例如,建立一个增量级别1的users01.dbf数据文件备份
RMAN> BACKUP INCREMENTAL LEVEL=1 TABLESPACE SYSTEM DATAFILE 'F:\\ORAHOME1\\ORADATA\\JSSWEB\\USERS01.DBF'; 注:Rman默认创建的增量备份是Differential方式,如果要建立Cumulative方式的增量备份,在执行BACKUP命令时显式指定即可,例如:
RMAN> BACKUP INCREMENTAL LEVEL=2 CUMULATIVE DATABASE; 关于增量备份概念性解释,比如Differential与Cumulative两种方式间的区别. ===================================================== ===================================================== 恢复目录的记录删除
1. $ORACLE_HOME/rdbms/admin/prgrmanc.sql 脚本定期删除恢复目录中具有DELETED状态的记录
2. 要删除旧的对应物记录incarnation.必须从DBINC 表中删除这些对应物,使用RC_DATABASE_INCARNATION 视图来确定要删除的对应物。记录要删除的每个对应物的DBINC_KEY
随后启动SQL*Plus,执行delete from dbinc where dbinc_key=2;
===================================================== ===================================================== 手工同步恢复目录
resync catalog;
Oracle同步恢复目录的时候,首先创建快照控制文件,然后比较这个文件和恢复目录,完成后,Oracle 更新恢复目录,使恢复目录和控制文件同步
===================================================== ===================================================== 在RMAN 中存储脚本
1,连接到目标数据库和恢复目录
rman target / catalog rman/rman@rman9i
2,创建脚本
RMAN>create script my_bk_script 2>{backup database plus archivelog;} create script my_bk_script
3,打印脚本
RMAN>print script my_bk_script; printing stored scipt:my_bk_script {backup database plus archivelog;}
4,运行这个脚本,备份目标数据库
RMAN>run {execute scipt my_bk_script;}
5 删除脚本
RMAN>delete script my_bk_script;
===================================================== ===================================================== archivelog模式下的完全恢复
step1:set oracle_sid=recover
rman target rman_backup/password configure controlfile autobackup on;
step2:backup database plus archivelog delete input;
step3:shutdown immediate;
step4:重命名所有的数据文件和控制文件,不重命名联机重做日志。
step5: startup nomount; set DBID=****
restore controlfile from autobackup; alter database mount;
step6: restore database; recover database;
alter database open resetlogs;
表空间恢复
sql\"alter tablespace users offline\"; sql\"alter tablespace tools offline\"; restore tablespace users,tools; recover tablespace users,tools; sql\"alter tablespace users online\"; sql\"alter tablespace tools online\";
数据文件恢复
sql\"alter database datafile 3 offline\";
sql\"alter database datafile 'd:oracleoradatausers01.dbf' offline\"; restore datafile 3
restore datafile 'd:oracleoradatausers01.dbf'; recover datafile 3
recover datafile 'd:oracleoradatausers01.dbf'; sql\"alter database datafile 3 online\";
sql\"alter database datafile 'd:oracleoradatausers01.dbf'online\";
===================================================== =====================================================
切换当前的incarnation 回到resetlogs 前RESET DATABASE TO INCARNATION inc_key
===================================================== =====================================================
RMAN 高级恢复
1 基于时间点的恢复
run {
set until time \"to_date('07/01/02 15:00:00','mm/dd/yy hh24:mi:ss')\"' restore database; recover database;
alter database open resetlogs; }
2 基于SCN 的恢复 startup mount;
restore database UNTIL SCN 10000; recover database UNTIL SCN 10000; alter database open resetlogs;
3 基于日志序列的恢复 startup mount;
restore database UNTIL SEQUENCE 100 thread 1; recover database UNTIL SEQUENCE 100 thread 1; alter database open resetlogs;
===================================================== ===================================================== ===================================================== ===================================================== ===================================================== =====================================================
RMAN 的自动备份脚本
rman 脚本 level 0:
[oracle@oracle scripts]$ cat rman_level0.rcv connect target / run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u02/rmback/data/%F.ctl'; ALLOCATE CHANNEL CH1 DEVICE TYPE DISK FORMAT '/u02/rmback/data/%T_%U.bak' maxpiecesize 4g; ALLOCATE CHANNEL CH2 DEVICE TYPE DISK FORMAT '/u02/rmback/data/%T_%U.bak' maxpiecesize 4g;
BACKUP INCREMENTAL LEVEL 0 TAG 'level 0' DATABASE ;
SQL 'alter system archive log current' ;
BACKUP FILESPERSET 3 ARCHIVELOG ALL DELETE INPUT; RELEASE CHANNEL CH1; RELEASE CHANNEL CH2; }
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK; CROSSCHECK BACKUPSET;
DELETE NOPROMPT EXPIRED BACKUP; DELETE NOPROMPT OBSOLETE ;
shell 脚本:
[oracle@oracle scripts]$ cat rmback_level0.sh #!/bin/bash
RUN_USER=\"oracle\" rq=`date \"+%Y%m%d\"` fname=\"*$rq*\"
if [ \"$LOGNAME\" != \"$RUN_USER\" ]; then
echo \"Please run this script as $RUN_USER \" >> /u02/rmback/log/$rq.log exit 1 fi
cd $HOME . .bash_profile
cd /u02/rmback/scripts/
date \"+ %Y-%m-%d %T Start to backup DateBase\" >> /u02/rmback/log/oracle.log
rman cmdfile=/u02/rmback/scripts/rman_level0.rcv msglog=/u02/rmback/log/$rq.log
date \"+ %Y-%m-%d %T RMAN BACKUP finished \" >> /u02/rmback/log/oracle.log
#date \"+ %Y-%m-%d %T Srart to move backuped files \" >> /u02/rmback/log/oracle.log
#find /u02/rmback/data -name $fname -exec mv '{}' /u03 ';'
#date \"+ %Y-%m-%d %T move backuped files finished \" >> /u02/rmback/log/oracle.log
exit 0
rman level 1脚本:
[oracle@oracle scripts]$ cat rman_level1.rcv connect target / run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u02/rmback/data/%F.ctl'; ALLOCATE CHANNEL CH1 DEVICE TYPE DISK FORMAT '/u02/rmback/data/%T_%U.bak' maxpiecesize 4g; ALLOCATE CHANNEL CH2 DEVICE TYPE DISK FORMAT '/u02/rmback/data/%T_%U.bak' maxpiecesize 4g;
BACKUP INCREMENTAL LEVEL 1 TAG 'level 1' DATABASE ; SQL 'alter system archive log current';
BACKUP FILESPERSET 3 ARCHIVELOG ALL DELETE INPUT; RELEASE CHANNEL CH1; RELEASE CHANNEL CH2; }
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK; CROSSCHECK BACKUPSET;
DELETE NOPROMPT EXPIRED BACKUP; DELETE NOPROMPT OBSOLETE ;
shell 脚本:
[oracle@oracle scripts]$ cat rmback_level1.sh #!/bin/bash
RUN_USER=\"oracle\" rq=`date \"+%Y%m%d\"` fname=\"*$rq*\"
if [ \"$LOGNAME\" != \"$RUN_USER\" ]; then
echo \"Please run this script as $RUN_USER \" >> /u02/rmback/log/$rq.log exit 1 fi
cd $HOME . .bash_profile
cd /u02/rmback/scripts/
date \"+ %Y-%m-%d %T Start to backup DateBase\" >> /u02/rmback/log/oracle.log
rman cmdfile=/u02/rmback/scripts/rman_level1.rcv msglog=/u02/rmback/log/$rq.log
date \"+ %Y-%m-%d %T RMAN BACKUP finished \" >> /u02/rmback/log/oracle.log
#date \"+ %Y-%m-%d %T Srart to move backuped files \" >> /u02/rmback/log/oracle.log
#find /u02/rmback/data -name $fname -exec mv '{}' /u03 ';'
#date \"+ %Y-%m-%d %T move backuped files finished \" >> /u02/rmback/log/oracle.log
exit 0
linux 计划任务:
[oracle@oracle scripts]$ crontab -e 编辑修改本用户计划任务( vi进入) 时程表的格式如下 : f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。 [oracle@oracle scripts]$ crontab -l 列出本用户计划任务
#01 01 * * * (/u02/rmback/scripts/rmback.sh > /u02/rmback/log/oracle 2>&1)
01 02 * * 0 (/u02/rmback/scripts/rmback_level0.sh > /u02/rmback/log/oracle 2>&1) 01 02 * * 3 (/u02/rmback/scripts/rmback_level1.sh > /u02/rmback/log/oracle 2>&1)
01 02 * * 1,2,4,5,6 (/u02/rmback/scripts/rmback_level2.sh > /u02/rmback/log/oracle 2>&1
===================================================== ===================================================== ===================================================== =====================================================
因篇幅问题不能全部显示,请点此查看更多更全内容