DB2維護手冊

flywiththewind發表於2016-07-26

 

 

 

 

 

 

 

 

DB2維護手冊

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


目錄

 TOC \o "1-2" \h \z \u


一、  DB2日常維護日操作

1、 檢查管理伺服器是否啟動

ps命令檢視是否有dasusr1後臺程式

 ps -ef | dasusr1

 

請確保管理伺服器已經啟動,如果沒有啟動,則按以下步驟啟動管理伺服器:

 

?  以管理伺服器使用者(UNIX預設是DASUSR1)登入

?  發出db2admin start命令

?  如果是HA環境,則要保證在指令碼中正確配置了啟動命令

2、 檢查DB2例項是否已經啟動

ps命令檢視是否有db2sysc後臺程式

ps -ef | db2sysc

 

也可以以DB2例項所有者登入,透過發出db2start命令來確保啟動了例項(如果例項已經啟動,則會告知SQL1026N  資料庫管理器已啟用;否則,將把例項啟動起來)

 

3、 檢視錶空間狀態是否正常

db2例項所有者登入

#db2 list tablespaces show detail        //在單分割槽上檢視錶空間的狀態,正常返回0x0000

# db2_all list tablespaces show detail    //在所有分割槽上檢視錶空間的狀態

 

可以使用LIST TABLESPACES 命令確定連線資料庫中表空間的當前狀態,可以使用SHOW DETAIL選項檢視錶空間的詳細資訊。比如,我們連上SAMPLE資料庫,執行list tablespaces show detail ,可以看到狀態返回值是0x0000,此時,使用db2tbst可以檢視狀態編號對於的狀態含義,具體語法如下:

 

db2tbst <tablespace state>  可以檢視編號所代表的狀態

 

db2tbst 命令接收十六進位制的狀態值,並返回相應的表空間狀態。例如,命令 db2tbst 0x0008 返回 State = Load Pending 。而該十六進位制的狀態值反過來又是 LIST TABLESPACES 命令輸出的組成部分。表空間的外部可見狀態是由單個狀態值的十六進位制總和構成的。例如,如果表空間的狀態是 Backup PendingLoad in Progress,那麼所返回的十六進位制值就是 0x200200x00020 + 0x20000

4、 檢視錶的狀態

查詢系統目錄檢視以獲得關於資料庫的有用資訊。例如,下面的語句使用 NOT LIKE 斷言,返回在 SYSCAT.TABLES 中有項的所有使用者定義的表的名稱,以及每個表的列數和表的狀態(N = 正常;C = 待稽核(check pending))

 

#db2 select tabname, colcount, status  FROM syscat.tables   WHERE tabschema NOT LIKE 'SYS%'  ORDER BY tabname

 

也可以使用load query命令檢視單個表的狀態,比如對錶TEST1,我們可以發出如下命令:

 

#db2 load query table test1

 

5、 檢視磁碟空間

檢視資料庫活動日誌目錄是否已滿,活動日誌目錄可以使用get db cfg檢視,注意一定不要手工刪除活動日誌

#df -k

 

檢視SMS表空間對應的容器目錄空間是否滿了

#df -k

 

檢視DMS表空間中是否還有可用頁

#db2 list tablespaces show detail        //在單分割槽上檢視錶空間的是否還有可用頁

# db2_all list tablespaces show detail    //在所有分割槽上檢視錶空間是否還有可用頁

 

6、 檢查儲存管理軟體是否正常

請檢查TSM或其他儲存管理軟體是否正常,以及磁帶機是否執行正常。

7、 檢查資料庫備份是否正常

請檢視TSM或第三方儲存管理軟體,看備份映像檔案是否完整的儲存到了磁帶機上了,想在DB2上檢視備份情況,可以使用LIST命令

 

# db2 list history backup all for 資料庫名

 

8、 檢查歸檔日誌是否正確歸檔了

