程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2重定向恢復和前滾常見問題解析

DB2重定向恢復和前滾常見問題解析

編輯:DB2教程

DB2重定向恢復和前滾常見問題解析   前言  數據庫管理和維護工作中一項重要的內容就是對數據庫進行定期的備份和恢復。這種工作的重要性除了表現在數據的保全,系統的容災方面,還表現在為應用系統的開發和測試搭建數據庫環境。  設想在一個不斷更新升級的應用環境中,數據庫的數據在不斷的更新,程序開發人員也在不斷開發新的版本,建立測試數據和環境,對應用進行測試,再發布到生產環境下。這樣,對於一個高復雜性的應用,使用生產環境中的真實數據來建立測試環境就變成了合理的選擇。當然,在使用真實數據之前,為了保護公司利益可能需要刪除或修改一些敏感的數據。  在上述場景下,數據庫管理員就要根據項目開發的要求,把生產環境的數據復制到開發和測試環境。數據庫重定向恢復技術就提供了一個比較快的方式幫助管理員完成這項工作。  本文針對哪有對 DB2 恢復有初步知識的讀者,重點討論在重定向恢復和前滾的過程當中經常碰到的問題,並通過一些實際應用中遇到的問題,探討如何事先避免以及問題發生之後的解決辦法。    DB2 重定向恢復和前滾知識簡介  從上一節假定的場景中,我們知道 DB2 重定向恢復常用於在不同的環境中進行數據庫的恢復。這些環境的不同就會給重定向恢復造成一些麻煩。比如:生產環境的內存通常比測試環境的都要大,生產環境中給事物日志分配的空間也要大一些,另外,最明顯的區別就是測試環境中表空間的位置和原來在生產環境上不一樣了。對於這些區別,提前了解和掌握以後就有助於預防和解決在數據庫恢復時遇到的問題。下面就分別介紹重定向恢復和前滾的操作方法和相關命令。  自動生成重定向恢復腳本以及重定向恢復狀態查詢  DB2 提供了命令,供用戶從一次數據庫備份文件中提取數據庫重定向恢復腳本。示例如下,其中 /db2_backup/db2inst1/sample 是數據庫備份文件所在的目錄,20101023180128 是數據庫備份文件的時間戳。  db2 restore db sample from /db2_backup/db2inst1/sample taken at 20101023180128  redirect generate script redirect_sample.sql  DB20000I The RESTORE DATABASE command completed successfully.    所生成的重定向文件 redirect_sample.sql,可以分為三個部分:  1. Restore 語句  此語句用來標示一個重定向的恢復操作命令開始,它在普通恢復的命令上加了 redirect 參數。  RESTORE DATABASE SAMPLE  FROM '/db2_backup/db2inst1/sample'  TAKEN AT 20101023180128  INTO SAMPLE  REDIRECT;    2. set containers 語句:  當目標數據庫所的物理存儲設備與原來的數據庫不一樣時,就需要下面的命令來指定新的物理容器。  SET TABLESPACE CONTAINERS FOR 0  USING (    PATH '/db2inst1/SAMPLE'  );  SET TABLESPACE CONTAINERS FOR 1  USING (    PATH '/ db2inst1/temp'  );  SET TABLESPACE CONTAINERS FOR 2  USING (    DEVICE '/dev/rsample_1G' 131072  );  ……    3. restore continue 語句:  此語句代表重定向恢復語句序列完成,系統開始恢復數據庫。  RESTORE DATABASE SAMPLE CONTINUE;    在數據庫進行恢復的過程中,我們可以通過 list utilities 命令查看 restore 的狀態。示例如下:  db2 list utilities show detail    ID = 4  Type = RESTORE  Database Name = SAMPLE  Partition Number = 0  Description = db  Start Time = 10/24/2010 13:49:17.515893  State = Executing  Invocation Type = User  Progress Monitoring:    Completed Work = 2938126336 bytes    Start Time = 10/24/2010 13:49:17.515898    其中的 Completed Work 代表已完成的數據量,與備份文件的大小比較可以估算出大概的完成時間。  常用前滾命令 , 所需日志文件的確定以及狀態查詢  前滾命令多種多樣,這裡不一一列舉。最常用的語句就是 rollforward to 和 rollforward complete。  例如,使用指定目錄的日志文件,前滾到某一時刻點:  rollforward db sample to 2010-11-21-17.00.00.000000  using local time overflow log path ( /db2_backup/sample/logs )    前滾結束:  rollforward db sample complete overflow log path ( /db2_backup/sample/logs )    最有效的查詢 rollforward 狀態的語句:  db2 rollforward db db_name query status    例如,restore 成功結束,rollforward 還沒有開始,查看狀態會得到類似結果:  db2 rollforward db sample query status      Rollforward Status    Input database alias = sample  Number of nodes have returned status = 1    Node number = 0  Rollforward status = DB pending  Next log file to be read = S0001519.LOG  Log files processed = -  Last committed transaction = 2010-10-23-08.41.52.000000 UTC    我們可以得知,rollforward 要讀取的下一個日志文件是 S0001519.LOG。  在數據庫前滾的過程中,我們也可以通過 list utilities 查看前滾的狀態。  $ db2 list utilities show detail    ID = 5  Type = ROLLFORWARD RECOVERY  Database Name = SAMPLE  Partition Number = 0  Description = Database Rollforward Recovery  Start Time = 10/25/2010 01:45:44.392021  State = Executing  Invocation Type = User  Progress Monitoring:    Phase Number [Current] = 1    Description = Forward    Completed Work = 824384727 bytes    Start Time = 10/25/2010 01:45:44.392051      Phase Number = 2    Description = Backward    Completed Work = 0 bytes    Start Time = Not Started      DB2 重定向恢復常見問題解析  在 DB2 重定向恢復的三個階段中,錯誤常常發生在第二階段,也就是 set tablespace containers 的時候。在這裡列舉了一些常見的錯誤,和這些錯誤的解決方法及預防。供大家參考。  對裸設備類型的容器,大小計算錯誤  命令及結果:  db2 set tablespace containers for 8 using( DEVICE '/dev/rsample_1G' 262144 )  SQL1422N The size of the container is invalid. SQLSTATE=54039    解決方法以及預防:  容器大小 262144 不正確。結合 lslv 的檢查結果和表空間的 pagesize,重新計算容器大小。  lslv rsample_1G  LOGICAL VOLUME: rsample_1G  VOLUME GROUP: datavg3  LV IDENTIFIER: 00c790ea00004c000000011fb9a36069.112 PERMISSION: read/write  VG STATE: active/complete  LV STATE: opened/syncd  TYPE: raw  WRITE VERIFY: off  MAX LPs: 512    PP SIZE: 64 megabyte(s)  COPIES: 1  SCHED POLICY: parallel  LPs: 16   PPs: 16  STALE PPs: 0  BB POLICY: relocatable  INTER-POLICY: minimum  RELOCATABLE: yes  INTRA-POLICY: middle  UPPER BOUND: 1024  MOUNT POINT: N/A  LABEL: None  MIRROR WRITE CONSISTENCY: on/ACTIVE  EACH LP COPY ON A SEPARATE PV ?: yes  Serialize IO ?: NO  DEVICESUBTYPE : DS_LVZ    計算公式如下:PPs * PP Size / pagesize  此處,pagesize 按照8 K 計算 。  db2 set tablespace containers for 8 using( DEVICE '/dev/rsample_1G' 131072 )  DB20000I The SET TABLESPACE CONTAINERS command completed successfully.    指定的容器,已經被使用了  命令及結果:  db2 set tablespace containers for 64 using( DEVICE '/dev/rsample_4G' 524288 )  SQL0294N The container is already in use. SQLSTATE=42730    解決方法以及預防:  通過 lslv 檢查裸設備的狀態,注意其中 LV STATE 的值。如果是 opened/syncd,意味著這個容器正在被其他的系統占用。如果是 closed/syncd,就可能是可用的設備。這裡說“可能”是因為有些時候,比如數據庫停掉以後,它所使用的所有的裸設備就都是 closed/syncd 狀態,但如果這時其他應用使用了這個裸設備,就會讓這個數據庫受損。所以在使用前一定要確認,沒有其他系統在使用這個裸設備。  DB2 在使用一個裸設備的時候會設置一些標志位,表明哪一個實例的數據庫正在使用這個裸設備。但是當 DB2 刪除一個表空間或者其中一個容器的時候,有時候這些標志位不會被清空,這時候雖然沒有其他的數據庫在使用這個設備,依然會出現上面的錯誤。在確認沒有其他系統使用之後,就可以用下面的 DB2 命令手動清空這些標志位。  db2untag -f /dev/rsample_4G    指定的容器類型,與原有容器不一致  命令及結果:  db2 set tablespace containers for 3 using( PATH '/db2inst1/SAMPLE/TBS/SYSTOOL’)  SQL0298N Bad container path. SQLSTATE=428B2    解決方法以及預防:  原有容器是 FILE 類型,如果在重定向恢復的時候指定為 PATH,就會報錯。  修改後:  db2 set tablespace containers for 3  using( File '/db2inst1/SAMPLE/TBS/SYSTOOL.DAT' 100 )  DB20000I The SET TABLESPACE CONTAINERS command completed successfully.    指定的容器名發生錯誤  命令及結果:  db2 set tablespace containers for 106  using( DEVICE '/dev/dev/rsample_500M' 65536 )  SQL0298N Bad container path. SQLSTATE=428B2    解決方法以及預防:  確保容器名及路徑的正確性。  db2 set tablespace containers for 106  using( DEVICE '/dev/rsample_500M' 65536)  DB20000I The SET TABLESPACE CONTAINERS command completed successfully.    Restore db continue 的時候發生錯誤,數據庫恢復目錄滿  db2 restore db sample continue  SQL2544N The directory where the database is being restored has become full.    解決方法以及預防:  檢查包含 PATH 的語句,  set tablespace containers for 0 using(    PATH '/db2inst1/SAMPLE'  ) ;    可能的原因:  目錄 /db2inst1/SAMPLE 滿了。  重點檢查 SMS 表空間所在目錄的使用情況。更換或者擴充文件系統。也可以通過 db2diag.log 文件得到更詳細的信息。    前滾常見問題解析  運行 rollforward 時,日志文件缺失  命令及結果:  db2 "rollforward db sample to 2010-10-24-17.00.00  using local time overflow log path (/db2_backup/db2inst1/logs)"    SQL4970N Roll-forward recovery on database "SAMPLE" cannot reach the specified  stop point (end-of-log or point-in-time) on database partition(s) "0".  Roll-forward recovery processing has halted on log file "S0102805.LOG".    錯誤日志(db2diag.log):  2010-11-23-03.03.17.731773-300 I2966741A419 LEVEL: Error  PID : 1089734 TID : 2615 PROC : db2sysc 0  INSTANCE: db2inst1 NODE : 000 DB : SAMPLE  EDUID : 2615 EDUNAME: db2loggr (SAMPLE) 0  FUNCTION: DB2 UDB, data protection services, sqlpgasn, probe:650  RETCODE : ZRC=0x801000BB=-2146434885=SQLPR_MISSING_LOGFILES  "rollforward missing log files"    解決方法以及預防:  從備份磁盤獲取所需的日志文件。然後再次運行 rollforward 命令。  也可以通過以下命令來提前准備所需日志文件,避免出錯。可以從“Start Time”和“End Time”判斷 rollforward 到某個時間點所需的最後的一個日志文件。  db2 list history archive log since 20101023040030 for sample | more    List History File for sample  Number of matching file entries = 30  Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID  -- --- -------- ---- --- ------- ------- --------    X D 20101023045856 1 U S0102805.LOG C0000000  -------------------------------------------  -------------------------------------------    Comment:  Start Time: 20101023045856    End Time: 20101026033936    Status: A  -------------------------------------------    運行 rollforward complete 時,活動日志空間滿  命令及結果:  db2 "rollforward db sample complete overflow log path /db2_backup/db2inst1/logs)"  SQL1004C There is not enough storage on the file system to process the command.    錯誤日志(db2diag.log):  2010-10-27-23.06.28.470787-240 I172869537A496 LEVEL: Error  PID : 1970552 TID : 5655 PROC : db2sysc 0  INSTANCE: db2inst1 NODE : 000 DB : SAMPLE  APPHDL : 0-61 APPID: *LOCAL.db2inst1.101028030442  AUTHID : DB2inst1  EDUID : 5655 EDUNAME: db2agent (SAMPLE) 0  FUNCTION: DB2 UDB, recovery manager, sqlpForwardRecovery, probe:2610  RETCODE : ZRC=0x850F000C=-2062614516=SQLO_DISK "Disk full."    DIA8312C Disk was full.    解決方法以及預防:  修改數據庫配置參數 NEWLOGPATH,指定空間更大的目錄作為活動日志目錄。然後再次運行 rollforward 命令。  db2 update db cfg for sample using NEWLOGPATH /db2_backup/db2inst1_log01/sample      或者提前修改 redirect restore 命令,在做數據庫恢復的時候就指定更大的目錄作為活動日志目錄。這樣可以避免在 rollforward 的過程中遇到問題。  db2 "restore db sample \    from /db2_backup/db2inst1/backup \    taken at 20101023084025 newlogpath /db2_backup/db2inst1_log01/sample \    redirect"      與緩沖池相關的錯誤 ,解決方法以及預防  命令及結果:  db2 "rollforward db sample to 2010-11-21-17.00.00.000000  using local time overflow log path ( /db2_backup/db2inst1/SAMPLE/logs ) "  SQL1218N There are no pages currently available in bufferpool "".  SQLSTATE=57011    錯誤日志(db2diag.log):  2010-11-24-05.19.14.842891-300 I67571A941 LEVEL: Error  PID : 296330 TID : 75304  PROC : db2sysc 0  INSTANCE: db2inst1 NODE : 000 DB : SAMPLE  APPHDL : 0-27 APPID: *LOCAL.db2inst1.101124101914  AUTHID : DB2INST1  EDUID : 75304 EDUNAME: db2agent (SAMPLE) 0  FUNCTION: DB2 UDB, SQO Memory Management, SqloMemController::registerConsumer, p  robe:1000  MESSAGE : ZRC=0x8B0F0000=-1961951232=SQLO_NOMEM "No Memory Available"    DIA8300C A memory heap error has occurred.    解決方法以及預防:  這裡的錯誤是源數據庫設置的緩沖區太大,目標數據庫所在系統無法支持。我們可以修改參數值 DB2_OVERRIDE_BPF,強制 DB2 采用較小的緩沖區。重啟實例後,再次執行 rollforward 操作。  db2set DB2_OVERRIDE_BPF=500 (500 為假定值)    與表空間狀態相關的錯誤,解決方法以及預防  LOAD 操作可能會對 rollforward 造成一定的影響。有時候在 rollforward 的過程中需要交互操作。如果選擇 (t),會造成表空間的狀態不正常。  命令及結果:  db2 "rollforward db sample to 2010-11-19-17.00.00  using local time overflow log path ( /db2_backup/db2inst1/logs )"    SQL3799W Load recovery for table "TEST .WORK_DETAIL" at time  "20101116221501" on node "0" is pending due to warning "-2061" with additional  information "/dev/null".  Do you want to continue(c),terminate this device only(d),abort the utility(t) ?    錯誤日志(db2diag.log):  2010-11-24-11.15.39.678474-300 I806561A381 LEVEL: Warning  PID : 2126036 TID : 1 PROC : db2redom (SAMPLE) 0  INSTANCE: db2inst1 NODE : 000 DB : SAMPLE  APPHDL : 0-668 APPID: *LOCAL.db2inst1.081124154042  FUNCTION: DB2 UDB, recovery manager, sqlpRecDbRedo, probe:2129  MESSAGE : Tablespace 27 in restore pending state.    解決方法以及預防:  我們可以查看某一備份時刻之後的 LOAD 操作情況。  db2 list history backup since 20101120170928 for sample | more    如果出現了 rollforward 造成的表空間不可用。我們可以進行相應的表空間恢復。或者刪除、重建相應的表空間,並導入數據。  與表狀態相關的錯誤,解決方法以及預防  在數據庫 restore 和 rollforward 完成之後,檢查每個數據表的狀態時,可能會發現有的數據表狀態不可用。簡單的方法是過濾 db2diag.log 文件,找出類似下面的錯誤信息。  錯誤日志(db2diag.log):  2010-11-26-08.01.51.170966-300 E21515A743 LEVEL: Warning  PID : 3104786 TID : 26364 PROC : db2sysc 0  INSTANCE: db2inst1 NODE : 000 DB : SAMPLE  APPHDL : 0-380 APPID: *LOCAL.db2inst1.101126125907  AUTHID : DB2INST1  EDUID : 26364 EDUNAME: db2redom (SAMPLE) 0  FUNCTION: DB2 UDB, data management, sqldMarkObjInErr, probe:1  MESSAGE : ADM5571W DB2 is marking the "DATA" object with id "141" in    tablespace "8" for table "TBSPACEID=8.TABLEID=141" unavailable.    Either the table will have to be dropped, or if the object is part of    a partitioned table the partition in error can be detached or the    index in error can be dropped.    解決方法以及預防:  一般情況下,我們需要刪除並重建這些數據表。必要的情況下,我們可以從其他環境或備份進行數據恢復。    結束語  本文列舉了一些 DB2 重定向恢復中經常出現的問題及解決辦法,希望能幫助讀者解決一些實際工作當中碰到的情況。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved