rman 還原歸檔日誌(restore archivelog)

us_yunleiwang發表於2013-12-05

聽說過還原(restore)資料庫,表空間及資料庫檔案,使用歸檔日誌恢復(recover)資料庫,表空間,資料庫檔案。咦,還有還原歸檔日誌這一說法呢?沒錯,可能我們忽略了還原歸檔日誌這一個過程,原因是還原歸檔日誌通常情況下是oracle在recover時自動完成的。大多數情況下我們是先還原資料庫,恢復資料庫,開啟資料庫。實際上在恢復資料庫之前有一個動作,那就是還原歸檔日誌,也就是將日誌檔案還原到預設的歸檔位置,如果我們在備份歸檔日誌時使用了delete [all] input子句的話。本文對此給出了單獨還原歸檔日誌以及恢復歸檔日誌的示例以及restore archivelog的一些用法,僅僅是為了更好來的理解還原與恢復的過程,因為大多數情形下,資料檔案被還原到預設路徑。如果是還原到非預設路徑,那就需要手動restore archivelog。

 

1、理解還原與恢復
     還原(restore): 還原指將資料檔案(可能受損)用之前的備份來替代或者複製到新的路徑,這個是大多數情形和通常的說法。
     恢復(recover): 將備份之後的歸檔日誌apply到資料庫,也就根據歸檔日誌的事務將資料庫重新整理到特定或最新狀態(通常在還原之後操作)。對於歸
           檔日誌中那些已提交的事務進行前滾,未提交的事務進行回滾。
     還原歸檔日誌: 還原歸檔日誌是位於還原資料庫與恢復資料庫之間的這麼一個過程。它會將那些在備份歸檔日誌時使用delete [all] input方式
           刪除的歸檔日誌還原到預設的歸檔位置。在還原資料庫之後,如果要做recover,也就是作介質恢復那就需要用到歸檔日誌。那還原之後進行
           recover需要的歸檔日誌在哪裡呢?歸檔日誌在指定的歸檔路徑那裡,那到底有沒有呢?如果有,還原時出現提示,歸檔日誌已經在指定位置。
           如果沒有,但是備份的歸檔備份集那裡有,也行啊。備份集裡包含備份片,也就是打包了歸檔日誌。那既然打包就要解包,解包到預設路徑
           或指定路徑。這就是還原歸檔日誌。

 

