中小型資料庫 RMAN CATALOG 備份恢復方案(一)
對於資料庫的穩定性,高可用,跨平臺以及海量資料庫的處理,Oracle 資料庫通常是大型資料庫和大企業的首選。儘管如此,仍然不乏很多中小企業想要品嚐一下Oracle腥味,因此在Oracle環境中也有不少中小型資料庫。出於成本的考慮,通常有可能就搞個標準版了,跑在Linux上。誰叫Oracle太貴呢?對於中小企業而言,選擇合理的才是最好的。對我們這些個搞DB的,貴的一定有貴的道理,我們也可以都進多幾鬥米。哈哈......典型的打工者的心態喲。言歸正傳,中小企業的成本限制了我們搞高可用,RAC和DG也就比較少了。最近就碰到這樣的情形,就是能否模擬DataGuard來保護資料庫。我們知道DataGuard可以實時將資料庫從主庫切換到備庫,或者從備庫再切換回主庫,實現無縫對接,從而避免由於硬體故障所帶來的資料損失。下文即是基於上面的情形來使用rman catalog方式從某種程度上模擬DataGuard來更大程度地保護資料。
1、模擬DataGuard可行性分析
a、能否將生產資料庫整個結構以相同的結構存在於備份伺服器? 可以,熱備,冷備,RMAN備份,方式多樣化。首次選用冷備初始化資料庫。
b、拋開DG的什麼邏輯物理Standy來考慮,即不考慮實現自動或手動failover。只考慮的Prod機器硬體故障,DB在備份伺服器可用。可行。
c、能否將資料庫損失減小到最少?DG可以定時傳送archivelog,自動apply,那我們也可以定時傳送archivelog,不過自動apply有難度。
d、對於定時傳送的archivelog,能否最終應用的備份伺服器?可以,不論是新增/減少表空間/資料檔案,資料變化更是沒有問題的了。
e、資料丟失的程度取決於最後剩餘未及時傳送的archivelog以及Prod的redo log,這個會損失,沒有辦法,畢竟不是DG。
2、備份恢復方案規劃
下面是資料庫備份的方案規劃
系統環境: Linux,Oracle 10g Standard
資料庫環境: 主資料庫位於Prod伺服器,備份資料庫位於Bak伺服器,資料庫容量<=200GB
備份頻度: 每天做一個level 0級備份,也可以根據需要每2天實現0級備份。當然,如果中型或大型,建議使用0,1,2級增量備份
備份位置:Prod伺服器放置備份檔案,同時將當次的備份檔案ftp到Bak伺服器
歸檔日誌:定時將歸檔日誌ftp到Bak伺服器上與原資料庫相同的歸檔位置
還原頻度:每天定時使用新的備份檔案在Bak伺服器上進行還原
恢復頻度:不作任何恢復操作,因為恢復操作為不完全恢復,且需要使用resetlogs開啟資料庫,會生成新的incarnation
故障處理:如果Prod伺服器主庫損壞,則將剩餘的archivelog及redo複製到Bak(如果可能的話),接下來在Bak伺服器手動恢復資料庫並open
恢復目錄資料庫:建議對恢復目錄資料庫備份,方案多樣不表
3、建立恢復目錄資料庫及其指令碼
由於Prod伺服器資料庫較多,因此建立恢復目錄資料庫。如果你的環境庫較少,可以直接使用控制檔案替代恢復目錄。
其次建立基於恢復目錄資料庫的備份與恢復的全域性指令碼供所有資料庫排程。
關於如何建立恢復目錄資料庫及恢復目錄指令碼,此處省略,請參考:
RMAN catalog 的建立和使用
基於catalog 建立RMAN儲存指令碼
基於catalog 的RMAN 備份與恢復
- --下面列出恢復目錄下部署的所有指令碼
- --注,沒有指定備份路徑,使用預設的閃回區
- RMAN> list global script names;
- List of Stored Scripts in Recovery Catalog
- Global Scripts
- Script Name
- Description
- -----------------------------------------------------------------------
- global_arch
- global_del_obso
- global_inc0
- global_restore
- RMAN> print global script global_arch;
- printing stored global script: global_arch
- {
- allocate channel ch1 type disk maxpiecesize=2g;
- allocate channel ch2 type disk maxpiecesize=2g;
- set limit channel ch1 readrate=10240;
- set limit channel ch1 kbytes=2048000;
- set limit channel ch2 readrate=10240;
- set limit channel ch2 kbytes=2048000;
- crosscheck archivelog all;
- delete noprompt archivelog all;
- sql " alter system archive log current";
- backup as compressed backupset archivelog all delete input tag='Archbk';
- release channel ch1;
- release channel ch2;
- }
- --Author : Robinson Cheng
- --Blog : http://blog.csdn.net/robinson_0612
- RMAN> print global script global_del_obso;
- printing stored global script: global_del_obso
- {
- allocate channel ch1 device type disk;
- delete noprompt obsolete redundancy 1;
- release channel ch1;
- }
- RMAN> print global script global_inc0;
- printing stored global script: global_inc0
- {
- configure retention policy to redundancy 1;
- configure backup optimization on;
- configure controlfile autobackup on;
- allocate channel ch1 device type disk maxpiecesize=5g;
- allocate channel ch2 device type disk maxpiecesize=5g;
- set limit channel ch1 readrate=10240;
- set limit channel ch1 kbytes=4096000;
- set limit channel ch2 readrate=10240;
- set limit channel ch2 kbytes=4096000;
- backup as compressed backupset incremental level 0 database tag='Inc0';
- release channel ch1;
- release channel ch2;
- execute global script global_arch;
- execute global script global_del_obso;
- }
- RMAN> print global script global_restore;
- printing stored global script: global_restore
- {
- restore controlfile;
- sql 'alter database mount';
- crosscheck backup;
- delete noprompt expired backup;
- crosscheck copy;
- delete noprompt expired copy;
- allocate channel ch1 type disk;
- allocate channel ch2 type disk;
- restore database;
- release channel ch1;
- release channel ch2;
- shutdown immediate;
- }
4、建立RMAN備份shell指令碼
- oracle@BKDB01p:/u02/database/common/rman_scripts> more db_bak_rman_catalog.sh
- ##===========================================================
- ## File name: db_bak_rman_catalog.sh
- ## Usage: db_bak_rman_catalog.sh
- ## Desc:
- ## The script uses to backup database with level 0.
- ## Author: Robinson
- ## Blog : http://blog.csdn.net/robinson_0612
- ##============================================================
- #!/bin/bash
- # User specific environment and startup programs
- if [ -f ~/.bash_profile ];
- then
- . ~/.bash_profile
- fi
- # --------------------------
- # Check SID
- # --------------------------
- if [ -z "${1}" ];then
- echo "Usage: "
- echo " `basename $0` ORACLE_SID"
- exit 1
- fi
- # -------------------------------
- # Set environment here
- # -------------------------------
- ORACLE_SID=${1}; export ORACLE_SID
- TIMESTAMP=`date +%Y%m%d%H%M`; export TIMESTAMP
- LOG_DIR=/u02/database/${ORACLE_SID}/backup export LOG_DIR
- RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_bak_${TIMESTAMP}.log
- SSH_LOG=${LOG_DIR}/${ORACLE_SID}_bak_full_${TIMESTAMP}.log
- MAIL_DIR=/users/oracle/sendEmail-v1.56
- MAIL_FM=oracle@BKDB01p
- RETENTION=5
- echo "----------------------------------------------------------------" >>${SSH_LOG}
- echo "Step 1. Start rman to backup at `date`." >>${SSH_LOG}
- echo "----------------------------------------------------------------" >>${SSH_LOG}
-
$ORACLE_HOME/bin/rman log=${RMAN_LOG} <
- connect target sys/xxx@${ORACLE_SID}
- connect catalog rman_user/xxx@CATADB
- resync catalog;
- run {execute global script global_inc0;}
- exit;
- EOF
- RV=$?
- cat ${RMAN_LOG}>>${SSH_LOG}
- echo "" >>${SSH_LOG}
- echo "=====>MSG1: RMAN backup end at `date`." >>${SSH_LOG}
- if [ $RV -ne "0" ]; then
- echo "" >>${SSH_LOG}
- echo "=====>MSG2: RMAN backup error at `date`." >>${SSH_LOG}
- $MAIL_DIR/sendEmail -f $MAIL_FM -u "Failed RMAN backup for $ORACLE_SID on `hostname`." -t dba@12306.com -o message-file=${SSH_LOG}
- exit
- else
- echo "" >>${SSH_LOG}
- echo "=====>MSG2: No error found during RMAN backup peroid at `date`" >>${SSH_LOG}
- rm -rf ${RMAN_LOG} 2>/dev/null
- fi
- echo "-------------------------------------------------------------------------" >>${SSH_LOG}
- echo "Step 2. Start ftp backupset to backup server at `date`." >>${SSH_LOG}
- echo "-------------------------------------------------------------------------" >>${SSH_LOG}
- SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area/${ORACLE_SID}
- SRC_ADD=10.1.2.101
- TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area
- RSYN_LOG=${LOG_DIR}/rsync_${TIMESTAMP}.log
- # rsync is used to ftp backup set to bak server.
- rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>&1
- RV=$?
- cat ${RSYN_LOG}>>${SSH_LOG}
- if [ $RV -ne "0" ]; then
- echo "" >>${SSH_LOG}
- echo "=====>MSG3: FTP backupset error at `date`." >>${SSH_LOG}
- MAIL_SUB="Failed archive log sync for $ORACLE_SID on `hostname` at `date`."
- $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
- exit
- else
- echo "" >>${SSH_LOG}
- echo -e "=====>MSG3: No error found during FTP peroid." >>${SSH_LOG}
- rm -rf $FTP_LOG 2>/dev/null
- fi
- echo "-------------------------------------------------------------------------" >>${SSH_LOG}
- echo "Step 3. RMAN backup and ftp backupset finished at `date`." >>${SSH_LOG}
- echo "-------------------------------------------------------------------------" >>${SSH_LOG}
- MAIL_SUB="Sucessful completed for ${ORACLE_SID} RMAN backup and ftp backupset at `date`."
- $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
- # ------------------------------------------------
- # Removing files older than $RETENTION parameter
- # ------------------------------------------------
- find ${LOG_DIR} -name "*.*" -mtime +$RETENTION -exec rm {} \;
- exit
5、自動FTP archivelog指令碼
- oracle@BKDB01p:/u02/database/common/rman_scripts> more autoftp_arch.sh
- #!/bin/bash
- ORACLE_SID=${1}; export ORACLE_SID
- TIMESTAMP=`date +%Y%m%d%H%M`; export TIMESTAMP
- LOG_DIR=/u02/database/${ORACLE_SID}/backup
- #Define FTP variable
- SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/archive
- SRC_ADD=10.1.2.101
- TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}
- RSYN_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}.log
- RSYN_ERR_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}_err.log
- rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>${RSYN_ERR_LOG}
- RV=$?
- if [ ! -s ${RSYN_ERR_LOG} ];then
- rm -rf ${RSYN_ERR_LOG} 2>/dev/null
- else
- mail -s "Failed FTP archive log for $ORACLE_SID on `hostname`" dba@12306.com
- fi
- exit
6、部署備份指令碼到crontab
如果你的資料庫比較少,則直接將上面的備份指令碼與自動FTP archivelog指令碼部署到crontab。
如果你的資料庫比較多,建議將上面的指令碼封裝到另外的一個檔案,然後部署到crontab。
如下面的full_bak_by_rman.sh實際上是包含了多個db_bak_rman_catalog.sh ,後面的多個full開頭的使用類是的原理。
#Rman backup and restore database
0 1 * * 1-6 /u02/database/common/rman_scripts/full_bak_by_rman.sh
0 3 * * 1-6 /u02/database/common/rman_scripts/full_resotre_by_rman.sh #這個是用來還原的指令碼
#Auto ftp archive log from prod to bak server
*/16 7-20 * * 1-6 /u02/database/common/rman_scripts/full_autoftp_arch.sh
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062380/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 備份恢復篇之RMAN catalogOracle
- 備份恢復Lesson 04.Using the RMAN Recovery Catalog
- RMAN備份恢復典型案例——資料庫卡頓資料庫
- ORACLE DG從庫 Rman備份恢復Oracle
- rman 增量備份恢復
- RMAN備份恢復技巧
- 備份與恢復:polardb資料庫備份與恢復資料庫
- 資料庫備份恢復資料庫
- RMAN備份異機恢復
- RMAN備份恢復典型案例——快速檢查資料庫一致性資料庫
- RMAN備份恢復典型案例——RMAN備份&系統變慢
- 在DG備庫備份資料庫並恢復到一個主機上,報錯RMAN-06820資料庫
- RMAN備份恢復效能優化優化
- RMAN備份與恢復測試
- Mysql資料庫備份及恢復MySql資料庫
- 達夢資料庫備份恢復資料庫
- postgresql備份與恢復資料庫SQL資料庫
- 使用RMAN備份資料庫資料庫
- RMAN備份恢復典型案例——資料檔案存在壞快
- 揭秘ORACLE備份之----RMAN之五(CATALOG)Oracle
- rman備份異機恢復(原創)
- 資料庫備份與恢復技術資料庫
- Mongo 資料庫備份和恢復命令Go資料庫
- pg_dump 備份,恢復資料庫資料庫
- PostgreSql資料庫的備份和恢復SQL資料庫
- RMAN備份恢復典型案例——異機恢復未知DBID
- SqlServer資料庫恢復備份資料的方法SQLServer資料庫
- 利用RMAN備份重建資料庫資料庫
- Elasticsearch系列---生產資料備份恢復方案Elasticsearch
- mongodb資料庫備份與恢復(資料庫資料遷移)MongoDB資料庫
- 12 使用RMAN備份和恢復檔案
- RMAN備份恢復典型案例——ORA-00245
- vivo 資料庫備份恢復系統演化資料庫
- 使用Mysqldump備份和恢復MySQL資料庫MySql資料庫
- MySQL-19.資料庫備份與恢復MySql資料庫
- PG-pg_dump備份/恢復資料庫資料庫
- 備份與恢復:Polardb資料庫資料基於時間點恢復資料庫
- 資料庫資料恢復—無備份,binlog未開啟的Mysql資料庫資料恢復案例資料庫資料恢復MySql
- NoSQL 資料庫案例實戰 -- MongoDB資料備份、恢復SQL資料庫MongoDB