RMAN很灵活,备份和还原数据库的方法细节有很多,以下只记录比较基础的用rman进行数据库备份与恢复的步骤。
一、系统环境
操作系统:Solaris 10 SunOS 5.10
数据库:Oracle10g Enterprise Edition Release 10.2.0.2.0
二、备份准备
1、启动归档模式
启动归档模式不是必须的,但是如果不启动归档模式,在还恢复数据库的时候就只能恢复到备份点的数据,在备份点到数据库损坏时刻的数据将丢失。
(归档模式的设置参考: http://blog.csdn.net/lezerger/archive/2011/01/13/6135364.aspx)
2、进入RMAN
$rman target sys/sys@IRP_192.168.0.120
(未使用恢复目录)
3、配置RMAN参数
(1)配置备份保留时间,设置为基于时间:7天(周日执行0级备份,周三执行1级备份,其他时间执行2级备份)
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
(2)配置IO设备类型,采用默认:磁盘(DISK)
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
(3)配置备份优化,采用默认:OFF
RMAN> CONFIGURE BACKUP OPTIMIZATION OFF;
(4)配置控制文件自动备份,采用默认:OFF
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP OFF;
(5)配置并行备份,采用默认:1
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 1;
三、备份数据库
1、对全库进行0级备份,存放路径为/oracle/backup/,文件名为IRP_0_YYYYMMDD_唯一号
RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE FORMAT '/oracle/backup/IRP_0_%T_%u';
2、备份控制文件,存放路径为/oracle/backup/,文件名为CTL_YYYYMMDD_唯一号
RMAN> BACKUP CURRENT CONTROLFILE FORMAT '/oracle/backup/CTL_%T_%u';
3、备份归档日志文件,备份完成后删除已备份的归档,存放路径为/oracle/backup/,文件名为ARC_YYYYMMDD_唯一号
RMAN> BACKUP ARCHIVELOG ALL DELETE ALL INPUT FORMAT '/oracle/backup/ARC_%T_%u';
4、对全库进行2级备份,存放路径为/oracle/backup/,文件名为IRP_2_YYYYMMDD_唯一号
RMAN> BACKUP INCREMENTAL LEVEL=2 DATABASE FORMAT '/oracle/backup/IRP_2_%T_%u';
5、对全库进行1级备份,存放路径为/oracle/backup/,文件名为IRP_1_YYYYMMDD_唯一号
RMAN> BACKUP INCREMENTAL LEVEL=1 DATABASE FORMAT '/oracle/backup/IRP_1_%T_%u';
四、查看备份信息
1、列出数据库中所有文件的备份信息
RMAN> LIST BACKUP OF DATABASE;
2、列出指定表空间的备份信息
RMAN> LIST COPY OF TABLESPACE 'SYSTEM';
3、列出指定数据文件的备份信息
RMAN> LIST BACKUP OF DATAFILE ‘/oracle/u02/oradata/GLOBAL_ONECARD.DAT’;
或者
RMAN> LIST BACKUP OF DATAFILE 5;
4、列出控制文件的备份信息
RMAN> LIST BACKUP OF CONTROLFILE;
5、列出归档日志文件的备份信息
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
6、列出可废弃的备份
RMAN> REPORT OBSOLETE;
五、恢复数据库
1、对数据库进行完全介质恢复
(1)启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
(2)执行恢复操作
RMAN> RESTORE DATABASE SKIP TABLESPACE TEMP;
RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;
注意:DELETE ARCHIVELOGS和SKIP TABLESPACE两个参数是可选择的,作用如下:DELETE ARCHIVELOGS:表示RMAN将在完成恢复过程后自动删除那些在恢复过程中修复的归档日志文件。SKIP TABLESPACE:跳过指定表空间,比如临时表,当然临时表空间即使你不跳过它也不会恢复的。
(3)打开数据库,完成恢复
RMAN> ALTER DATABASE OPEN;
2、对指定数据文件进行恢复
(1)启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
(2)查询哪些数据文件需要恢复,FILE#即为文件编号
SQL> select * from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME---------- ------- ------------------ ---------- -----------5 ONLINE FILE NOT FOUND 06 ONLINE FILE NOT FOUND 0
(3)设置要恢复的文件为脱机
RMAN> SQL 'alter database datafile 5 offline drop';
RMAN> SQL 'alter database datafile 6 offline drop';
(4)执行恢复操作
RMAN> RESTORE DATAFILE 5;
RMAN> RESTORE DATAFILE 6;
RMAN> RECOVER DATAFILE 5;
RMAN> RECOVER DATAFILE 6;
(5)设置恢复的文件为联机
RMAN> SQL 'alter database datafile 5 online';
RMAN> SQL 'alter database datafile 6 online';
(6)打开数据库,完成恢复
RMAN> ALTER DATABASE OPEN;
注:以上(3)至(5)步骤也可放在run中达到批量执行的目的:
RMAN> run{
2> SQL 'alter database datafile 5 offline drop';
3> SQL 'alter database datafile 6 offline drop';
4> RESTORE DATAFILE 5;
5> RESTORE DATAFILE 6;
6> RECOVER DATAFILE 5;
7> RECOVER DATAFILE 6;
8> SQL 'alter database datafile 5 online';
9> SQL 'alter database datafile 6 online';
10>}
3、对归档文件进行恢复
(预留位置,待补)
4、对控制文件进行恢复
(预留位置,待补)
5、删除已过期备份
RMAN> DELETE OBSOLETE;
六、建立自动备份机制
1、制定自动备份策略
(1)备份时间为每天凌晨1点
(2)每周日对数据库进行0级(全库)备份、归档文件备份、控制文件备份,备份完成后删除过期备份
(3)每周一对数据库进行2级(增量)备份
(4)每周二对数据库进行2级(增量)备份
(5)每周三对数据库进行1级(累计)备份、归档文件备份、控制文件备份
(6)每周四对数据库进行2级(增量)备份
(7)每周五对数据库进行2级(增量)备份
(8)每周六对数据库进行2级(增量)备份
2、编写自动备份脚本
(1)编写周日备份脚本
$vi /oracle/BackupScript/SunDay
#connect database
#log of rman saved in '/oracle/BackupScript/logs/RMAN_yyyymmdd.txt'connect target sys/sys@IRP_192.168.0.120 #start backup database in 0 levelrun{CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;BACKUP CURRENT CONTROLFILE FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/CTL_%T_%u';BACKUP INCREMENTAL LEVEL=0 DATABASE FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/IRP_0_%T_%u';sql 'alter system archive log current';BACKUP ARCHIVELOG ALL DELETE ALL INPUT FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/ARC_%T_%u';DELETE OBSOLETE;}
(2)编写周三备份脚本
$vi /oracle/BackupScript/Wednesday
#connect database
#log of rman saved in '/oracle/BackupScript/logs/RMAN_yyyymmdd.txt'connect target sys/sys@IRP_192.168.0.120 #start backup database in 1 levelrun{CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;BACKUP CURRENT CONTROLFILE FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/CTL_%T_%u';BACKUP INCREMENTAL LEVEL=1 DATABASE FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/IRP_1_%T_%u';sql 'alter system archive log current';BACKUP ARCHIVELOG ALL DELETE ALL INPUT FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/ARC_%T_%u';}
(3)编写平日(除周日、周三外)备份脚本
$vi /oracle/BackupScript/everyday
#connect database
#log of rman saved in '/oracle/BackupScript/logs/RMAN_yyyymmdd.txt'connect target sys/sys@IRP_192.168.0.120
#start backup database in 2 levelrun{CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;BACKUP INCREMENTAL LEVEL=2 DATABASE FORMAT '/oracle/u01/app/oracle/flash_recovery_area/IRP/backupset/IRP_2_%T_%u';}
(4)编写操作系统作业每天执行的脚本,此脚本根据当前日期自动判断该执行哪个备份脚本并执行
$vi /oracle/BackupScript/BackUp
#!/bin/bashnow=`date "+%w"`if [ "$now" = 0 ]; thensu - oracle -c "rman cmdfile=/oracle/BackupScript/SunDay msglog=/oracle/BackupScript/logs/RMAN_`date "+%Y%m%d"`.txt"elif [ "$now" = 3 ]; thensu - oracle -c "rman cmdfile=/oracle/BackupScript/Wednesday msglog=/oracle/BackupScript/logs/RMAN_`date "+%Y%m%d"`.txt"elsesu - oracle -c "rman cmdfile=/oracle/BackupScript/everyday msglog=/oracle/BackupScript/logs/RMAN_`date "+%Y%m%d"`.txt"fi
(5)编译脚本,赋予可执行的权限
$ chmod +x /oracle/BackupScript/SunDay
$ chmod +x /oracle/BackupScript/Wednesday
$ chmod +x /oracle/BackupScript/everyday
$ chmod +x /oracle/BackupScript/BackUp
(6)为操作系统创建每天执行的任务计划
$ EDITOR=vi
$ export EDITOR
$ crontab -e
00 01 * * * /oracle/BackupScript/BackUp
保存退出后即完成。