請確保活動日誌目錄下沒有的日誌檔案都已經正確歸檔到了帶機上(檢視TSM或第三方儲存管理軟體)

 

檢視活動目錄裡的日誌檔案:

#ls -l

9、 檢視緩衝池的命中率

# db2 get snapshot for bufferpools on 資料庫名

檢視緩衝池的命中率,看其是否低於95%(命中率越高越好)

10、  檢視當前執行最頻繁的SQL,其命中率是否正常

# db2 get snapshot for bufferpools on 資料庫名  > log.txt

grep命令檢視" Number of executions"執行次數最頻繁的語句,看其命中率是否正常。

 

比如:

grep -n " Number of executions" snap.out | grep -v "= 0" | sort -k 5,5rn | more

 

11、  檢視當前連線的應用程式,有沒有非法連線

#db2 list applications show detail

看這些連線的情況,看有沒有不合適的IP連上來,或者不被允許的第三方工具連上來,比如一些第三方工具連上來會對錶進行鎖定,影響業務系統正常執行,這個時候可以用FORCE APPLICATIONS (應用程式控制程式碼)停下來。

12、  檢查有沒有死鎖

# db2 get snapshot for all on 資料庫名 > log.txt

grep命令檢視輸出的檔案中是否有死鎖的記錄,比如

grep -n "Deadlocks detected" log.txt | grep -v "= 0" | more

 

13、  對錶和索引進行runstats

#db2 runstats on table 表名 and index all

對系統表以及變化比較頻繁的表執行統計資訊,建議寫成shell指令碼自動執行。

14、  檢查表是否需要重組

使用REORGCHK命令,透過統計資料檢查表是否需要重組,語法如下:

REORGCHK  [UPDATE | CURRENT ]STATISTICS ON  [TABLE SYSTEM| TABLE USER | TABLE ALL | TABLE table_name | SCHEMA schema_name]

 

UPDATE STATISTICS  更新表的統計資料,根據該統計資料判斷是否需要重組表

CURRENT STATISTICS:根據當前表統計資料判斷是否需要重組表

TABLE table_name     對單個表進行分析

TABLE ALL             對資料庫所有的表進行分析

TABLE SYSTEM       對系統表進行分析

TABLE USER               對當前使用者模式下的所有表進行分析          

 

#db2 reorgchk update statistics on table all

15、  對需要重組的表進行重組

#db2 reorg table 表名          //透過重構行來消除“碎片”資料

#db2 reorg indexes all for table 表名    //只重組索引

 

比如:

                 reorg  table  db2inst1.org  index by_id

           將根據索引by_id,如果不加INDEX選項將重組表和所有的索引

reorg  table  db2inst1.org  index by_id use tempspace1

 

           使用指定的臨時表空間重組表

          

           表重組完成後需要進行RUNSTATS。另外,記住在分割槽資料庫環境中,如果想在所有節點執行命令,需要使用db2_all命令。

 

二、  DB2日常維護月操作

1、       檢視DB2日誌

請至少每月檢視一次db2diag.log檔案,看其中是否有異常。

2、       檢查備份和日誌是否都儲存好了

透過TSM或第三方儲存管理軟體,檢視備份和歸檔日誌是否都儲存好了,在資料庫級別檢視備份,可以使用:

 

# db2 list history backup all for 資料庫名

 

三、  DB2日常維護季度操作

1、       透過快照監控器,檢視系統效能如何

透過快照監控器,抓取資料庫的資訊,分析資料庫效能是否合理:

# db2 get snapshot for all on 資料庫名 > log.txt

2、       資料庫補丁級別

# db2level

四、  注意事項

1、       不要刪除活動日誌檔案

DB2 的活動日誌檔案不能被刪除。一旦 DB2 的活動日誌檔案被刪除,或者所在的儲存裝置出現問題,則不可避免地造成 DB2 資料庫系統當機。

2、       注意交易日誌儲存空間

