如何恢復DB2中誤刪除表的資料
1. 首先資料庫要可以前滾恢復(資料庫配置引數logretain或userexit開啟)。 db2 connect to dbname db2 update db cfg using logretain on db2 backup db dbname (當開啟歸檔日誌後,該資料庫會處於rollforward pending狀態,所以要做一次全備份)
2. 對要實施Drop Table Recovery的表空間(限regular tablespace),執行: db2 "alter tablespace 表空間名稱 dropped table recovery on "
3. 用 list history dropped table all for 資料庫名 得到刪除表的tableid(例如 0000000000006d0000020003)和表結構的生成語句(DDL),記錄tableid和該語句以便恢復。之後,用drop命令刪除的表 中的資料可以在前滾恢復時匯出。
4. 恢復資料庫後,如果想恢復已刪除的表,在前滾時加recover dropped table tableid to 目標目錄 。在該目錄下被刪除的表中的資料匯出。利用上面提到表結構生成語句生成被刪除了的表,然後用import命令將資料匯入表中。 db2 restore db dbname tablespace(tablespacename) without rolling forward without prompting db2 "rollforward db dbname to end of logs and stop tablespace(tablespacename) recover dropped table table id to path " cd path 利用 db2 list history dropped table all for dbname 查出的表結構生成語句生成被刪除了的表 db2 import from data of del insert into tablename
附一個具體的恢復步驟(以sample庫為例): D:sample>db2 alter tablespace userspace1 dropped table recovery on DB20000I SQL 命令成功完成。
D:sample>db2 commit DB20000I SQL 命令成功完成。
D:sample>db2 list history dropped table all for sample
列示 sample 的歷史檔案
匹配的檔案條目數 = 1
Op 物件 時間戳記+序列 型別 裝置 最早日誌 當前日誌 備份標識
- — ----------------- -
00001 USERSPACE1 ---------------------------------------------------------------------------- 註釋:DROP TABLE 開始時間:20061204003949 結束時間:20061204003949 狀態:A ---------------------------------------------------------------------------- EID:2
DDL: CREATE TABLE "HEAVEN "."ORG" ( "DEPTNUMB" SMALLINT NOT NULL , "DEPTNAME" VARCHAR(14) , "MANAGER" SMALLINT , "DIVISION" VARCHAR(10) , "LOCATION" VARCHAR(1 3) ) IN "USERSPACE1" ; ---------------------------------------------------------------------------- D:sample>db2 restore db sample tablespace(userspace1) without rolling forward w ithout prompting DB20000I RESTORE DATABASE 命令成功完成。 D:sample>db2 "rollforward db sample to end of logs and stop tablespace(userspac e1) recover dropped table 000000000000b70000020002 to C: "
前滾狀態
輸入資料庫別名 = sample 節點數已返回狀態 = 1
節點號 = 0 前滾狀態 = 未暫掛 下一個要讀取的日誌檔案 = 已處理的日誌檔案 = - 上次落實的事務 = 1970-01-01-00.00.00.000000
DB20000I ROLLFORWARD 命令成功完成。
D:sample>db2 connect to sample
資料庫連線資訊
資料庫伺服器 = DB2/NT 8.2.5 SQL 授權標識 = HEAVEN 本地資料庫別名 = SAMPLE
D:sample>db2 select * from sales SQL0204N "HEAVEN.SALES" 是未定義的名稱。 SQLSTATE=42704
D:sample>db2 list history dropped table all for sample
列示 sample 的歷史檔案
匹配的檔案條目數 = 2
Op 物件 時間戳記+序列 型別 裝置 最早日誌 當前日誌 備份標識
- — ----------------- -- — ---------- ---------- -------------
D T 20061204003949 000000000000b700
020002
----------------------------------------------------------------------------
"HEAVEN "."ORG" 駐留在 1 表空間中:
00001 USERSPACE1 ---------------------------------------------------------------------------- 註釋:DROP TABLE 開始時間:20061204003949 結束時間:20061204003949 狀態:A ---------------------------------------------------------------------------- EID:2
DDL: CREATE TABLE "HEAVEN "."ORG" ( "DEPTNUMB" SMALLINT NOT NULL , "DEPTNAME VARCHAR(14) , "MANAGER" SMALLINT , "DIVISION" VARCHAR(10) , "LOCATION" VARCHAR 3) ) IN "USERSPACE1" ; ----------------------------------------------------------------------------
Op 物件 時間戳記+序列 型別 裝置 最早日誌 當前日誌 備份標識
- — ----------------- -- — ---------- ---------- -------------
D T 20061204004618 000000000000d500
02000b
----------------------------------------------------------------------------
"HEAVEN "."SALES" 駐留在 1 表空間中:
00001 USERSPACE1 ---------------------------------------------------------------------------- 註釋:DROP TABLE 開始時間:20061204004618 結束時間:20061204004618 狀態:A ---------------------------------------------------------------------------- EID:6
DDL: CREATE TABLE "HEAVEN "."SALES" ( "SALES_DATE" DATE , "SALES_PERSON" VAR AR(15) , "REGION" VARCHAR(15) , "SALES" INTEGER ) IN "USERSPACE1" ; ----------------------------------------------------------------------------
D:sample>c:
C:>db2 "CREATE TABLE "HEAVEN "."SALES" ( "SALES_DATE" DATE , "SALES_PERSON" VARAR(15) , "REGION" VARCHAR(15) , "SALES" INTEGER ) IN "USERSPACE1"" CREATE TABLE "HEAVEN "."SALES" ( "SALES_DATE" DATE , "SALES_PERSON" VARCHAR(1 , "REGION" VARCHAR(15) , "SALES" INTEGER ) IN "USERSPACE1" DB20000I SQL 命令成功完成。
C:>cd NODE0000
C:NODE0000>db2 import from data of del insert into sales SQL3109N 實用程式開始裝入檔案 "data" 中的資料。
SQL3110N 實用程式已完成處理。從輸入檔案讀取了 "41" 行。
SQL3221W ...開始 COMMIT WORK。輸入記錄計數 = "41"。
SQL3222W ...COMMIT 任何資料庫更改成功。
SQL3149N 從輸入檔案中處理了 "41" 行。將 "41" 行成功插入到表中。"0" 行被拒絕。
讀取行數 = 41 跳過行數 = 0 插入行數 = 41 更新行數 = 0 拒絕行數 = 0 落實行數 = 41
C:NODE0000>db2 select * from sales
SALES_DATE SALES_PERSON REGION SALES
--------- ------------- ------------- ----------
1995-12-31 LUCCHESSI Ontario-South 1
1995-12-31 LEE Ontario-South 3
1995-12-31 LEE Quebec 1
1995-12-31 LEE Manitoba 2
1995-12-31 GOUNOT Quebec 1
1996-03-29 LUCCHESSI Ontario-South 3
1996-03-29 LUCCHESSI Quebec 1
1996-03-29 LEE Ontario-South 2
1996-03-29 LEE Ontario-North 2
1996-03-29 LEE Quebec 3
1996-03-29 LEE Manitoba 5
1996-03-29 GOUNOT Ontario-South 3
1996-03-29 GOUNOT Quebec 1
1996-03-29 GOUNOT Manitoba 7
1996-03-30 LUCCHESSI Ontario-South 1
1996-03-30 LUCCHESSI Quebec 2
1996-03-30 LUCCHESSI Manitoba 1
1996-03-30 LEE Ontario-South 7
1996-03-30 LEE Ontario-North 3
1996-03-30 LEE Quebec 7
1996-03-30 LEE Manitoba 4
1996-03-30 GOUNOT Ontario-South 2
1996-03-30 GOUNOT Quebec 18
1996-03-30 GOUNOT Manitoba 1
1996-03-31 LUCCHESSI Manitoba 1
1996-03-31 LEE Ontario-South 14
1996-03-31 LEE Ontario-North 3
1996-03-31 LEE Quebec 7
1996-03-31 LEE Manitoba 3
1996-03-31 GOUNOT Ontario-South 2
1996-03-31 GOUNOT Quebec 1
1996-04-01 LUCCHESSI Ontario-South 3
1996-04-01 LUCCHESSI Manitoba 1
1996-04-01 LEE Ontario-South 8
1996-04-01 LEE Ontario-North -
1996-04-01 LEE Quebec 8
1996-04-01 LEE Manitoba 9
1996-04-01 GOUNOT Ontario-South 3
1996-04-01 GOUNOT Ontario-North 1
1996-04-01 GOUNOT Quebec 3
1996-04-01 GOUNOT Manitoba 7
41 條記錄已選擇。