--**********************************
--基於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
文件內容包含調用 @@/
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> 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