在歸檔日誌模式下,如果沒有使用自動歸檔方式,則儲存的日誌檔案會不斷增多,有可能造成日誌所在的檔案系統空間滿。 當這種情況發生時,會根據引數 BLK_LOG_DSK_FUL 的配置而有不同的現象:

1)如果該引數啟用,則 DB2 資料庫可繼續讀操作,但是寫操作會掛起

2)如果該引數沒有啟用,則 DB2 資料庫會停止工作

 

兩種情況下,都需要到日誌所在的檔案系統新增了空間才恢復正常。

 

3、       按照系統的實際工作量配置日誌空間

DB2資料庫透過日誌檔案維護資料的完整性和一致性。DB2 資料庫的日誌空間可透過如下公式計算:

日誌空間 = (主日誌檔案 + 二級日誌檔案) * 日誌檔案尺寸

 

其中:

1)主日誌檔案由引數 LOGPRIMARY 控制,

2)二級日誌檔案由引數 LOGSECOND 控制

3)日誌檔案尺寸由引數 LOGFILSIZ 控制

4)LOGPRIMARY + LOGSECOND < 256 (不同的 DB2 版本略有不同,請參看相同版本的 DB2 手冊確認)

 

4、       設定正確資料庫內碼表

由於資料庫的內碼表在資料庫建立之後是無法修改的,所以在建立資料庫時一定要選擇正確的內碼表。

錯誤的資料庫內碼表會造成 JDBC/ODBC 訪問時中文欄位被截斷(包括控制中心),這種情況需要重建資料庫以修改資料庫內碼表。

 

從全域性規劃來說,如果應用需要訪問多個資料庫,那麼這多個資料庫的內碼表應該是一致的。

 

5、       檢查許可證(License)安裝情況

許可證過期會造成不必要的服務中斷,所以在 DB2 安裝完畢後,建議檢察許可的安裝情況

 

6、       建立資料庫前調整好系統時間

在資料庫建立好之後,調整系統時間會造成資料庫內部時間戳的異常。資料庫中一些物件和時間相關,一旦時間不準確要調整需要很小心。錯誤的時間調整可能會造成很多問題,如:

1)某些物件失效,例如 :

SQL0440N,找不到具有相容自變數的型別為 “<例程型別>” 的名為  <例程名>” 的已授權例程

2)資料庫日誌邏輯錯誤 -> 當機

3)常見錯誤 – 只調整時間,未調整時區

7、        不要隨便執行 chown (chmod) –R (UNIX/Linux)

在例項目錄下chown (chmod) -R 會造成

1) 在資料庫伺服器上 db2 connect to <dbname> 能連線上資料庫

2) db2 connect to <dbname> user ... using ...連線不上

8、 在歸檔日誌模式下使用LOAD記得加NONRECOVERABLE引數

 

五、  附:以離線方式重組表

以離線方式重組表是整理表碎片的最快方法。重組可減少表所需的空間量並提高資料訪問和查詢效能。

必須具有 SYSADM、SYSCTRL、SYSMAINT 或 DBADM 許可權,或者必須具有對錶的 CONTROL 許可權才能重組表。必須具有資料庫連線才能重組表。

標識需要重組的表之後,可以對這些表執行 REORG 實用程式,並且可以選擇對在這些表上定義的任何索引執行該實用程式。

  1. 要使用 CLP 重組表,請發出 REORG TABLE 命令:

db2 reorg table test.employee

要使用臨時表空間 mytemp 重組表,請輸入:

db2 reorg table test.employee use mytemp

要重組表並根據索引 myindex 對行進行重新排序,請輸入:

db2 reorg table test.employee index myindex

  1. 要使用 SQL 呼叫語句重組表,請使用 ADMIN_CMD 過程發出 REORG TABLE 命令:

call sysproc.admin_cmd ('reorg table employee index myindex')

  1. 要使用 DB2 管理 API 重組表,請使用 db2REORG API。

在重組表之後,應收集有關表的統計資訊,以便最佳化器具有最準確的資料來評估查詢訪問方案。

六、  附:索引重組

透過刪除和插入操作對錶進行更新後,索引的效能會降低,其表現方式如下:

  • 葉子頁分段

葉子頁被分段之後,由於必須讀取更多的葉子頁才能訪存表頁,因此 I/O 操作成本會增加。

  • 物理索引頁的順序不再與這些頁上的鍵順序相匹配(此稱為不良叢集索引)。

葉子頁出現不良叢集情況後,順序預取操作的效率將降低,因此會導致更多的 I/O 等待。

  • 形成的索引大於其最有效的級別數。

在此情況下應重組索引。

如果在建立索引時設定了 MINPCTUSED 引數,則在刪除某個鍵且可用空間小於指定的百分比時,資料庫伺服器會自動合併索引葉子頁。此過程稱為聯機索引整理碎片。但是,要復原索引叢集和可用空間以及降低葉級別,請使用下列其中一種方法:

  • 刪除並重新建立索引。
  • 使用 REORG INDEXES 命令聯機重組索引。

因為此方法允許使用者在重建表索引期間對錶進行讀寫操作,所以在生產環境中可能需要選擇此方法。

  • 使用允許離線重組表及其索引的選項執行 REORG TABLE 命令。

聯機索引重組

在使用 ALLOW WRITE ACCESS 選項執行 REORG INDEXES 命令時,如果同時允許對指定的表進行讀寫訪問,則會重建該表的所有索引。進行重組時,對基礎表所作的任何將會影響到索引的更改都將記錄在 DB2? 日誌中。另外,如果有任何內部記憶體緩衝區空間可供使用,則還將這些更改放在這樣的記憶體空間中。重組將處理所記錄的更改以便在重建索引時與當前寫活動保持同步更新。內部記憶體緩衝區空間是根據需要從實用程式堆中分配的指定記憶體區域,它用來儲存對正在建立或重組的索引所作的更改。使用記憶體緩衝區空間使索引重組操作能夠透過這樣的方式來處理更改,即先直接從記憶體讀取,然後讀取日誌(如有必要),但讀取日誌的時間要晚得多。在重組操作完成後,將釋放所分配的記憶體。重組完成後,重建的索引可能不是最佳叢集的索引。如果為索引指定 PCTFREE,則在重組期間,每頁上均會保留相應百分比的空間。

對於分割槽表,支援對各個索引進行聯機索引重組和清除。要對各個索引進行重組,指定索引名:REORG INDEX index_name for TABLE table_name

對於空間索引或多維叢集(MDC)表,不支援採用 ALLOW WRITE 方式的聯機索引重組。

注: REORG INDEXES 命令的 CLEANUP ONLY 選項不能完全重組索引。CLEANUP ONLY ALL 選項將除去那些標記為“刪除”且被認為要落實的鍵。此外,它還將釋放所有標記為“刪除”且被認為要落實的鍵所在的頁。在釋放頁後,相鄰的葉子頁將會合並,前提是這樣做可以在合併頁上至少留出 PCTFREE 可用空間。PCTFREE 是指在建立索引時為其定義的可用空間百分比。CLEANUP ONLY PAGES 選項僅刪除那些標記為“刪除”且被認為要落實的所有鍵所在的頁。

使用 CLEANUP ONLY 選項對分割槽表的索引進行重組時,支援任何訪問級別。如果未指定 CLEANUP ONLY 選項,則預設訪問級別 ALLOW NO ACCESS 是唯一支援的訪問級別。

REORG INDEXES 具有下列要求:

  • 對索引和表具有 SYSADM、SYSMAINT、SYSCTRL 或 DBADM 許可權,或者具有 CONTROL 特權。
  • 用於儲存索引的表空間的可用空間數量等於索引的當前大小

在發出 CREATE TABLE 語句時,考慮在大型表空間中重組索引。

  • 其他日誌空間

REORG INDEXES 需要記錄其活動。因此,重組可能會失敗,尤其是在系統繁忙和記錄其他併發活動時。

注: 如果具有 ALLOW NO ACCESS 選項的 REORG INDEXES ALL 命令執行失敗,則會標記索引無效並且此項操作不可撤銷。但是,如果具有 ALLOW READ ACCESS 選項的 REORG 命令或具有 ALLOW WRITE ACCESS 選項的 REORG 命令執行失敗,則可以復原原來的索引物件。

 

七、  附:收集和更新統計資訊的準則

 

RUNSTATS 命令收集表、索引和統計資訊檢視的統計資訊,以為最佳化器提供準確資訊進行訪問方案選擇。

在下列情況下,使用 RUNSTATS 實用程式來收集統計資訊:

  • 當資料已裝入表中且已建立適當的索引時。
  • 當在表中建立新的索引時。如果自從上次在表中執行 RUNSTATS 以來尚未修改表,則只需要對新的索引執行 RUNSTATS。
  • 當一個表已用 REORG 實用程式重組時。
  • 當透過資料修改、刪除和插入已大量更新表及其索引時。(此處所指的“大量”可能表示有 10% 到 20% 的表和索引資料受影響。)
  • 在繫結效能非常重要的應用程式之前
  • 當您想要比較當前和先前統計資訊時。如果定期更新統計資訊,則可以及早發現效能問題。
  • 當預取量更改時。
  • 當使用了 REDISTRIBUTE DATABASE PARTITION GROUP 實用程式時。

:

在先前版本的 DB2? 中,此命令使用了 NODEGROUP 關鍵字,而不是 DATABASE PARTITION GROUP 關鍵字。

  • 使用 RUNSTATS 實用程式來收集關於 XML 列的統計資訊。 使用 RUNSTATS 僅收集 XML 列的統計資訊時,將保留 LOAD 或上一次執行 RUNSTATS 實用程式已收集的非 XML 列的現有統計資訊。如果先前已收集關於一些 XML 列的統計資訊,則在當前命令未收集關於該 XML 列的統計資訊時,將刪除先前收集的 XML 列的統計資訊;在當前命令收集了關於該 XML 列的統計資訊時,將替換先前收集的 XML 列的統計資訊。

要提高 RUNSTATS 效能並儲存用來儲存統計資訊的磁碟空間,考慮僅指定應該收集其資料分佈統計資訊的列。

理論上,您應在執行統計資訊之後重新繫結應用程式。如果查詢最佳化器具有新的統計資訊,則它可以選擇不同的訪問方案。

如果您沒有足夠的時間一次收集全部的統計資訊,則可以執行 RUNSTATS 來每次僅更新幾個表、索引或統計資訊檢視的統計資訊,並輪流完成該組物件。如果對選擇性部分更新執行 RUNSTATS 期間由於表上的活動而產生了不一致性,則在查詢最佳化期間將發出警告訊息(SQL0437W,原因碼 6)。例如,如果執行 RUNSTATS 來收集表分佈統計資訊,以及在某個表活動後,再次執行 RUNSTATS 來收集該表的索引統計資訊,則可能發生這種情況。如果由於表上的活動產生了不一致並且在查詢最佳化期間檢測到這些不一致,則發出該警告訊息。當發生這種情況時,應再次執行 RUNSTATS 來更新分佈統計資訊。

要確保索引統計資訊和表同步,執行 RUNSTATS 來同時收集表和索引統計資訊。索引統計資訊保留自上次執行 RUNSTATS 以來收集的大部分表和列的統計資訊。如果自上次收集該表的統計資訊以來已對該表做了大量修改,則只收集該表的索引統計資訊將使兩組統計資訊不能在所有節點上都同步。

對生產系統呼叫 RUNSTATS 可能會對生產工作負載的效能產生負面影響。RUNSTATS 實用程式現在支援調速選項,在執行較高階別的資料庫活動期間,可以使用調速選項來限制執行 RUNSTATS 的效能影響。

