##數(shù)據(jù)庫和表空間恢復
#數(shù)據(jù)庫恢復
下面是 RESTORE 命令的語法:
RESTORE DATABASE source-database-alias { restore-options | CONTINUE | ABORT }
restore-options:
[USER username [USING password]] [{TABLESPACE [ONLINE] |
TABLESPACE (tblspace-name [ {,tblspace-name} ... ]) [ONLINE] |
HISTORY FILE [ONLINE]}] [INCREMENTAL [AUTOMATIC | ABORT]]
[{USE {TSM | XBSA} [OPEN num-sess SESSIONS] |
FROM dir/dev [ {,dir/dev} ... ] | LOAD shared-lib
[OPEN num-sess SESSIONS]}] [TAKEN AT date-time] [TO target-directory]
[INTO target-database-alias] [NEWLOGPATH directory]
[WITH num-buff BUFFERS] [BUFFER buffer-size]
[DLREPORT file-name] [REPLACE EXISTING] [REDIRECT] [PARALLELISM n]
[WITHOUT ROLLING FORWARD] [WITHOUT DATALINK] [WITHOUT PROMPTING]
讓我們研究一個示例。要執(zhí)行 sample 數(shù)據(jù)庫的恢復,請使用以下命令:
(1)RESTORE DATABASE sample
(2) FROM C:\DBBACKUP
(3) TAKEN AT 20030314131259
(4) WITHOUT ROLLING FORWARD
(5) WITHOUT PROMPTING
讓我們更仔細地研究該命令:
指明要恢復的數(shù)據(jù)庫映像的名稱。
指定要從什么位置讀取輸入備份文件。
如果目錄中有多個備份映像,那么該選項將根據(jù)時間戳記(它是備份名稱的一部分)確定特定的備份。
如果為數(shù)據(jù)庫啟用了歸檔日志記錄,那么當恢復該數(shù)據(jù)庫時,它將自動被置于前滾暫掛狀態(tài)。這行告訴 DB2 不要使數(shù)據(jù)庫處于前滾暫掛狀態(tài)。
在執(zhí)行 RESTORE 時,不會提示您。
請注意,語法中沒有關鍵字 OFFLINE,因為這是缺省方式。事實上,對于 RESTORE 實用程序,這是數(shù)據(jù)庫允許的唯一方式。
#表空間恢復
表空間恢復需要相當仔細的規(guī)劃,因為比較容易犯錯,這會使數(shù)據(jù)處于不一致狀態(tài)。
下面是表空間 RESTORE 命令的示例:
(1)RESTORE DATABASE sample
(2) TABLESPACE ( mytblspace1 )
(3) ONLINE
(4) FROM /db2tbsp/backup1, /db2tbsp/backup2
讓我們更仔細地研究該命令:
指明要恢復的數(shù)據(jù)庫映像的名稱。
指出這是表空間 RESTORE,并指定要恢復的一個或多個表空間的名稱。
指出這是聯(lián)機恢復。注:對于用戶表空間,既允許聯(lián)機恢復也允許脫機恢復。正如前面所提到的那樣,對于數(shù)據(jù)庫,只允許脫機恢復。
指定輸入備份文件所在的位置。
表空間恢復注意事項
恢復表空間之后,它將始終處于前滾暫掛狀態(tài)。要使表空間可訪問并復位該狀態(tài),必須至少將表空間前滾到最小的時間點
(point in time,PIT)。該最小的 PIT 確保表空間和日志與系統(tǒng)目錄中的內(nèi)容保持一致。
請考慮下面的示例:
假設在時間 t1 您執(zhí)行了完全數(shù)據(jù)庫備份,該備份包括了表空間 mytbls1
在時間 t2,您在表空間 mytbls1 中創(chuàng)建了表 myTable。這會將表空間 mytbs1 恢復的最小 PIT 設置為 t2。
在時間 t3,您決定僅從在 t1 進行的完全數(shù)據(jù)庫備份恢復表空間 mytbls1。
恢復完成之后,表空間 mytbls1 將處于前滾暫掛狀態(tài)。如果允許前滾到最小 PIT 之前的某一點,則表空間 mytbls1 將失去表 myTable;然而,系統(tǒng)目錄將顯示該表確實存在于 mytbls1 中。因此,為了避免類似的不一致,DB2 會在您恢復表空間時強制您至少前滾到最小 PIT。
當針對表空間或表空間中的表運行 DDL 語句時,會更新最小的 PIT。為了確定表空間恢復的最小 PIT,可以使用下列兩種方法之一:
使用 LIST TABLESPACES SHOW DETAIL 命令
通過 GET SNAPSHOT FOR TABLESPACE ON db_name 命令獲取表空間快照。
另外,系統(tǒng)目錄表空間(SYSCATSPACE)必須前滾到日志的末尾并處于脫機方式。
#重定向恢復
我們前面提到過備份文件包括有關表空間和容器的信息。如果過去存在的容器在進行備份時不再存在時,會發(fā)生什么情況?如果 RESTORE 實用程序找不到該容器,那么您將得到一個錯誤。
如果您不想在這個位置恢復該備份,而想在別的位置進行恢復,但在那個地方又使用了其它配置,該怎么辦?同樣,在該情況下恢復備份將會產(chǎn)生問題。
重定向恢復解決了這些問題。重定向恢復的恢復備份過程只有四個步驟:
獲取記錄在輸入備份中的、有關容器和表空間的信息。通過將 REDIRECT 關鍵字包含在 RESTORE 命令中就能完成這一任務。例如:
RESTORE DATABASE DB2CERT FROM C:\DBBACKUP
INTO NEWDB REDIRECT WITHOUT ROLLING FORWARD
不需要事先產(chǎn)生數(shù)據(jù)庫NEWDB
下面是該命令的輸出:
SQL1277N Restore has detected that one or more table space containers are
inaccessible, or has set their state to 'storage must be defined'.
DB20000I The RESTORE DATABASE command completed successfully.
注意:此時已經(jīng)創(chuàng)建了數(shù)據(jù)庫NEWDB。
復查來自(部分)恢復數(shù)據(jù)庫 newdb 的表空間信息:
LIST TABLESPACES SHOW DETAIL
表空間還沒有產(chǎn)生。
為每個表空間設置新容器。表空間有一個標識,可以從 LIST TABLESPACES 命令的輸出獲取這個標識。如下使用該標識:
SET TABLESPACE CONTAINERS FOR 0 USING (FILE "d:\newdb\cat0.dat" 5000)
SET TABLESPACE CONTAINERS FOR 1 USING (FILE "d:\newdb\cat1.dat" 5000)
...
SET TABLESPACE CONTAINERS FOR n USING (PATH "d:\newdb2")
上面命令將產(chǎn)生表空間。
在上面的示例中,n 表示備份中某一個表空間的標識。另外請注意,對于重定向恢復,不能更改表空間的類型;即,如果表空間是 SMS,那么就不能將它更改為 DMS。
通過將關鍵字 CONTINUE 包含在 RESTORE 命令中,開始將數(shù)據(jù)本身恢復到新容器中,如下所示:
RESTORE DATABASE DB2CERT CONTINUE
現(xiàn)在,您已經(jīng)了解了重定向恢復是如何工作的。也可以將它用于為 SMS 表空間添加容器。如果您閱讀過本系列的第二篇教程,那么您應該知道在大多數(shù)情況下不能對 SMS 表空間進行修改以添加容器。重定向恢復為這一限制提供了一種變通方法。
分區(qū)數(shù)據(jù)庫的恢復::
In the following example, the database WSDB is defined on all 4 partitions,
numbered 0 through 3. The path /dev3/backup is accessible from all
partitions. The following offline backup images are available from
/dev3/backup:
wsdb.0.db2inst1.NODE0000.CATN0000.20020331234149.001
wsdb.0.db2inst1.NODE0001.CATN0000.20020331234427.001
wsdb.0.db2inst1.NODE0002.CATN0000.20020331234828.001
wsdb.0.db2inst1.NODE0003.CATN0000.20020331235235.001
To restore the catalog partition first, then all other database partitions of the
WSDB database from the /dev3/backup directory, issue the following
commands from one of the database partitions:
db2_all ’<<+0< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234149
INTO wsdb REPLACE EXISTING’
db2_all ’<<+1< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234427
INTO wsdb REPLACE EXISTING’
db2_all ’<<+2< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234828
INTO wsdb REPLACE EXISTING’
db2_all ’<<+3< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331235235
INTO wsdb REPLACE EXISTING’
##數(shù)據(jù)庫和表空間前滾
#數(shù)據(jù)庫前滾
在上一章中,我們簡要地討論了 ROLLFORWARD 命令。在本章中,我們將更詳細地討論它。ROLLFORWARD 命令允許恢復到某一時間點;
這意味著該命令將讓您遍歷 DB2 日志,并重做或撤銷記錄在日志中的操作直到某個特定的時間點。雖然可以將數(shù)據(jù)庫或表空間前滾到最小
PIT 之后的任何時間點,但不能保證您選擇前滾到的結束時間將使所有數(shù)據(jù)保持一致。
我們將不在本教程中討論 QUIESCE 命令。然而,值得提一下的是:可以在常規(guī)數(shù)據(jù)庫操作期間使用該命令來設置一致性點。通過設置
這些一致性點,您可以始終執(zhí)行至其中任何一點的時間點恢復,并保證數(shù)據(jù)同步。
一致性點和許多其它信息一起被記錄在 DB2 歷史記錄文件中,可以使用 LIST HISTORY 命令來查看該文件。
在前滾處理期間,DB2 將:
在當前日志路徑中查找必需的日志文件。
如果找到該日志,重新從日志文件應用事務。
如果在當前路徑中找不到該日志文件,并且使用了 OVERFLOWLOGPATH 選項,那么 DB2 將在該選項指定的路徑中搜索并且將使用該位置中的
日志。
如果在當前路徑中找不到該日志文件并且沒有使用 OVERFLOWLOGPATH 選項,則調用用戶出口來檢索歸檔路徑中的日志文件。
僅當前滾完全數(shù)據(jù)庫恢復并且啟用了用戶出口時,才會調用用戶出口來檢索日志文件。
一旦日志在當前日志路徑或 OVERFLOWLOGPATH 中,就將重新應用事務。
執(zhí)行 ROLLFORWARD 命令需要 SYSADM、SYSCTRL 或 SYSMAINT 權限。
下面是 ROLLFORWARD 命令的語法:
ROLLFORWARD DATABASE database-alias [USER username [USING password]]
[TO {isotime [ON ALL DBPARTITIONNUMS] [USING LOCAL TIME] | END OF LOGS
[On-DbPartitionNum-Clause]}] [AND {COMPLETE | STOP}] |
{COMPLETE | STOP | CANCEL | QUERY STATUS [USING LOCAL TIME]}
[On-DbPartitionNum-Clause] [TABLESPACE ONLINE | TABLESPACE (tblspace-name
[ {,tblspace-name} ... ]) [ONLINE]] [OVERFLOW LOG PATH (log-directory
[{,log-directory ON DBPARTITIONNUM db-partition-number} ... ])] [NORETRIEVE]
[RECOVER DROPPED TABLE dropped-table-id TO export-directory]
On-DbPartitionNum-Clause:
ON {{DBPARTITIONNUM | DBPARTITIONNUMS} (db-partition-number
[TO db-partition-number] , ... ) | ALL DBPARTITIONNUMS [EXCEPT
{DBPARTITIONNUM | DBPARTITIONNUMS} (db-partition-number
[TO db-partition-number] , ...)]}
讓我們研究一個示例。要執(zhí)行樣本數(shù)據(jù)庫的前滾,可以使用下列任意一條語句:
(1)ROLLFORWARD DATABASE sample TO END OF LOGS AND COMPLETE
(2)ROLLFORWARD DATABASE sample TO timestamp AND COMPLETE
(3)ROLLFORWARD DATABASE sample TO timestamp USING LOCAL TIME AND COMPLETE
讓我們仔細地研究每一條語句:
在該示例中,我們將前滾到日志的結尾,這意味著將遍歷所有歸檔和活動日志。最終它將完成前滾并通過回滾任何未提交的事務來除去
前滾暫掛狀態(tài)。
對于該示例,DB2 將前滾到指定的時間點。使用的時間戳記形式必須是 CUT(全球標準時間,Coordinated Universal Time),這可以通
過從當前時區(qū)減去本地時間來計算。
該示例類似于上一個示例,但可以用本地時間表示時間戳記。
請注意,語法中沒有關鍵字 OFFLINE,因為這是缺省方式。事實上,對于 ROLLFORWARD 命令,這是數(shù)據(jù)庫允許的唯一方式。
#表空間前滾 第 2 頁(共4 頁)
表空間前滾通常可以聯(lián)機或脫機。但系統(tǒng)目錄表空間(SYSCATSPACE)是例外,它只能進行脫機前滾。
下面是一個表空間前滾示例:
ROLLFORWARD DATABASE sample
TO END OF LOGS AND COMPLETE
TABLESPACE ( userspace1 ) ONLINE
上面示例中的選項已經(jīng)在數(shù)據(jù)庫前滾一章中說明過了。這里唯一的新選項是 TABLESPACE,它指定要前滾的表空間。
表空間前滾考慮事項
如果啟用注冊表變量 DB2_COLLECT_TS_REC_INFO,則只處理恢復表空間所需的日志文件;ROLLFORWARD 命令將跳過不需要的日志文件,這可以加快恢復時間。
ROLLFORWARD 命令的 QUERY STATUS 選項可用于列出 DB2 已經(jīng)前滾的日志文件、下一個需要的歸檔日志文件以及自前滾處理開始以來最后一次提交的事務的時間戳記。例如:
ROLLFORWARD DATABASE sample QUERY STATUS USING LOCAL TIME
在表空間時間點前滾操作完成后,表空間處于備份暫掛狀態(tài)。必須對表空間或數(shù)據(jù)庫進行備份,因為在表空間恢復到的時間點和當前時間之間對它所做的所有更新都已經(jīng)丟失。
##索引的重新創(chuàng)建
#重建索引
如果由于一些硬件或操作系統(tǒng)原因而使數(shù)據(jù)庫崩潰,那么在數(shù)據(jù)庫重新啟動階段一些索引可能被標記為無效。配置參數(shù) INDEXREC 確定 DB2 何時將試圖重建無效索引。
INDEXREC 在數(shù)據(jù)庫管理器和數(shù)據(jù)庫配置文件中都進行了定義。該參數(shù)有三個可能的設置:
SYSTEM:只能在數(shù)據(jù)庫配置文件中指定該值。當將 INDEXREC 設置為該值時,DB2 將查找在數(shù)據(jù)庫管理器配置文件中指定的 INDEXREC 設置,并使用該值。
ACCESS:這意味著在第一次訪問索引時重建無效索引。
RESTART:這意味著在數(shù)據(jù)庫重新啟動期間重建無效索引。
###管理服務器
get admin cfg
update admin cfg using <p> <v>
備份表空間
BACKUP DATABASE SAMPLE TABLESPACE ( USERSPACE1 ) ONLINE TO "d:\db2\" WITH 1 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
生成表的DDL
db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -c ;
包括表的統(tǒng)計信息的DDL
db2look -d SAMPLE -t MY_EMPLOYEE -a -e -l -x -m -r -c ;
svmon
5.1 maintrcie 4
db2 fixpak 2
## 數(shù)據(jù)庫空間需求
# 系統(tǒng)目錄表的空間需求 3.5MB
# 用戶表數(shù)據(jù)的空間需求
每頁面255行
4KB頁面 68字節(jié)用于管理開銷,4028用于數(shù)據(jù),行長度不能超過4005字節(jié),最多500列。
8,16,32KB 頁面 8101,16293,32677 1012列
估計大小公式4KB:
(4028/(AVERAGE ROW SIZE + 10)) = RECORDS_PER_PAGE
(NUMBER_OF_RECORDS/RECORDS_PER_PAGE)*1.1 = NUMBER_OF_PAGES
長型字段數(shù)據(jù)的空間需求
存儲在單獨的表對象中。數(shù)據(jù)存儲在大小為32KB的區(qū)域中。
大對象數(shù)據(jù)的空間需求
#索引的空間的需求
(平均索引鍵大小+9)×行數(shù)×2
創(chuàng)建索引的臨時空間需求
(平均索引鍵大小+9)×行數(shù)×3.2
對每個葉子頁的平均鍵數(shù)的粗略估計是
#日志文件的空間需求
(logprimary + logsecond)*(logfilesiz+2)*4096
如果以對數(shù)據(jù)庫啟用了無限記錄(logsecond 設置為-1),則必須啟用userexit配置參數(shù)。
#臨時空間需求
##分區(qū)數(shù)據(jù)庫驗證
select distinct dbpartitionnum(empno) from employee;
#分區(qū)鍵
未指定則使用主鍵的第一列,無主鍵則使用第一個非長類型列。
選擇能否使數(shù)據(jù)分布均勻及經(jīng)常使用的列,可以用列的組合但不能超過16列,列越少,性能越好。
分區(qū)鍵不能更改,任何唯一鍵或主鍵必須包含分區(qū)鍵列
#表并置
需要經(jīng)常進行關聯(lián)的表在指定分區(qū)鍵時,每個分區(qū)鍵中對應列的數(shù)據(jù)類型必須是分區(qū)兼容的,并稱為表并置
具有相同值但有不同類型的兩個變量會安相同的分區(qū)算法映射至同一個分區(qū)號。
如:INTEGER,SMALLINT,BIGINT
REAL,FLOAT
CHAR,VARCHAR
#隔離級別
隔離級確定了在數(shù)據(jù)被訪問時,如何鎖定數(shù)據(jù)或將數(shù)據(jù)與其它進程隔離。您可以在應用程序預編譯或在
靜態(tài) SQL 程序中綁定到數(shù)據(jù)庫時指定隔離級,或者也可以將它指定為連接或語句選項。
選擇的隔離級可同時影響 DB2 選擇的鎖定策略和 S 行鎖定可以由應用程序持有的時間。
隔離級只應用于被讀取的行。對于更改的行,應用程序需要獲取一個 X 或 W 鎖。無論應用程序的隔離級是什么,
X 或 W 鎖在回滾或提交之前不被釋放。