--**********************************
-- 基于 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{ execute global 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 10 g
目 标数 据 库 : 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> create global script global_del_obso comment 'A script for obsolete backup and delete it' {
2 > crosscheck archivelog all ;
3 > delete noprompt expired archivelog all ;
4 > allocate channel ch1 device type disk ;
5 > delete noprompt obsolete recovery window of 7 days;
6 > release channel ch1;
7 > }
-- 备份 控制文件脚本
RMAN> create global script global_bkctl comment 'A script for backup control file' {
2 > allocate channel ch1 device type disk ;
3 > backup as compressed backupset
4 > current controlfile reuse
5 > format= '/u03/bk/backupctl.ctl'
6 > tag= 'bkctl' ;
7 > release channel ch1;
8 > }
-- 备份归档 日志脚本
RMAN> create global script global_arch comment "backup archivelog and then delete it" {
2 > allocate channel ch1 device type disk ;
3 > allocate channel ch2 device type disk ;
4 > sql "alter system archive log current"; -- 归档当 前的 联 机日志
5 > set limit channel ch1 readrate= 10240 ; --( 读 取速率 10M)
6 > set limit channel ch1 kbytes= 4096000 ; --( 备份 片的大 小 )
7 > backup as compressed backupset
8 > format= '/u03/bk/arch_%d_%U'
9 > tag= 'bkarch'
10 > archivelog all delete input;
11 > release channel ch1;
12 > release channel ch2;
13 > }
-- 使用 list 查 看所有的已建立的全局脚本
list global script names; --( 列出所有的脚本 )
delete globals script script_name; --( 删 除脚本 )
RMAN> list global script names;
List of Stored Scripts in Recovery Catalog
Global Scripts
Script Name
Description
-----------------------------------------------------------------------
global_arch
backup archivelog and then delete it
global_bkctl
A script for backup control file
global_del_obso
A script for obsolete backup and delete it
3 . 创 建 0 , 1 , 2 级 增量 备份 脚本 ( 注:每 个 脚本 备份 前 会执 行 删 除 过旧 的 备份 ,脚本尾部 会调 用另外 两个 脚本 来备份归档 日志及控制文件 )
-- 创 建 0 级 增量 备份
RMAN> create global script global_inc0 comment "backup database as incrmental level 0"{
2 > execute global script global_del_obso;
3 > allocate channel ch1 device type disk ;
4 > allocate channel ch2 device type disk ;
5 > set limit channel ch1 readrate= 10240 ;
6 > set limit channel ch1 kbytes= 4096000 ;
7 > set limit channel ch2 readrate= 10240 ;
8 > set limit channel ch2 kbytes= 4096000 ;
9 > backup as compressed backupset
10 > incremental level 0 database
11 > format= '/u03/bk/inc0_%d_%U'
12 > tag= 'inc0' ;
13 > release channel ch1;
14 > release channel ch2;
15 > execute global script global_arch;
16 > execute global script global_bkctl;
17 > }
-- 创 建 1 级 增量 备份
RMAN> create global script global_inc1 comment "backup database as incrmental level 1"{
2 > execute global script global_del_obso;
3 > allocate channel ch1 device type disk ;
4 > allocate channel ch2 device type disk ;
5 > set limit channel ch1 readrate= 10240 ;
6 > set limit channel ch1 kbytes= 4096000 ;
7 > set limit channel ch2 readrate= 10240 ;
8 > set limit channel ch2 kbytes= 4096000 ;
9 > backup as compressed backupset
10 > incremental level 1 database
11 > format= '/u03/bk/inc1_%d_%U'
12 > tag= 'inc1' ;
13 > release channel ch1;
14 > release channel ch2;
15 > execute global script global_arch;
16 > execute global script global_bkctl;
17 > }
-- 创 建 2 级 增量 备份
RMAN> create global script global_inc2 comment "backup database as incrmental level 2"{
2 > execute global script global_del_obso;
3 > allocate channel ch1 device type disk ;
4 > allocate channel ch2 device type disk ;
5 > set limit channel ch1 readrate= 10240 ;
6 > set limit channel ch1 kbytes= 4096000 ;
7 > set limit channel ch2 readrate= 10240 ;
8 > set limit channel ch2 kbytes= 4096000 ;
9 > backup as compressed backupset
10 > incremental level 2 database
11 > format= '/u03/bk/inc2_%d_%U'
12 > tag= 'inc2' ;
13 > release channel ch1;
14 > release channel ch2;
15 > execute global script global_arch;
16 > execute global script global_bkctl;
17 > }
-- 在 rman 中 检验 在 rman 中 写 的脚本 global_inc0 、 global_inc1 、 global_inc2, 因 为 RMAN 不 会 自 动检查 , 下面的 语 句用 来执 行脚本 ( 检验 )
RMAN> run{
2 > execute global script global_inc0;
3 > execute global script global_inc1;
4 > execute global 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{
execute global 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 controlfile in each scripts tail ( 在脚本的尾部 备份 控制文件 )
2 .Delete obsolete backupset in each scripts threshold ( 删 除 旧 的 备份 )
3 .Switch logfile before backup database ; ( 在 数 据 库备份 以前切 换 日 志, 备份联 机重做日志 )
4 .Chmod u+x*.sh
本文根据德哥 RMAN:Oracle 数 据 库 一周 备份 方案的 设计 整理完成
四、 快捷参考
有 关 性能 优 化 请参 考
共享池的 调 整 与优 化 (Shared pool Tuning)
Oracle 表 缓 存 (caching table) 的使用
有 关 ORACLE 体系 结构请参 考
Oracle 联 机重做日志文件 (ONLINE LOG FILE)
Oracle 回 滚 (ROLLBACK) 和撤 销 (UNDO)
Oracle 实 例和 Oracle 数 据 库 (Oracle 体系 结构 )
有 关闪 回特性 请参 考
Oracle 闪 回特性 (FLASHBACK DATABASE)
Oracle 闪 回特性 (FLASHBACK DROP & RECYCLEBIN)
Oracle 闪 回特性 (Flashback Query 、Flashback Table)
Oracle 闪 回特性 (Flashback Version 、Flashback Transaction)
有 关 基于用 户 管理的 备份 和 备份 恢 复 的 概 念 请参 考
Oracle 基于用 户 管理恢 复 的 处 理 ( 详细 描述了介 质 恢 复 及其 处 理 )
有 关 RMAN 的 备份 恢 复与 管理 请参 考
RMAN 备份 路 径 困惑 ( 使用plus archivelog 时 )
有 关 ORACLE 故障 请参 考
又一例SPFILE 设 置 错误导 致 数 据 库 无法 启动
对参数 FAST_START_MTTR_TARGET = 0 的 误 解及 设 定
SPFILE 错误导 致 数 据 库 无法 启动 (ORA-01565)
有 关 ASM 请参 考
有 关 SQL/PLSQL 请参 考
SQL 基 础 --> 集合 运 算 (UNION 与 UNION ALL)
SQL 基 础 --> 层 次化 查询 (START BY ... CONNECT BY PRIOR)
SQL 基 础 --> ROLLUP 与 CUBE 运 算符 实现数 据 汇总
PL/SQL --> 异 常 处 理 (Exception)
有 关 ORACLE 其 它 特性
使用OEM,SQL*Plus,iSQL*Plus 管理Oracle 实 例
日志 记录 模式 (LOGGING 、FORCE LOGGING 、NOLOGGING)
使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)
簇表及簇表管理(Index clustered tables)
system sys ,sysoper sysdba 的 区别
ORACLE_SID 、DB_NAME 、INSTANCE_NAME 、DB_DOMIAN 、GLOBAL_NAME
Oracle 补 丁全集 (Oracle 9i 10g 11g Path)