在分割槽資料庫環境中收集表的統計資訊時,RUNSTATS 僅收集執行該命令的資料庫分割槽上的表的統計資訊。將此資料庫分割槽的 RUNSTATS 結果推廣到其他資料庫分割槽。如果執行 RUNSTATS 的資料庫分割槽不包含特定表的一部分,則將請求傳送到資料庫分割槽組中包含該表一部分的第一個資料庫分割槽。

收集統計資訊檢視的統計資訊時,將收集所有包含該檢視引用的基本表的資料庫分割槽的統計資訊。

考慮以下技巧來提高 RUNSTATS 的效率和已收集的統計資訊的有效性:

  • 僅對用來連線表的列或 WHERE、GROUP BY 以及查詢的類似子句中的列收集統計資訊。如果對這些列建立了索引,則可以用 RUNSTATS 命令的 ONLY ON KEY COLUMNS 子句指定列。
  • 為特定表和表中特定列定製 num_freqvalues num_quantiles 的值。
  • 使用 SAMPLE DETAILED 子句收集 DETAILED 索引統計資訊,以減少對詳細的索引統計資訊執行的後臺計算量。SAMPLE DETAILED 子句減少收集統計資訊所需要的時間,並在大多數情況下產生足夠的精度。
  • 當建立已填寫的表的索引時,新增 COLLECT STATISTICS 子句來在建立索引時建立統計資訊。
  • 當新增或除去了大量表行時,或如果更新了收集其統計資訊的列中的資料,則再次執行 RUNSTATS 來更新統計資訊。
  • 因為 RUNSTATS 僅收集單個資料庫分割槽的統計資訊,所以,如果資料不是在所有資料庫分割槽中一致分發的,則統計資訊將不太準確。如果您懷疑存在變形資料分發,則您可能想要在執行 RUNSTATS 之前使用 REDISTRIBUTE DATABASE PARTITION GROUP 命令來在各資料庫分割槽之間再分發資料。

八、  附:使用 CLP 捕獲資料庫執行狀況快照

 

可從 CLP 使用GET HEALTH SNAPSHOT命令來捕獲執行狀況快照。該命令語法支援檢索執行狀況監視器監視的不同物件型別的執行狀況快照資訊。

先決條件

必須具有例項連線才能捕獲執行狀況快照。如果沒有例項連線,則建立預設例項連線。要獲取遠端例項的快照,必須先連線至該例項。

過程

要使用 CLP 捕獲資料庫執行狀況快照

  1. 從 CLP 發出帶有期望引數的 GET HEALTH SNAPSHOT 命令。

在以下示例中,將在啟動資料庫管理器之後立即捕獲資料庫管理器級別執行狀況快照。

db2 get health snapshot for dbm
 
  1. 對於分割槽資料庫系統,可為特定分割槽捕獲專門的資料庫快照,或者為所有分割槽捕獲全域性的資料庫快照。要對特定分割槽(如分割槽號 2)上的資料庫捕獲執行狀況快照,請發出以下命令:
db2 get health snapshot for db on sample at dbpartitionnum 2

要對所有分割槽上的所有應用程式捕獲資料庫快照,請發出以下命令:

db2 get health snapshot for db on sample global

以下命令捕獲的執行狀況快照帶有附加詳細資訊,包括公式、附加資訊和執行狀況指示器歷史記錄:

db2 get health snapshot for db on sample show detail
 
  1. 對於基於集合狀態的執行狀況指示器,可對所有集合物件捕獲資料庫快照,而不考慮這些物件的狀態。常規 GET HEALTH SNAPSHOT FOR DB 命令返回所有集合物件,這些物件需要針對所有基於集合狀態的執行狀況指示器的警報。

要對列示了所有集合物件的資料庫捕獲執行狀況快照,請發出以下命令:

db2 get health snapshot for db on sample with full collection

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26224914/viewspace-2122561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章