2、示例演示還原歸檔日誌

  1. --演示環境  
  2. --為了較好的模擬還原歸檔日誌,我們僅僅使用了一個特定的資料檔案進行copy方式備份,然後備份歸檔日誌(備份時刪除歸檔日誌)  
  3. --接下來破壞資料檔案,還原資料檔案,還原歸檔日誌檔案,恢復日誌檔案。  
  4. [oracle@linux3 ~]$ cat /etc/issue  
  5. Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)  
  6. Kernel \r on an \m  
  7.   
  8. [oracle@linux3 ~]$ sqlplus -V  
  9.   
  10. SQL*Plus: Release 11.2.0.1.0 Production  
  11.   
  12.   
  13. a、備份資料檔案及歸檔日誌  
  14. RMAN> list backup of archivelog all;   ---&gt列出當前資料庫已經備份的歸檔日誌  
  15.   
  16. specification does not match any backup in the repository  
  17.   
  18. RMAN> list backupset;                  ---&gt列出當前資料庫已存在的備份集  
  19.   
  20. specification does not match any backup in the repository  
  21.     
  22. SQL> select username,default_tablespace from dba_users where username='SCOTT';  --&gt檢視使用者scott所在的表空間及資料檔案  
  23.   
  24. USERNAME                       DEFAULT_TABLESPACE  
  25. ------------------------------ ------------------------------  
  26. SCOTT                          USERS  
  27.   
  28. SQL> select name,file# from v$datafile where tablespace_name='USERS';   
  29.   
  30. NAME                                                              FILE#  
  31. ------------------------------------------------------------ ----------  
  32. /u01/database/sybo3/oradata/users01.dbf                               4  
  33.   
  34. SQL> conn scott/tiger;  
  35. Connected.  
  36. SQL> select name,sequence#,status,COMPLETION_TIME from v$archived_log where status='A';  --&gt當前系統無任何歸檔日誌  
  37.   
  38. no rows selected  
  39.   
  40. SQL> host;  
  41.   
  42. RMAN> copy datafile 4 to '/u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/users01.dbf';  --&gt使用rman copy方式備份資料檔案  
  43.   
  44. RMAN> list copy;  
  45.   
  46. using target database control file instead of recovery catalog  
  47. specification does not match any control file copy in the repository  
  48. specification does not match any archived log in the repository  
  49. List of Datafile Copies  
  50. =======================  
  51.   
  52. Key     File S Completion Time     Ckp SCN    Ckp Time             
  53. ------- ---- - ------------------- ---------- -------------------  
  54. 3       4    A 2013/07/26 20:10:31 961662     2013/07/26 20:10:31  
  55.         Name: /u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/users01.dbf  
  56.         Tag: TAG20130726T201031  
  57.   
  58. --&gt準備測試表用於驗證還原恢復是否成功          
  59. SQL> create table t1 (seq varchar2(10),who varchar2(20));  
  60.   
  61. SQL> insert into t1 select 'First','Robin' from dual;  
  62.   
  63. SQL> commit;  
  64.   
  65. SQL> alter system archive log current;   --&gt產生歸檔日誌  
  66.   
  67. SQL> select name,sequence#,status,COMPLETION_TIME from v$archived_log where status='A';  
  68.   
  69. NAME                                                                              SEQUENCE# S COMPLETION_TIME  
  70. -------------------------------------------------------------------------------- ---------- - -----------------  
  71. /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4sy5ft_.arc             27 A 20130726 20:12:53  
  72.   
  73. SQL> insert into t1 select 'Second','Robinson' from dual;  
  74.   
  75. SQL> commit;  
  76.   
  77. SQL> alter system archive log current;   --&gt再次產生歸檔日誌  
  78.   
  79. SQL> select name,sequence#,status,COMPLETION_TIME from v$archived_log where status='A';  
  80.   
  81. NAME                                                                              SEQUENCE# S COMPLETION_TIME  
  82. -------------------------------------------------------------------------------- ---------- - -----------------  
  83. /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4sy5ft_.arc             27 A 20130726 20:12:53  
  84. /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_28_8z4t1q0s_.arc             28 A 20130726 20:14:47  
  85.   
  86. --&gt下面備份歸檔日誌並刪除已備份的歸當日志  
  87. RMAN> backup archivelog all delete input;  
  88.   
  89. Starting backup at 2013/07/26 20:16:39  
  90. current log archived  
  91. using target database control file instead of recovery catalog  
  92. allocated channel: ORA_DISK_1  
  93. channel ORA_DISK_1: SID=21 device type=DISK  
  94. channel ORA_DISK_1: starting archived log backup set  
  95. channel ORA_DISK_1: specifying archived log(s) in backup set   ---&gt備份集裡包含的歸檔日誌  
  96. input archived log thread=1 sequence=27 RECID=23 STAMP=821823173  
  97. input archived log thread=1 sequence=28 RECID=24 STAMP=821823287  
  98. input archived log thread=1 sequence=29 RECID=25 STAMP=821823400  
  99. channel ORA_DISK_1: starting piece 1 at 2013/07/26 20:16:40  
  100. channel ORA_DISK_1: finished piece 1 at 2013/07/26 20:16:41  
  101. piece handle=/u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/o1_mf_annnn_TAG20130726T201640_8z4t58tn_.bkp tag=TAG20130726T201640 comment=NONE  
  102. channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01  
  103. channel ORA_DISK_1: deleting archived log(s)   ---&gt這裡提示刪除  
  104. archived log file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4sy5ft_.arc RECID=23 STAMP=821823173  
  105. archived log file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_28_8z4t1q0s_.arc RECID=24 STAMP=821823287  
  106. archived log file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_29_8z4t585k_.arc RECID=25 STAMP=821823400  
  107. Finished backup at 2013/07/26 20:16:41  
  108.   
  109.   
  110. b、模擬破壞資料檔案  
  111. SQL> insert into t1 select 'Last','End of test' from dual;  
  112.   
  113. SQL> commit;  
  114.   
  115. SQL> ho cat /dev/null>/u01/database/sybo3/oradata/users01.dbf   ---&gt破壞資料檔案  
  116.   
  117. SQL> select * from t1;     ---&gt此時buffer cache依舊可以查詢到資料  
  118.   
  119. SEQ        WHO  
  120. ---------- --------------------  
  121. First      Robin  
  122. Second     Robinson  
  123. Last       End of test  
  124.   
  125. SQL> alter system checkpoint;  ---&gt實施檢查點程式  
  126.   
  127. System altered.  
  128.   
  129. SQL> select * from t1;         ---&gt此時資料檔案不可訪問  
  130. select * from t1  
  131.               *  
  132. ERROR at line 1:  
  133. ORA-00376: file 4 cannot be read at this time  
  134. ORA-01110: data file 4: '/u01/database/sybo3/oradata/users01.dbf'  
  135.   
  136. SQL> select * from v$recover_file;  
  137. select * from v$recover_file  
  138.               *  
  139. ERROR at line 1:  
  140. ORA-01135: file 4 accessed for DML/query is offline  
  141. ORA-01110: data file 4: '/u01/database/sybo3/oradata/users01.dbf'  
  142.   
  143.   
  144. c、還原與恢復受損的資料檔案  
  145. SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces where tablespace_name='USERS'---&gttablespace 依舊是Online  
  146.   
  147. TABLESPACE_NAME                STATUS  
  148. ------------------------------ ---------  
  149. USERS                          ONLINE  
  150.   
  151. SQL> alter tablespace users offline immediate;   ---&gtoffline受損的tablespace  
  152.   
  153. Tablespace altered.  
  154.   
  155. SQL> select tablespace_name,status from dba_tablespaces where tablespace_name='USERS';  ---&gt此時狀態為offline  
  156.   
  157. TABLESPACE_NAME                STATUS  
  158. ------------------------------ ---------  
  159. USERS                          OFFLINE  
  160.   
  161. RMAN> restore datafile 4;   ---&gt此時使用restore datafile 方式提示失敗  
  162.   
  163. Starting restore at 2013/07/26 20:30:20  
  164. using channel ORA_DISK_1  
  165. RMAN-00571: ===========================================================  
  166. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============  
  167. RMAN-00571: ===========================================================  
  168. RMAN-03002: failure of restore command at 07/26/2013 20:30:20  
  169. ORA-01135: file 4 accessed for DML/query is offline  
  170. ORA-01110: data file 4: '/u01/database/sybo3/oradata/users01.dbf'  
  171. RMAN-06010: error while looking up datafile: 4  
  172.   
  173. RMAN> restore tablespace users; ---&gt此時使用restore tablespace 方式提示失敗,看來,對於copy方式的備份,必須要copy回去  
  174.                                       ---&gt後來看了一下語法,restore (datafile 4) FROM DATAFILECOPY方式可以搞定,括號不能省略  
  175. Starting restore at 2013/07/26 20:31:12  
  176. using channel ORA_DISK_1  
  177. RMAN-00571: ===========================================================  
  178. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============  
  179. RMAN-00571: ===========================================================  
  180. RMAN-03002: failure of restore command at 07/26/2013 20:31:12  
  181. ORA-01135: file 4 accessed for DML/query is offline  
  182. ORA-01110: data file 4: '/u01/database/sybo3/oradata/users01.dbf'  
  183. RMAN-06019: could not translate tablespace name "USERS"  
  184.   
  185. --&gt下面直接使用copy方式進行還原  
  186. SQL> ho cp /u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/users01.dbf /u01/database/sybo3/oradata/users01.dbf  
  187.   
  188. --&gt接下來我們還原歸檔日誌,制定了from sequence子句,實際上,如果我們沒有指定restore archivelog,在recover時也會自動完成還原歸檔日誌  
  189. RMAN> restore archivelog from sequence 27;   
  190.   
  191. Starting restore at 2013/07/26 20:36:55  
  192. using channel ORA_DISK_1  
  193.   
  194. channel ORA_DISK_1: starting archived log restore to default destination   ---&gt這個地方是關鍵提示,還原到預設位置  
  195. channel ORA_DISK_1: restoring archived log  
  196. archived log thread=1 sequence=27  
  197. channel ORA_DISK_1: restoring archived log  
  198. archived log thread=1 sequence=28  
  199. channel ORA_DISK_1: restoring archived log  
  200. archived log thread=1 sequence=29  
  201. channel ORA_DISK_1: reading from backup piece /u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/o1_mf_annnn_TAG20130726T201640_8z4t58tn_.bkp  
  202. channel ORA_DISK_1: piece handle=/u01/database/sybo3/fra/SYBO3/backupset/2013_07_26/o1_mf_annnn_TAG20130726T201640_8z4t58tn_.bkp tag=TAG20130726T201640  
  203. channel ORA_DISK_1: restored backup piece 1  
  204. channel ORA_DISK_1: restore complete, elapsed time: 00:00:01  
  205. Finished restore at 2013/07/26 20:36:57  
  206.   
  207. --Author : Robinson  
  208. --Blog   : http://blog.csdn.net/robinson_0612  
  209.   
  210. --&gt此時在預設的路徑下可以看到已經被還原的歸檔日誌檔案   
  211. SQL> ho ls -hltr /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/*  
  212. -rw-r----- 1 oracle oinstall  13K Jul 26 20:36 /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_29_8z4vc85w_.arc  
  213. -rw-r----- 1 oracle oinstall 4.5K Jul 26 20:36 /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_28_8z4vc85z_.arc  
  214. -rw-r----- 1 oracle oinstall 4.0M Jul 26 20:36 /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4vc85o_.arc  
  215.   
  216. --&gt進行介質恢復  
  217. RMAN> recover datafile 4;  
  218.   
  219. Starting recover at 2013/07/26 20:39:56  
  220. using channel ORA_DISK_1  
  221.   
  222. starting media recovery   ----&gt下面提示歸檔日誌已經存在,是因為我們之前做了restore archivelog  
  223.   
  224. archived log for thread 1 with sequence 27 is already on disk as file /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4vc85o_.arc  
  225. archived log for thread 1 with sequence 28 is already on disk as file /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_28_8z4vc85z_.arc  
  226. archived log for thread 1 with sequence 29 is already on disk as file /u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_29_8z4vc85w_.arc  
  227. archived log file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_07_26/o1_mf_1_27_8z4vc85o_.arc thread=1 sequence=27  
  228. media recovery complete, elapsed time: 00:00:00  
  229. Finished recover at 2013/07/26 20:39:56  
  230.   
  231. --&gtonline tablespace  
  232. SQL> alter tablespace users online;  
  233.   
  234. Tablespace altered.  
  235.   
  236. --&gt驗證結過成功  
  237. SQL> select * from t1;  
  238.   
  239. SEQ        WHO  
  240. ---------- --------------------  
  241. First      Robin  
  242. Second     Robinson  
  243. Last       End of test  


3、restore archivelog 的其它用法
     restore archivelog all;   還原全部歸檔日誌檔案
     restore archivelog from logseq 27 ;  還原log sequence為27之後的所有歸檔日誌
     restore archivelog from logseq 27 until logseq 29; 還原log sequence為27到29這幾個歸檔日誌 
     restore archivelog from time 'sysdate-7'; 還原七天以內的歸檔日誌
     restore archivelog until logseq 29; 還原到seqence 為29的日誌檔案為止
     set archivelog destination to '/u01/database/sybo5/arch';設定還原日誌檔案到新路徑,如
     run{
     set archivelog destination to '/u01/database/sybo5/arch';
     restore archivelog low logseq 27;}
     關於resoter archive的更多用法:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章