中小型資料庫 RMAN CATALOG 備份恢復方案(一)

us_yunleiwang發表於2013-12-05

 對於資料庫的穩定性,高可用,跨平臺以及海量資料庫的處理,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 備份與恢復
    

  1. --下面列出恢復目錄下部署的所有指令碼  
  2. --注,沒有指定備份路徑,使用預設的閃回區  
  3. RMAN> list global script names;  
  4.   
  5. List of Stored Scripts in Recovery Catalog  
  6.   
  7.   
  8.     Global Scripts  
  9.   
  10.   
  11.        Script Name  
  12.        Description  
  13.        -----------------------------------------------------------------------  
  14.        global_arch  
  15.   
  16.        global_del_obso  
  17.   
  18.        global_inc0  
  19.   
  20.        global_restore  
  21.   
  22. RMAN> print global script global_arch;  
  23.   
  24. printing stored global script: global_arch  
  25. {  
  26. allocate channel ch1 type disk maxpiecesize=2g;  
  27. allocate channel ch2 type disk maxpiecesize=2g;  
  28. set limit channel ch1 readrate=10240;     
  29. set limit channel ch1 kbytes=2048000;     
  30. set limit channel ch2 readrate=10240;     
  31. set limit channel ch2 kbytes=2048000;  
  32. crosscheck archivelog all;  
  33. delete noprompt archivelog all;  
  34. sql " alter system archive log current";  
  35. backup as compressed backupset archivelog all delete input tag='Archbk';  
  36. release channel ch1;     
  37. release channel ch2;  
  38. }  
  39.   
  40. --Author : Robinson Cheng  
  41. --Blog   : http://blog.csdn.net/robinson_0612  
  42.   
  43. RMAN> print global script global_del_obso;  
  44.   
  45. printing stored global script: global_del_obso  
  46. {  
  47. allocate channel ch1 device type disk;  
  48. delete noprompt obsolete redundancy 1;   
  49. release channel ch1;   
  50. }  
  51.   
  52. RMAN> print global script global_inc0;  
  53.   
  54. printing stored global script: global_inc0  
  55. {  
  56. configure retention policy to redundancy 1;  
  57. configure backup optimization on;     
  58. configure controlfile autobackup on;  
  59. allocate channel ch1 device type disk maxpiecesize=5g;  
  60. allocate channel ch2 device type disk maxpiecesize=5g;  
  61. set limit channel ch1 readrate=10240;  
  62. set limit channel ch1 kbytes=4096000;  
  63. set limit channel ch2 readrate=10240;     
  64. set limit channel ch2 kbytes=4096000;   
  65. backup as compressed backupset incremental level 0 database tag='Inc0';  
  66. release channel ch1;  
  67. release channel ch2;  
  68. execute global script global_arch;  
  69. execute global script global_del_obso;  
  70. }  
  71.   
  72. RMAN> print global script global_restore;  
  73.   
  74. printing stored global script: global_restore  
  75. {  
  76. restore controlfile;  
  77. sql 'alter database mount';  
  78. crosscheck backup;  
  79. delete noprompt expired backup;  
  80. crosscheck copy;  
  81. delete noprompt expired copy;  
  82. allocate channel ch1 type disk;  
  83. allocate channel ch2 type disk;  
  84. restore database;  
  85. release channel ch1;  
  86. release channel ch2;  
  87. shutdown immediate;  
  88. }  

