--**********************************
-- 基于Linux下 Oracle 备份策略(RMAN)
--**********************************
对于 Oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复。而制定RMAN备份策
略则是基于数据库丢失的容忍程度,即恢复策略来制定。在下面的备份策略中,给出的是一个通用的备份策略。在该备份策略中,使用了catalog方
式来保持备份脚本以及备份信息。在实际环境中应根据具体的情况对此进行相应的调整。
一、步骤
1.确认备份可用空间以及备份路径,根据需要创建相应文件夹
1.对于账户的连接创建一个connect.rcv,该文件包含连接到target 和catalog信息
2.创建通用的脚本用于删除过旧的备份和备份控制文件以及备份归档日志
global_del_obso --删除过旧的备份
global_bkctl --备份控制文件
global_arch --备份归档日志
3.创建0,1,2级增量备份
这三个脚本中均包含第2步的3个脚本,先调用global_del,然后做增量备份,最后备份归档日志global_arch和控制文件global_bkctl
4.创建inc0.rcv,inc1.rcv,inc2.rcv
文件内容包含调用 @@/<dir>/connect.rcv以及run{executeglobal script scriptname;}exit;
5.编辑第4步的三个文件分别为inc0.sh,inc1.sh,inc2.sh
nohup $ORACLE_HOME/bin/rman cmdfile=/u03/bk/scripts/inc1.rcv log=/u03/bk/scripts/inc0.log append &
6.使用crontab制定备份计划
二、具体实现
演示环境:
系统: CentOS release 4.6 (Final) + Oracle 10g
目标数据库: austin
恢复目录数据库: david
备份目录: /u03/bk
连接脚本所在路径:/u03/bk/scripts
注:监听需要配置好且已启动
1.连接脚本
connect.rcv文件内容
connect catalog rman/rman@david;
connect target sys/oracle@austin;
catalog的通用脚本
rman cmdfile=/u03/bk/scripts/connect.rcv --(在rman中使用外部脚本)
rman catalog rman/rman@david target sys/oracle@austin --使用该脚本连接后创建通用脚本
2.建立通用脚本
--删除不必要的备份
RMAN> createglobal script global_del_obso comment'A script for obsolete backup and delete it' {
2> crosscheck archivelogall;
3> delete noprompt expired archivelogall;
4> allocate channel ch1 device typedisk;
5> delete noprompt obsolete recovery window of7 days;
6> release channel ch1;
7> }
--备份控制文件脚本
RMAN> createglobal script global_bkctl comment'A script for backup control file'{
2> allocate channel ch1 device typedisk;
3> backupas compressed backupset
4> currentcontrolfilereuse
5> format='/u03/bk/backupctl.ctl'
6> tag='bkctl';
7> release channel ch1;
8> }
--备份归档日志脚本
RMAN> createglobal script global_arch comment "backup archivelog and then delete it" {
2> allocate channel ch1 device typedisk;
3> allocate channel ch2 device typedisk;
4> sql "alter system archive log current"; --归档当前的联机日志
5> setlimit channel ch1 readrate=10240; --(读取速率10M)
6> setlimit channel ch1 kbytes=4096000; --(备份片的大小)
7> backupas compressed backupset
8> format='/u03/bk/arch_%d_%U'
9> tag='bkarch'
10> archivelogalldelete input;
11> release channel ch1;
12> release channel ch2;
13> }
--使用list查看所有的已建立的全局脚本
listglobal script names; --(列出所有的脚本)
delete globals script script_name; --(删除脚本)
RMAN> listglobal script names;
ListofStored Scripts inRecovery Catalog
Global Scripts
Script Name
Description
-----------------------------------------------------------------------
global_arch
backuparchivelogandthendelete it
global_bkctl
A script forbackup control file
global_del_obso
A script for obsolete backupanddelete it
3.创建0,1,2级增量备份脚本(注:每个脚本备份前会执行删除过旧的备份,脚本尾部会调用另外两个脚本来备份归档日志及控制文件)
--创建0级增量备份
RMAN> createglobal script global_inc0 comment "backup database as incrmental level 0"{
2> executeglobal script global_del_obso;
3> allocate channel ch1 device typedisk;
4> allocate channel ch2 device typedisk;
5> setlimit channel ch1 readrate=10240;
6> setlimit channel ch1 kbytes=4096000;
7> setlimit channel ch2 readrate=10240;
8> setlimit channel ch2 kbytes=4096000;
9> backupas compressed backupset
10> incremental level0database
11> format='/u03/bk/inc0_%d_%U'
12> tag='inc0';
13> release channel ch1;
14> release channel ch2;
15> executeglobal script global_arch;
16> executeglobal script global_bkctl;
17> }
--创建1级增量备份
RMAN> createglobal script global_inc1 comment "backup database as incrmental level 1"{
2> executeglobal script global_del_obso;
3> allocate channel ch1 device typedisk;
4> allocate channel ch2 device typedisk;
5> setlimit channel ch1 readrate=10240;
6> setlimit channel ch1 kbytes=4096000;
7> setlimit channel ch2 readrate=10240;
8> setlimit channel ch2 kbytes=4096000;
9> backupas compressed backupset
10> incremental level1database
11> format='/u03/bk/inc1_%d_%U'
12> tag='inc1';
13> release channel ch1;
14> release channel ch2;
15> executeglobal script global_arch;
16> executeglobal script global_bkctl;
17> }
--创建2级增量备份
RMAN> createglobal script global_inc2 comment "backup database as incrmental level 2"{
2> executeglobal script global_del_obso;
3> allocate channel ch1 device typedisk;
4> allocate channel ch2 device typedisk;
5> setlimit channel ch1 readrate=10240;
6> setlimit channel ch1 kbytes=4096000;
7> setlimit channel ch2 readrate=10240;
8> setlimit channel ch2 kbytes=4096000;
9> backupas compressed backupset
10> incremental level2database
11> format='/u03/bk/inc2_%d_%U'
12> tag='inc2';
13> release channel ch1;
14> release channel ch2;
15> executeglobal script global_arch;
16> executeglobal script global_bkctl;
17> }
--在rman中检验在rman中写的脚本global_inc0、global_inc1、global_inc2,因为RMAN不会自动检查,下面的语句用来执行脚本(检验)
RMAN> run{
2> executeglobal script global_inc0;
3> executeglobal script global_inc1;
4> executeglobal script global_inc2;
5> }
--查看备份完成情况
list backupset summary;
4.建立shell脚本,让linux自动执行脚本
a. vi inc0.rcv,inc1.rcv ,inc2.rcv --注意不同的文件执行不同的备份脚本
@@/u03/bk/scripts/connect.rcv --(rman下的脚本去调用其他脚本用@@符号)(调用脚本不需要分号)
run{
executeglobal script gloal_inc0;
}
exit;
b. 编辑shell文件
vi inc0.sh
nohup $ORACLE_HOME/bin/rman cmdfile=/u03/bk/scripts/inc0.rcv log=/u03/bk/scripts/inc0.log append &
vi inc1.sh
nohup $ORACLE_HOME/bin/rman cmdfile=/u03/bk/scripts/inc1.rcv log=/u03/bk/scripts/inc0.log append &
vi inc2.sh
nohup $ORACLE_HOME/bin/rman cmdfile=/u03/bk/scripts/inc2.rcv log=/u03/bk/scripts/inc0.log append &
--注意:nohup与&表示将脚本放入后台执行
c.使用crontab建立一个备份计划
crontab -e
#min hour date mon day(星期) command
30 1 * * 0 /u03/bk/scripts/inc0.sh
30 1 * * 1 /u03/bk/scripts/inc2.sh
30 1 * * 2 /u03/bk/scripts/inc2.sh
30 1 * * 3 /u03/bk/scripts/inc2.sh
30 1 * * 4 /u03/bk/scripts/inc1.sh
30 1 * * 5 /u03/bk/scripts/inc2.sh
30 1 * * 6 /u03/bk/scripts/inc2.sh
d.重启crontab服务(如果没有启动)
# /sbin/service crond status --用于检查crontab 服务状态
# /sbin/service crond stop //关闭服务
# /sbin/service crond restart //重启服务
# /sbin/service crond reload //重新载入配置
使crontab服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
e.从上面的备份策略来看,即
周日执行0级增量备份,相当于全备
周一,周二,周三执行2级增量备份
周四执行1级增量备份
周五,周六执行2级增量备份
f.编辑好的shell 脚本测试
chmod 755 *.sh --给shell脚本加权限
测试脚本 例如./inc0.sh
三、总结
1.backup controlfileineach scripts tail (在脚本的尾部备份控制文件)
2.Delete obsolete backupset ineach scripts threshold (删除旧的备份)
3.Switch logfilebeforebackupdatabase; (在数据库备份以前切换日志,备份联机重做日志)
4.Chmod u+x*.sh
本文根据德哥RMAN:Oracle数据库一周备份方案的设计 整理完成
四、快捷参考
有关性能优化请参考
Buffer cache 的调整与优化(一)
有关ORACLE体系结构请参考
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 实例和Oracle数据库(Oracle体系结构)
有关闪回特性请参考
Oracle 闪回特性(FLASHBACK DATABASE)
Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
Oracle 闪回特性(Flashback Query、Flashback Table)
Oracle 闪回特性(Flashback Version、Flashback Transaction)
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
SYSTEM 表空间管理及备份恢复
有关RMAN的备份恢复与管理请参考
基于catalog 的RMAN 备份与恢复
使用RMAN迁移文件系统数据库到ASM
RMAN 备份路径困惑(使用plus archivelog时)
有关ORACLE故障请参考
ORA-32004 的错误处理
ORA-00119,ORA-00132 错误处理
对参数FAST_START_MTTR_TARGET = 0 的误解及设定
SPFILE 错误导致数据库无法启动(ORA-01565)
有关ASM请参考
创建ASM实例及ASM数据库
ASM 磁盘、目录的管理
有关SQL/PLSQL请参考
SQL 基础-->SELECT 查询
SQL 基础--> NEW_VALUE 的使用
SQL 基础--> 集合运算(UNION 与UNION ALL)
SQL 基础--> 常用函数
SQL 基础--> 视图(CREATE VIEW)
SQL 基础--> 创建和管理表
SQL 基础--> 多表查询
SQL 基础--> 过滤和排序
SQL 基础--> 子查询
SQL 基础--> 分组与分组函数
SQL 基础--> 层次化查询(START BY ... CONNECT BY PRIOR)
SQL 基础--> ROLLUP与CUBE运算符实现数据汇总
PL/SQL --> 异常处理(Exception)
PL/SQL --> 语言基础
PL/SQL --> 包的创建与管理
PL/SQL --> 隐式游标(SQL%FOUND)
PL/SQL --> 包重载、初始化
PL/SQL --> 存储过程
PL/SQL --> 动态SQL的常见错误
有关ORACLE其它特性
使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例
日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)
簇表及簇表管理(Index clustered tables)
数据泵 EXPDP 导出工具的使用
数据泵 IMPDP 导入工具的使用
导入导出 Oracle 分区表数据
启用用户进程跟踪
ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAME
Oracle 补丁全集 (Oracle 9i 10g 11g Path)
Oracle 彻底 kill session
手动删除oracle数据库