1. 程式人生 > >如何恢復DB2中誤刪除表的資料

如何恢復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命令刪除的表 中的資料可以在前滾恢復時匯出。

db2 list history dropped table all for dbname

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 物件 時間戳記+序列 型別 裝置 最早日誌 當前日誌 備份標識 - — ----------------- -

- — ---------- ---------- ------------- D T 20061204003949 000000000000b70000 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(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 條記錄已選擇。