4、建立RMAN備份shell指令碼      

  1. oracle@BKDB01p:/u02/database/common/rman_scripts> more db_bak_rman_catalog.sh  
  2. ##===========================================================  
  3. ##   File name: db_bak_rman_catalog.sh  
  4. ##   Usage: db_bak_rman_catalog.sh   
  5. ##   Desc:  
  6. ##        The script uses to backup database with level 0.  
  7. ##   Author: Robinson  
  8. ##   Blog  : http://blog.csdn.net/robinson_0612  
  9. ##============================================================  
  10. #!/bin/bash  
  11. # User specific environment and startup programs  
  12.   
  13. if [ -f ~/.bash_profile ];  
  14. then  
  15. . ~/.bash_profile  
  16. fi  
  17.   
  18. # --------------------------  
  19. #   Check SID  
  20. # --------------------------  
  21. if [ -z "${1}" ];then  
  22.     echo "Usage: "  
  23.     echo "      `basename $0` ORACLE_SID"  
  24.     exit 1  
  25. fi  
  26.   
  27. # -------------------------------  
  28. #  Set environment here  
  29. # -------------------------------  
  30. ORACLE_SID=${1};                                    export ORACLE_SID  
  31. TIMESTAMP=`date +%Y%m%d%H%M`;                       export TIMESTAMP  
  32. LOG_DIR=/u02/database/${ORACLE_SID}/backup          export LOG_DIR  
  33. RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_bak_${TIMESTAMP}.log  
  34. SSH_LOG=${LOG_DIR}/${ORACLE_SID}_bak_full_${TIMESTAMP}.log  
  35. MAIL_DIR=/users/oracle/sendEmail-v1.56  
  36. MAIL_FM=oracle@BKDB01p  
  37. RETENTION=5  
  38.   
  39. echo "----------------------------------------------------------------" >>${SSH_LOG}  
  40. echo "Step 1. Start rman to backup at `date`."                          >>${SSH_LOG}  
  41. echo "----------------------------------------------------------------" >>${SSH_LOG}  
  42.   
  43. $ORACLE_HOME/bin/rman log=${RMAN_LOG} <
  44. connect target sys/xxx@${ORACLE_SID}  
  45. connect catalog rman_user/xxx@CATADB  
  46. resync catalog;  
  47. run {execute global script global_inc0;}  
  48. exit;  
  49. EOF  
  50. RV=$?  
  51.   
  52. cat ${RMAN_LOG}>>${SSH_LOG}  
  53. echo ""        >>${SSH_LOG}  
  54. echo "=====>MSG1: RMAN backup end at `date`." >>${SSH_LOG}  
  55.   
  56. if [ $RV -ne "0" ]; then  
  57.     echo "" >>${SSH_LOG}  
  58.     echo "=====>MSG2: RMAN backup error at `date`." >>${SSH_LOG}  
  59.     $MAIL_DIR/sendEmail -f $MAIL_FM -u "Failed RMAN backup for $ORACLE_SID on `hostname`." -t dba@12306.com -o message-file=${SSH_LOG}  
  60.     exit  
  61. else  
  62.     echo "" >>${SSH_LOG}  
  63.     echo "=====>MSG2: No error found during RMAN backup peroid at `date`" >>${SSH_LOG}  
  64.     rm -rf ${RMAN_LOG} 2>/dev/null  
  65. fi  
  66.   
  67. echo "-------------------------------------------------------------------------" >>${SSH_LOG}  
  68. echo "Step 2. Start ftp backupset to backup server at `date`."                   >>${SSH_LOG}  
  69. echo "-------------------------------------------------------------------------" >>${SSH_LOG}  
  70.   
  71. SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area/${ORACLE_SID}  
  72. SRC_ADD=10.1.2.101  
  73. TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area  
  74. RSYN_LOG=${LOG_DIR}/rsync_${TIMESTAMP}.log  
  75.   
  76. # rsync is used to ftp backup set to bak server.  
  77. rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>&1  
  78. RV=$?  
  79.   
  80. cat ${RSYN_LOG}>>${SSH_LOG}  
  81. if [ $RV -ne "0" ]; then  
  82.     echo ""                                                    >>${SSH_LOG}  
  83.     echo "=====>MSG3: FTP backupset error at `date`."          >>${SSH_LOG}  
  84.     MAIL_SUB="Failed archive log sync for $ORACLE_SID on `hostname` at `date`."  
  85.     $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}  
  86.     exit  
  87. else  
  88.     echo ""                                                 >>${SSH_LOG}  
  89.     echo -e "=====>MSG3: No error found during FTP peroid." >>${SSH_LOG}  
  90.     rm -rf $FTP_LOG 2>/dev/null  
  91. fi  
  92.   
  93. echo "-------------------------------------------------------------------------"  >>${SSH_LOG}  
  94. echo "Step 3. RMAN backup and ftp backupset finished at `date`."                  >>${SSH_LOG}  
  95. echo "-------------------------------------------------------------------------"  >>${SSH_LOG}  
  96.   
  97. MAIL_SUB="Sucessful completed for ${ORACLE_SID} RMAN backup and ftp backupset at `date`."  
  98. $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}  
  99.   
  100. # ------------------------------------------------  
  101. # Removing files older than $RETENTION parameter  
  102. # ------------------------------------------------  
  103.   
  104. find ${LOG_DIR} -name "*.*" -mtime +$RETENTION -exec rm {} \;  
  105.   
  106. exit  

5、自動FTP archivelog指令碼

  1. oracle@BKDB01p:/u02/database/common/rman_scripts> more autoftp_arch.sh  
  2. #!/bin/bash  
  3.   
  4. ORACLE_SID=${1};                        export ORACLE_SID  
  5. TIMESTAMP=`date +%Y%m%d%H%M`;           export TIMESTAMP  
  6. LOG_DIR=/u02/database/${ORACLE_SID}/backup   
  7.   
  8. #Define FTP variable  
  9. SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/archive  
  10. SRC_ADD=10.1.2.101  
  11. TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}  
  12. RSYN_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}.log  
  13. RSYN_ERR_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}_err.log  
  14.   
  15. rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>${RSYN_ERR_LOG}  
  16. RV=$?  
  17.   
  18. if [ ! -s ${RSYN_ERR_LOG} ];then  
  19.     rm -rf ${RSYN_ERR_LOG} 2>/dev/null  
  20. else  
  21.     mail -s "Failed FTP archive log for $ORACLE_SID on `hostname`" dba@12306.com 
  22. fi  
  23.   
  24. 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章