DB2 LOAD命令中COPY NO/COPY說明(1)

來源:互聯網
上載者:User

當 DB2 的資料庫啟用了前滾復原模式,即將日誌由迴圈日誌方式改為歸檔日誌,以便使用者在進行恢複操作時,可在恢複了資料庫或資料表空間的備份後,再通過前滾歸檔日誌中的事務,恢複Database Backup時間點之後提交的事務,最大程度的保護資料庫的資料。

而 DB2 的 LOAD 公用程式為實現快速匯入資料的功能,除採用了通過直接向資料庫中寫入格式化的資料頁裝載資料,匯入處理程序中不啟用觸發器,不會檢查參考完整性和表檢查約束當等方式外,還最小化了記錄交易記錄的操作。在 LOAD 的 LOAD、BUILD、DELETE 和 INDEX COPY 四個處理階段中,僅在 DELETE 階段記錄對每個刪除事件記日誌,即只對每個違反唯一約束的行的刪除操作記日誌,因此整個 LOAD 操作僅記錄了極少的日誌。

由於 LOAD 最小化了日誌的記錄,有因啟用了前滾恢複的資料庫在恢複線上備份時需要歸檔日誌的特性,對於這種資料庫的 LOAD 操作,為避免執行 LOAD 操作後,表在使用 ROLLFORWARD 命令前滾歸檔日誌的過程中因缺少日誌而被置為非正常狀態,DB2 為 LOAD 命令提供了如下選項:

·COPY NO(預設)

·COPY YES

·NONREVERABLE

為更清楚地說明這些選項的作用,這裡將以舉例的方式進行說明。而在開始操作之前,首先瞭解一下 DB2 備份操作所產生的映象檔案的形式和命名特點:

在 UNIX 環境下是檔案的形式:

Databasealias.Type.Instancename.Nodename.Catnodename.Timestamp.number

在 Windows 環境下是子目錄及檔案的形式:

Databasealias.Type\Instancename\Node0000\Catn0000\yyyymmdd\hhmmss.number

而其中的 Type 則因備份類型的不同而不同:

0 -- 資料庫全備份

3 -- 資料表空間備份

4 -- 由 LOAD 操作產生的備份

1. 進行一次資料庫的全備份:

首先對已啟用前滾復原模式的 SAMPLE 資料庫進行一次全備份:

E:\TEST>db2 backup db sample

備份成功。此備份映像的時間戳記是:20051230174105

這時看到在目前的目錄下產生了一個 SAMPLE.0 的子目錄,表明產生的是一個資料庫全備份。下面將對這些現象逐個予以舉例說明:

2. 關於 COPY NO:

在 LOAD 操作結束時,將表所在的資料表空間置於“備份暫掛”狀態,此時雖然其中的表可以進行 SELECT 操作,但不能進行 UPDATE 和 DELETE 操作。為使該表狀態恢複正常,除去備份暫掛狀態,必須手動對其資料表空間執行一個 BACKUP 命令。由於該選項為預設選項,如果 LOAD 命令中未指明,則預設為使用該選項,如:

E:\TEST>db2 connect to sample

E:\TEST>db2 load from staff.del of del insert into staff

E:\TEST>db2 list tablespaces


資料表空間標識 = 2
名稱 = USERSPACE1
類型 = 系統管理空間
內容 = 任何資料
狀態 = 0x0020
詳細解釋:
備份暫掛

E:\TEST>db2 select count(*) from staff
1
-----------
70
1 條記錄已選擇。

E:\TEST>db2 update staff set id=335 where id=340

DB21034E 該命令被當作 SQL 陳述式來處理,因為它不是有效“命令列處理器”命令。在 SQL 處理期間,它返回:

SQL0290N 不允許存取資料表空間。 SQLSTATE=55039

在手動對 USERSPACE1 資料表空間進行一次備份操作後,資料表空間狀態將正常,再次嘗試更新操作就會成功:

E:\TEST>db2 backup db sample tablespace (userspace1)

備份成功。此備份映像的時間戳記是:20051230184841

命令完成後可以在目前的目錄下看到產生了一個 SAMPLE.3 的子目錄,表明產生的是一個資料表空間級的備份。

E:\TEST>db2 connect to sample

E:\TEST>db2 list tablespaces

資料表空間標識 = 2
名稱 = USERSPACE1
類型 = 系統管理空間
內容 = 任何資料
狀態 = 0x0000
詳細解釋:
正常

而所產生這份關於資料表空間的備份可在資料庫因前滾操作將資料表空間置為“複原暫掛”狀態時用於將資料表空間狀態恢複為正常,並恢複 LOAD 操作對該表的修改。如當前滾資料庫超過 LOAD 時間點後,資料表空間將被置為複原暫掛狀態:

E:\TEST>db2 restore db sample taken at 20051230174105
DB20000I RESTORE DATABASE 命令成功完成。

E:\TEST>db2 rollforward db sample to end of logs and stop
SQL1271W 已恢複資料庫 "SAMPLE",但在節點 "0"上有一個或多個資料表空間離線

E:\TEST>db2 connect to sample

E:\TEST>db2 list tablespaces
資料表空間標識 = 2
名稱 = USERSPACE1
類型 = 系統管理空間
內容 = 任何資料
狀態 = 0x0100
詳細解釋:
複原暫掛

此時可利用這一資料表空間級的備份進行恢複操作:

E:\TEST>db2 restore db sample tablespace (userspace1) taken at 20051230184841
DB20000I RESTORE DATABASE 命令成功完成。

E:\TEST>db2 connect to sample

E:\TEST>db2 list tablespaces

資料表空間標識 = 2
名稱 = USERSPACE1
類型 = 系統管理空間
內容 = 任何資料
狀態 = 0x0080
詳細解釋:
前滾暫掛

E:\TEST>db2 rollforward db sample to end of logs and stop tablespace (userspace1)

前滾狀態

輸入資料庫別名 = sample
節點數已返回狀態 = 1

節點號 = 0
前滾狀態 = 未暫掛
下一個要讀取的記錄檔 =
已處理的記錄檔 = -
上次落實的事務 = 2005-12-30-10.47.10.000000

DB20000I ROLLFORWARD 命令成功完成。

E:\TEST>db2 connect to sample

E:\TEST>db2 list tablespaces
:
資料表空間標識 = 2
名稱 = USERSPACE1
類型 = 系統管理空間
內容 = 任何資料
狀態 = 0x0000
詳細解釋:
正常
:

E:\TEST>db2 update staff set id=335 where id=340
DB20000I SQL 命令成功完成。

可見資料表空間狀態已正常,表也可執行更新操作了。


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.