DB2 恢復已刪除的表測試:(測試平台:RHEL 5.4 DB2 V9.7.0)
-- 哈哈,小弟菜鳥一個! 剛看牛大師的書,做了一下例子,混個臉熟,順便來賣弄一下自己,滿足一下自己的虛榮心!
-- 下面我們舉一個dropped table recovery的例子。
-- *(1) 執行完全數據庫教程備份,需要注意備份鏡像的時間戳。
(Instance:DB2INST1, Database: TEST1):backup db test1 to /home/db2inst1/db2_backup
Backup successful. The timestamp for this backup image is : 20100522140304
(Instance:DB2INST1, Database: TEST1):
-- *(2) 連接到數據庫並創建表,執行生成日志記錄的操作,插入幾條記錄:
CONNECT TO test1
CREATE TABLE tab1(no INTEGER) IN tbsp1
INSERT INTO tab1 VALUES(1), (2), (3), (4), (5)
-- *(3) 模擬意外丟棄表的場景:
DROP TABLE tab1
COMMIT
SELECT * FROM tab1
-- 將返回以下錯誤消息:
Error: SQL0204N "Administrator.TAB1" is an undefined name
-- *(4) 恢復數據庫。
-- 要恢復已被丟棄的表,先恢復數據庫備份,然後執行向前恢復(rollforward)操作:
RESTORE DATABASE test1 FROM /home/db2inst1/db2_backup TAKEN AT 20100522140304 INTO test1
-- 將返回以下消息:
......
-- *(5) 檢索已丟棄的對象ID。
-- 使用以下命令檢索意外丟棄的表的對象ID:
LIST HISTORY DROPPED TABLE ALL FOR DATABASE test1
-- 可以將返回的信息(例如表7-3中顯示的示例)復制到某個文件中以供未來引用。
(Instance:DB2INST1, Database: TEST1):list history dropped table all for database test1
List History File for test1
Number of matching file entries = 1
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
D T 20100522141107 000000000000684300080004
----------------------------------------------------------------------------
"DB2INST1"."TAB1" resides in 1 tablespace(s):
00001 TBSP1
----------------------------------------------------------------------------
Comment: DROP TABLE
Start Time: 20100522141107
End Time: 20100522141107
Status: A
----------------------------------------------------------------------------
EID: 33
DDL: CREATE TABLE "DB2INST1"."TAB1" ( "NO" INTEGER ) IN "TBSP1" ;
----------------------------------------------------------------------------
(Instance:DB2INST1, Database: TEST1):
-- 表7-3中的Backup ID欄顯示被丟棄的表的ID為000000000000684300080004。這一信息對於恢復表非常重要。
-- *(6) 向前恢復數據庫。
-- 現在已經獲得了被丟棄的表的ID,下一步需要使用該表的備份ID恢復數據庫,這樣才能夠導入表的數據。在向前恢復數據庫之前,
-- 需要確保有一個目錄可以供存儲導入數據,比如說/home/db2inst1/test1/exporttab1。使用以下命令向前恢復數據庫:
mkdir -p /home/db2inst1/test1/exporttab1
-- ROLLFORWARD DATABASE test1 TO END OF LOGS AND STOP RECOVER DROPPED TABLE 000000000000684300080004 TO /home/db2inst1/test1/exporttab1
(Instance:DB2INST1, Database: TEST1):rollforward database test1 to end of logs and stop
(Instance:DB2INST1, Database: TEST1):recover dropped table 000000000000684300080004
(Instance:DB2INST1, Database: TEST1):to /home/db2inst1/test1/exporttab1
Rollforward Status
Input database alias = test1
Number of nodes have returned status = 1
Node number = 0
Rollforward status = not pending
Next log file to be read =
Log files processed = S0000007.LOG - S0000007.LOG
Last committed transaction = 2010-05-22-06.11.07.000000 UTC
DB20000I The ROLLFORWARD command completed successfully.
-- END OF LOGS選項的作用是讓DB2在執行備份操作後應用所有可用日志文件。
-- *(7) 檢查導入的數據文件。
-- 完成數據庫向前恢復之後,需要 檢查在ROLLFORWARD命令中指定的路徑。應該能夠找到一個.TXT文件,
-- 打開該文件並驗證其中包含的數據與意外丟棄表之前的數據是否相同。
-- *(8) 連接到數據庫並重新創建被丟棄的表。
-- 驗證導出文件之後,我們需要重新創建被丟棄的表並重新填入數據。被丟棄的表的定義包含在步驟(5)的LIST HISTORY命令的輸出中。
-- 連接到數據庫並執行CREATE TABLE語句:
CONNECT TO test1
CREATE TABLE "DB2INST1"."TAB1" ( "NO" INTEGER ) IN "TBSP1" ;
-- *(9) 導入數據
-- 重新創建表之後,可以使用以下命令將數據庫重新導入到表中:
IMPORT FROM /home/db2inst1/test1/exporttab1/NODE0000/data OF DEL INSERT INTO "DB2INST1"."TAB1"
-- IMPORT工具將導出文件中的所有數據導回到表中,並在成功後發送報告(未顯示)。
-- *(10) 驗證恢復後的數據
-- 確保IMPORT過程中沒有錯誤或報警,並且所有數據都已導回表中:
SELECT * FROM tab1
-- 如果一切運行正常,則意外丟棄點之前的所有數據應該都在表中。