DB2故障診斷工具
一、db2cklog
使用db2cklog工具來檢查歸檔日誌檔案。
檢查歸檔日誌檔案可確保需要前滾恢復時已知正常的日誌檔案可用,並且恢復操作不會因為日誌檔案存在問題而失敗。
db2cklog工具讀取單個日誌檔案或一定範圍的編號的日誌檔案並檢查檔案的內部有效性。如果歸檔日誌檔案未通過驗證並帶有錯誤訊息或返回了警報,那麼不能在前滾恢復期間使用該日誌檔案。未通過驗證的歸檔日誌檔案無法修復。
需要對歸檔日誌檔案具有讀許可權,以便db2cklog工具可讀取日誌檔案並執行檢查。只有已關閉的日誌檔案(如歸檔日誌檔案)才能通過驗證。對於仍處於活動狀態的日誌檔案執行此工具,此工具無法準確檢查該檔案,並且將受到一條警報,以便知道此檔案仍處於活動狀態。
使用db2cklog命令時不應指定完整日誌檔名,而應僅指定包含在日誌檔名中的數字標識。如,S0000001.LOG日誌檔案的數字標識為1,檢查該日誌檔案,應指定db2cklog 1。如果這些歸檔日誌檔案不在當前目錄中,要使用ARCHLOGPATH引數新增這些日誌檔案的相對或絕對路徑。
要檢查單個歸檔日誌檔案:如:
db2cklog 1 ARCHLOGPATH /home/amytang/tests.
要檢查一定範圍的歸檔日誌檔案:如:
db2cklog 0 to 5 ARCHILOGPATH /home/nrichers/tests。
db2cklog對通過驗證的任何檔案的返回碼為0,如果指定了一定範圍的編號歸檔日誌檔案,那麼db2cklog將按順序讀取每個檔案,對每個檔案執行檢查併發出返回碼。當遇到第一個錯誤時停止,即使指定了一定範圍的日誌檔案並且還有其他檔案未檢查也會停止。發現錯誤時返回的DBT訊息可提供有關歸檔日誌檔案未通過驗證的原因的更多訊息,但無法修正無效日誌檔案。
二、db2dart
db2dart命令驗證資料庫及其物件的體系結構是否正確。還可以使用它來顯示資料庫控制檔案的內容,以便從其他情況下可能無法訪問的表中抽取資料。
使用不帶任何引數的db2dart命令檢視所有可能的選項。
預設情況下,db2dart實用程式將建立名為databaseName.RPT的報告檔案。對於單一分割槽資料庫分割槽環境,將在當前目錄中建立該檔案。對於多分割槽資料庫分割槽環境,將在診斷目錄的子目錄中建立該檔案。該子目錄稱為DART####,其中####是資料庫分割槽號。
使用db2dart必須確保沒有使用者連線資料庫。db2dart實用程式通過直接從磁碟中讀取資料庫中的資料和後設資料來對其進行訪問。因此,決不能對仍具有活動連線的資料庫執行該工具。如果存在活動連線,那麼該工具將不知道緩衝池中的頁面或記憶體中的控制結構,可能會報告假的錯誤結果。同樣,如果對需要進行崩潰恢復或尚未完成前滾恢復的資料庫執行db2dart,由於磁碟上的資料性質不一致,可能會導致類似的不一致情況。
>>-db2dart--database-name--+---------------------+-------------><
'-action--+---------+-'
'-options-'
1、ACTIONS:
(1)、Inspection actions:
/DB:預設選項,檢查整個資料庫。
/T:檢查一個或多個表。需要兩個輸入引數:table space ID(/TSI)和table object ID(/OI)或a list of table object IDs或table name(/TN)。
/TSF:檢查table space files和containers。
/TSC:檢查一個或多個表空間的table space constructs,但是不檢查表。需要一個輸入引數:table space ID(/TSI)或a list of table space IDs。
/TS:檢查一個或多個表空間和其中的表。需要一個輸入引數:table space ID(/TSI)或a list of table space IDs。
/ATSC:檢查所有表空間的constructs,但是不檢查表。
(2)、Date formatting actions:
/DD: Dumps formatted table date。需要五個輸入引數:table object ID(/OI)或table name(/TN)、table space ID(/TSI)、page number to start with(/PS)、number of pages(/NP)、verbose choice(/V Y/N 其中:Y:Verbose,N:No verbose)。
/DI: Dumps formatted index date。需要五個輸入引數:table object ID(/OI)或table name(/TN)、table space ID(/TSI)、page number to start with(/PS) 、number of pages(/NP)、verbose choice(/V Y/N)。
對於分割槽表上的非分割槽索引,/DI使用SYSCAT.INDEXES的INDEX_OBJECTID和TBSPACEID作為前兩個輸入引數(/OI和/TSI)。這種情況下不支援table name(/TN)選項。
對於分割槽表上的分割槽索引,/DI使用SYSCAT.DATAPTITIONS的PARTITIONOBJECTID和TBSPACEID。這種情況同樣不支援table name(/TN)選項。
/DM:Dumps formatted block map data。需要五個輸入引數:table object ID(/OI)或table name(/TN)、table space ID(/TSI)、page number to start with(/PS)、number of pages(/NP)、verbose choice(/V Y/N)。The data shows whether a block has been reclaimed for use by the table space after a reorganization to reclaim multidimensional clustering(MDC)table blocks that were empty.
/DP:以十六進位制形式Dumps pages。
對於DMS表空間,需要三個輸入引數:table space ID(/TSI)、page number to start with(/PS)、number of pages(/NP)。
對於SMS表空間,需要五個輸入引數:table space ID、object ID、page number to start with、number of pages、object type。
/DTSF:Dumps formatted table space file information。
/DDEL:Dumps formatted table data in delimited ASCII format。需要四個輸入引數:table object ID(/OI)或table name(/TN)、table space ID(/TSI)、page number to start with(/PS)、number of pages(/NP)。
Dump的delimited ASCII檔案使用資料庫內碼表進行編碼,db2dart命令不執行內碼表轉換。
/DDEL引數只支援下面幾種列型別,如果表中包含其他型別的列,這些列將會跳過,不被包含在delimited ASCII檔案中:
SMALLINT、FLOAT、REAL、INTEGER、TIME、DECIMAL、CHAR()、VARCHAR()、DATE、TIMESTAMP、BIGINT。
如果CHAR和VARCHAR型別的列包含二進位制資料,或者使用FOR BIT DATA定義,/DDEL引數生成的DEL檔案中將包含二進位制資料。當使用LOAD將DEL檔案進行裝入時,要確保使用delprioritychar選項進行修改。當使用IMPORT將DEL檔案進行匯入表時,確保指定delprioritychar codepage=x(x是輸入資料集的內碼表)選項進行修改。
/DHWM:Dumps high water mark information。需要一個輸入引數:table space ID(/TSI).
/DXA:以十六進位制形式Dumps formatted XML column data。需要五個輸入引數:table object ID(/OI)或table name(/TN)、table space ID(/TSI)、page number to start with(/PS)、number of pages(/NP)、verbose choice(/V Y/N)。
/LHWM:降低高水位的建議。需要兩個輸入引數:table space ID(/TSI)、number of pages(wanted high water mark)(/NP)。/LHWM選項不支援系統編目表空間。
(3)、Repair actions
/ETS:擴充套件表限制(only 4KB 的DMS表空間)。需要一個輸入引數:table space ID(/TSI)。
/MI:標記索引無效。指定這一引數時資料庫必須offline。需要兩個輸入引數:table space ID(/TSI)、index object ID(/OI)。對於分割槽索引,這些值可以從SYSCAT.INDEXPARTITIONS的INPARTITIONOBJECTID和INDPARTITIONTBSPACEID獲得。
/RHWM:降低高水位through empty SMP extents。指定這一引數時資料庫必須offline。需要一個輸入引數:table space ID(/TSI)。不支援系統編目表空間。
(4)、Change state actions
/CHST:改變資料庫狀態。指定這一引數時,資料庫必須offline。需要一個輸入引數:database backup pending state(/WHAT DBBP OFF/ON)。
示例:
1、檢查T表
[db2inst@localhost ~]$ db2dart sample /T /TSI 3 /TN T
The requested DB2DART processing has completed successfully!
Complete DB2DART report found in:
/home/db2inst/sqllib/db2dump/DART0000/SAMPLE.RPT
2、dump格式化的表空間檔案資訊
[db2inst@localhost ~]$ db2dart sample /DTSF
The requested DB2DART processing has completed successfully!
Complete DB2DART report found in:
/home/db2inst/sqllib/db2dump/DART0000/SAMPLE.RPT
三、db2diag
db2diag工具用於對db2diag日誌檔案中的大量資訊進行過濾和格式化。以縮短查詢所需記錄的時間。
示例1:按資料庫名稱過濾db2diag日誌檔案。
db2diag –g db=SAMPLE
示例2:按程式標識過濾db2diag日誌檔案。
以下命令用來顯示程式標識(PID)為2200,並且在分割槽0、1、2、或3上執行的程式生成的所有嚴重錯誤訊息:
db2diag –g level=Severe,pid=2200 –n 0,1,2,3
也可寫作:db2diag –l severe –pid 2200 –n 0,1,2,3
注意:-g選項指定區分大小寫的搜尋,所以此處“Server”寫作“server”會失敗。
示例3:格式化db2diag工具輸出
以下命令過濾2012年1月1日之後發生,並且包含分割槽0、1、2上記錄的所有非嚴重錯誤和嚴重錯誤的所有記錄。輸出內容格式化為:時間戳記、分割槽號和級別出現在第一行,而PID、TID和例項名出現在第二行上,之後是錯誤訊息:
db2diag -time 2012-01-01 –node “0,1,2” –level “Severe,Error” | db2diag –fmt “Time:%{ts}
Partition:%node Message Level:%{level} \nPid:%{pid} Tid:%{tid}
Instance:%{instance} \nMessage:@{msg}\n”
示例4:過濾來自不同工具的訊息
僅檢視來自資料庫管理器中的特定工具(或所有工具)的訊息。受支援的工具包括:
l ALL:返回來自所有工具的記錄。
l MAIN:返回來自DB2常規診斷日誌的記錄,例如db2diag日誌檔案和管理通知日誌。
l OPTSTATS:返回與優化器統計資訊有關的記錄。
要讀取來自MAIN工具的訊息:
db2diag -facility MAIN
要顯示來自OPTSTATS工具的訊息並過濾出級別為Severe的記錄:
db2diag -fac OPTSTATS -level Severe
要顯示來自所有可用工具的訊息並過濾出例項為harmistr級別為Error的記錄:
db2diag -fac all -g instance=harmistr,level=Error
要顯示OPTSTATS工具中級別為Error並且以特定格式輸出時間戳記和PID欄位的所有訊息:
db2diag -fac optstats -level Error -fmt “Time:%{ts} Pid:%{pid}”
示例5:根據時間戳記來合併檔案和對記錄進行排序
db2diag -merge db2diag.0.log db2diag.1.log -fmt %{ts} -level error
示例6:按時間戳記合併單臺主機中的三個資料庫分割槽中的檔案。
以下是要合併的三個db2diag日誌檔案的列表:
l ~/sqllib/db2dump/NODE0000/db2diag.log
l ~/sqllib/db2dump/NODE0001/db2diag.log
l ~/sqllib/db2dump/NODE0002/db2diag.log
要根據時間戳記合併這三個診斷日誌檔案並對記錄進行排序:
db2diag -merge
示例7:合併多臺主機和多個資料庫分割槽中的診斷日誌檔案
bower和horton兩臺主機中每個主機上有三個資料庫分割槽的診斷日誌檔案:
l ~/sqllib/db2dump/HOST_bower/NODE0000/db2diag.log
l ~/sqllib/db2dump/HOST_bower/NODE0001/db2diag.log
l ~/sqllib/db2dump/HOST_bower/NODE0002/db2diag.log
l ~/sqllib/db2dump/HOST_horton/NODE0003/db2diag.log
l ~/sqllib/db2dump/HOST_horton/NODE0004/db2diag.log
l ~/sqllib/db2dump/HOST_horton/NODE0005/db2diag.log
要獲得所有診斷日誌中所有記錄:
db2diag -global
要合併這些資料庫分割槽中的所有db2diag日誌檔案,並根據時間戳記設定輸出格式:
db2diag -global -merge -sdir /temp/keon -fmt %{ts}
其中/temp/keon是bower和horton這兩個主機共享的共享目錄,在處理期間用來儲存每個主機的臨時合併檔案。
示例8:僅過濾和合並最新的診斷日誌條目
過濾db2diag日誌檔案記錄以僅顯示特定數目的最新條目。顯示分割槽資料庫環境(共3個分割槽)中每個分割槽的5個最新格式化記錄並按時間戳記進行合併和格式化:
db2diag -lastrecords 5 -global -merge -sdir /home/vbmithun -fmt %{ts}
僅返回最新的10個記錄中具有嚴重訊息級別的記錄:
db2diag db2diag.log -lastrecords 10 -level Severe -fmt %{ts}
例項9:歸檔無例項客戶機上的db2diag日誌檔案
從 V9.7 FP4 開始,IBM® Data Server Driver Package 和 IBM Data Server for ODBC and CLI 提供了 db2diag –archive(或 –A)選項。此選項使您能夠歸檔無例項客戶機上的診斷日誌檔案。如:
db2diag -A
db2diag:Moving “/home/usr1/clidriver/db2dump/db2diag.log”
to “/home/usr1/clidriver/db2dump/db2diag.log_2010-09-14-01.16.26”
如果指定除-archive或-A之外的選項,將返回錯誤訊息。
四、db2greg
在UNIX和Linux平臺上,可以使用db2greg命令來檢視全域性登錄檔。
在DB2 V9.7及更高版本中,DB2全域性概要檔案登錄檔並非在文字檔案
全域性登錄檔只存在於UNIX和Linux平臺上:
對於root安裝,全域性登錄檔檔案為/var/db2/global.reg。
對於非root安裝,全域性登錄檔檔案為$HOME/sqllib/global.reg,其中$HOME是非root使用者的主目錄。
全域性登錄檔由以下三種不同記錄型別組成:
“服務”:服務記錄包含產品級別的資訊,如版本和安裝路徑;
“例項”:例項記錄包含例項級別的資訊,如例項名、例項路徑、版本和“引導時啟動”標誌;
“變數”:變數記錄包含變數級別的資訊,如變數名和變數值;
註釋。
可使用db2greg工具檢視全域性登錄檔。此工具位於sqllib/bin和bin下的install目錄中。可使用db2greg工具編輯全域性登錄檔。
示例:
1、檢視“服務”資訊:
[db2inst@localhost ~]$ db2greg -getservrec service=DB2
Retrieved record:
Service = |DB2|
Version = |9.7.0.7|
InstallPath = |/opt/ibm/db2/V9.7|
GCFModule = |N/A|
Comment = |N/A|
FixpackNum = 7
InstallerUID = 0
InterimFixLetter = N/A
Timestamp = 1354816731
SpecialInstallNumber = 0
2、檢視“例項”資訊:
[db2inst@localhost ~]$ db2greg -getinstrec instancename=db2inst
Retrieved record:
Service = |DB2|
Version = |9.7.0.7|
InstanceName = |db2inst|
InstancePath = |/home/db2inst/sqllib|
Usage = |N/A|
StartAtBoot = 1
Maintenance = 0
InstallPath = |/opt/ibm/db2/V9.7|
RemoteProf = |N/A|
Comment = |N/A|
五、db2level
db2level命令用來確定DB2例項的版本和修訂包級別。
六、db2look
建立一個結構相同的資料庫很多時候是非常有利的。例如,不用在生產環境下測試新的應用和恢復計劃,而是建立一個與之結構和資料都相似的測試環境,在測試環境上進行測試。這樣,生產環境就不會受到測試所帶來的效能影響以及意外的資料破壞。此外,當調查一個故障(例如不合法的結果、效能問題等)時,在一個與生產環境相同的測試環境上進行除錯都要相對容易一些。
可以使用db2look工具提取需要的DDL語句以在另外一個資料庫中重新構建資料庫物件。也可以使用db2look工具生成需要的SQL語句以複製統計資訊、資料庫配置資訊、資料庫管理器配置資訊以及登錄檔變數。這是非常重要的,因為新的資料庫可能不會非常精確的包含同樣的資料集,但是仍然希望使用相同的訪問計劃。
示例:
1、生成test資料庫中,user1使用者建立的所有物件的DDL,並輸出到db2look.sql檔案中:
db2look –d test –u user1 –e –o db2look.sql
2、生成test資料庫中,user1使用者建立的,模式名為ianhe的所有物件的DDL,並輸出到db2look.sql檔案中:
db2look –d test –u user1 –z ianhe –e –o db2look.sql
3、生成UPDATE語句,以複製test資料庫中,user1使用者建立的資料庫物件的統計資訊,並輸出到db2look.sql檔案中:
db2look –d test –u user1 –m –o db2look.sql
4、生成test資料庫中,user1使用者建立的物件的DDL語句和複製統計資訊的UPDATE語句,輸出到db2look.sql檔案中:
db2look –d test –u user1 –e –m –o db2look.sql
5、生成test資料庫中所有使用者物件的DDL語句,輸出到db2look.sql檔案中:
db2look –d test –a –e –o db2look.sql
-a選項生成所有creators的統計資訊,如果同時指定了-u,則-u選項被忽略。
6、生成test資料庫中所有使用者定義的分割槽組、buffer pools和表空間的DDL語句,並輸出到db2look.sql檔案中:
db2look –d test –l –o db2look.sql
-l選項生成:資料庫分割槽組、bufferpools和表空間資訊。
7、生成test資料庫的優化器相關的資料庫和資料庫管理器配置引數的UPDATE語句以及優化器相關的登錄檔變數的db2set語句,輸出到db2look.sql檔案:
db2look –d test –f –o db2look.sql
-f選項生成配置引數和環境變數
8、資料庫為test,生成:所有物件的DDL語句、用於複製所有表和索引的統計資訊的UPDATE語句、GRANT授權語句、優化器相關的資料庫和資料庫管理器配置引數的UPDATE語句、優化器相關的登錄檔變數的db2set語句、所有使用者定義的資料庫分割槽組和buffer pools以及表空間的DDL語句。輸出到db2look.sql檔案:
db2look –d test –a –e –m –l –x –f –o db2look.sql
-x選項generate authorization DDL for existing granted privileges, excluding the original definer of the object
9、生成test資料庫中所有使用者物件的DDL語句,並以%作為分界符(預設為“;”),輸出到db2look.sql檔案中:
db2look –d test –a –e –td % -o db2look.sql
10、生成test資料庫中所有物件授權的DDL語句,包括original creator建立的物件(這種情況下,在物件建立時由SYSIBM授權)。輸出到db2look.sql檔案中:
db2look –d test –xd –o db2look.sql。
11、生成test資料庫物件的DDL語句,不包括create view語句:
db2look –d test –e –noview –o db2look.sql
12、生成test資料庫中與指定表相關的物件的DDL語句:
db2look –d test –e –t tabl –o db2loog.sql
13、生成federated資料庫FEDDEPART中所有物件(federated和non-federated)的DDL語句。
db2look –d feddepart –e –wrapper fedwrap
14、生成test資料庫中所有使用者物件的DDL語句。同時匯出XSR物件到目錄/home/ofer/ofer/。
db2look –d test -a –e –xs –xdir /home/ofer/ofer。
15、生成test資料庫中WLM詳細的DDL語句:
db2look –d test –wlm
七、db2ls
在UNIX和Linux上,列出系統上安裝的DB2資料庫產品。
該命令可以列出DB2資料庫產品在系統上安裝的位置和DB2資料庫產品的版本;可以列出特定安裝路徑上的所有或指定的DB2資料庫產品和元件。
要列出DB2資料庫產品在系統上安裝的路徑和版本:db2ls
要列出特定安裝路徑上的DB2資料庫產品或元件:
db2ls –q –p –b baseInstallDirectory
-q:必須指定。指明正在查詢DB2產品或元件。
-p:指定列出資料庫產品而不是列出元件,如果不指定,則列出各個資料庫元件。
-b:指定安裝目錄。如果不是在安裝目錄下執行命令,則此引數必須指定。
八、db2pd
db2pd命令用來診斷故障,因為它可以迅速的返回記憶體中的即時資訊。
db2pd工具收集資訊不需要任何latches(鎖存器),也不需要使用任何引擎資源。因此,當db2pd收集資訊時,它可能會檢索正在更改的資訊。這樣,收集到的資料可能不完全準確。如果遇到正在更改的記憶體指標,可使用訊號處理程式來防止db2pd異常結束。這可能會導致輸出中出現如下訊息“Changing data structure forced command termination”。儘管如此,該工具對於故障診斷非常有用。在不鎖存的情況下收集資訊有兩個好處:檢索速度更快並且不會爭用引擎資源。
當特定的SQLCODE、ZRC code或ECF code發生時,可以使用db2pdcfg –catch命令捕獲資料庫管理器系統資訊。當errors被捕獲時,db2cos(callout script)被呼叫。
例如,如果要在一個鎖超時錯誤發生時,呼叫db2cos指令碼:
db2pdcfg –catch locktimeout db2cos
db2cos指令碼可以被動態的修改以便執行任何db2pd命令、OS命令、或者任何其他需要用來解決問題的命令。在UNIX和Linux下,db2cos指令碼檔案在sqllib/bin目錄下。在Windows下,db2cos在$DB2PATH\bin目錄。
DB2安裝後自帶的預設db2cos指令碼有著簡單的流程。DB2呼叫它的時候會同時傳遞給它一些引數。db2cos指令碼通過這些引數得知呼叫自己的例項、程式、時間點和函式等資訊。還有一個傳入引數叫做typeReason,它告訴db2cos被呼叫的原因是什麼,例如資料損壞(DATA_COR)、鎖超時(LOCKTIMEOUT)、死鎖(DEADLOCK)或者其他錯誤程式碼(SQLCODE)。
常見的傳入引數有:#instance: instance name #database:database name
#dbpart:database partition number
#pid:process ID
#tid:thread ID
#function:function name of function that called the panic script
#component:component of the function
#probe:probe point
#timestamp:timestamp of when the script. was called
#appid:application ID
#apphld:application handle
db2cos會遍歷上面的引數,記錄下它們的值,然後根據typeReason引數的定義,執行對應的動作。每次db2cos被呼叫,db2diag.log中都會有相應的記錄。
要獲取當前處於活動狀態或者曾處於活動狀態但由於某種原因而被取消的事件監視器列表,執行db2pd –gfw命令。此命令返回關於每個快速寫程式EDU的目標(事件監視器將資料寫入這些目標)的統計資訊和資訊。
示例:
1、診斷lockwait
db2pd –db dbname –locks –transactions –applications -dynamic
返回結果類似如下:
Locks:
Address TranHdl Lockname Type Mode Sts Owner Dur HldCnt Att ReleaseFlg
0x07800000202E5238 3 00020002000000040000000052 Row ..X G 3 1 0 0x0000 0x40000000
0x07800000202E4668 2 00020002000000040000000052 Row ..X W* 2 1 0 0x0000 0x40000000
對於指定了-db選項的資料庫,第一個結果顯示資料庫的locks。此處結果顯示TranHdl 2正在等待TranHdl 3持有的鎖。
Transactions:
Address AppHandl [nod-index] TranHdl Locks State Tflag Tflag2 Firstlsn Lastlsn LogSpace SpaceReserved TID AxRegCnt GXID
0x0780000020251B80 11 [000-00011] 2 4 READ 0x00000000 0x00000000 0x000000000000 0x000000000000 0 0 0x0000000000B7 1 0
0x0780000020252900 12 [000-00012] 3 4 WRITE 0x00000000 0x00000000 0x000000FA000C 0x000000FA000C 113 154 0x0000000000B8 1 0
可以看到TranHdl 2與AppHandl 11相關,TranHdl 3與AppHandl 12相關。
Applications:
Address AppHandl [nod-index] NumAgents CoorPid Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid
0x07800000006879E0 12 [000-00012] 1 1073336 UOW-Waiting 0 0 17 1 *LOCAL.burford.060303225602
0x0780000000685E80 11 [000-00011] 1 1040570 UOW-Executing 17 1 94 1 *LOCAL.burford.060303225601
可以看到AppHandl 12最後執行動態語句17,1.ApplHandl 11當前正在執行動態語句17,1,最後執行的時94,1.
Dynamic SQL Statements:
Address AnchID StmtUID NumEnv NumVar NumRef NumExe Text
0x07800000209FD800 17 1 1 1 2 2 update pdtest set c1 = 5
0x07800000209FCCC0 94 1 1 1 2 2 set lock mode to wait 1
可以看到與鎖等待相關的SQL語句。
2、使用-wlocks引數捕獲所有正處於等待狀態的鎖定
db2pd –wlocks –db pdtest
Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:22
Locks being waited on :
AppHandl [nod-index] TranHdl Lockname Type Mode Conv Sts CoorEDU AppName AuthID AppID
47 [000-00047] 8 00020004000000000840000652 Row ..X G 5160 db2bp VENUS *LOCAL.venus.071207213730
46 [000-00046] 2 00020004000000000840000652 Row .NS W 5913 db2bp VENUS *LOCAL.venus.071207213658
3、使用-apinfo引數獲取lock owner和lock waiter執行的詳細資訊。
與上例相同的條件下:
db2pd –apinfo 47 –db pdtest
輸出結果如下:
Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:30
Application :
Address : 0x0780000001676480
AppHandl [nod-index] : 47 [000-00047]
Application PID : 876558
Application Node Name : boson
IP Address: n/a
Connection Start Time : (1197063450)Fri Dec 7 16:37:30 2007
Client User ID : venus
System Auth ID : VENUS
Coordinator EDU ID : 5160
Coordinator Partition : 0
Number of Agents : 1
Locks timeout value : 4294967294 seconds
Locks Escalation : No
Workload ID : 1
Workload Occurrence ID : 2
Trusted Context : n/a
Connection Trust Type : non trusted
Role Inherited : n/a
Application Status : UOW-Waiting
Application Name : db2bp
Application ID : *LOCAL.venus.071207213730
ClientUserID : n/a
ClientWrkstnName : n/a
ClientApplName : n/a
ClientAccntng : n/a
List of inactive statements of current UOW :
UOW-ID : 2
Activity ID : 1
Package Schema : NULLID
Package Name : SQLC2G13
Package Version :
Section Number : 203
SQL Type : Dynamic
Isolation : CS
Statement Type : DML, Insert/Update/Delete
Statement : insert into pdtest values 99
db2pd –apinfo 46 –db pdtest
結果如下:
Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:39
Application :
Address : 0x0780000000D77A60
AppHandl [nod-index] : 46 [000-00046]
Application PID : 881102
Application Node Name : boson
IP Address: n/a
Connection Start Time : (1197063418)Fri Dec 7 16:36:58 2007
Client User ID : venus
System Auth ID : VENUS
Coordinator EDU ID : 5913
Coordinator Partition : 0
Number of Agents : 1
Locks timeout value : 4294967294 seconds
Locks Escalation : No
Workload ID : 1
Workload Occurrence ID : 1
Trusted Context : n/a
Connection Trust Type : non trusted
Role Inherited : n/a
Application Status : Lock-wait
Application Name : db2bp
Application ID : *LOCAL.venus.071207213658
ClientUserID : n/a
ClientWrkstnName : n/a
ClientApplName : n/a
ClientAccntng : n/a
List of active statements :
*UOW-ID : 3
Activity ID : 1
Package Schema : NULLID
Package Name : SQLC2G13
Package Version :
Section Number : 201
SQL Type : Dynamic
Isolation : CS
Statement Type : DML, Select (blockable)
Statement : select * from pdtest
4、使用db2cos分析鎖超時
要使用調出指令碼,找到db2cos輸出檔案。該檔案的位置由資料庫管理器配置引數diagpath控制。輸出檔案的內容將根據在db2cos指令碼檔案中輸入的命令而不同。在UNIX系統上,預設db2cos指令碼在bin目錄中,此目錄是隻讀目錄,可將db2cos指令碼檔案複製到adm目錄,必要時在該位置修改該檔案。在adm目錄中,db2cos目錄同樣可以執行。
使用預設的db2cos指令碼就可以方便的分析鎖超時問題。首先賦予db2cos指令碼執行許可權:chmod u+x $HOME/sqllib/bin/db2cos
然後使用db2dpcfg –catch命令開啟捕獲開關。這個命令會告訴DB2在發生鎖超時(lock timeout)時執行db2cos指令碼。
db2pdcfg –catch locktimeout
這個預設的db2cos指令碼會在鎖超時發生後生成一個名為db2cos.rpt的檔案在$HOME/sqllib/db2dump/下。
5、將應用程式對映至動態SQL語句
db2pd –applications –dynamic命令報告動態SQL語句的當前和最後一個錨點標識和語句唯一標識。這允許直接從應用程式對映至動態SQL語句。
Applications:
Address AppHandl [nod-index] NumAgents CoorPid Status
0x00000002006D2120 780 [000-00780] 1 10615 UOW-Executing
C-AnchID C-StmtUID L-AnchID L-StmtUID Appid
163 1 110 1 *LOCAL.burford.050202200412
Dynamic SQL Statements:
Address AnchID StmtUID NumEnv NumVar NumRef NumExe Text
0x0000000220A02760 163 1 2221CREATE VIEW MYVIEW
0x0000000220A0B460 110 1 2221CREATE VIEW YOURVIEW
6、監視記憶體使用情況
使用db2pd –memblock命令瞭解記憶體使用情況。
[db2inst@localhost ~]$ db2pd -memblock | more
All memory blocks in DBMS set.
Address DataAddress PoolID PoolName BlkAge Size(Bytes) I LOC File
0x10740068 0x10740080 77 fcmsess 3 849920 1 495 3002113363
0x10730048 0x10730060 77 fcmsess 2 6000 1 388 3002113363
0x106EFFC8 0x106EFFE0 77 fcmsess 1 262144 1 246 3315196337
0x10680068 0x10680080 79 fcmchan 3 93184 1 495 3002113363
0x10670048 0x10670060 79 fcmchan 2 768 1 388 3002113363
0x1065FFC8 0x1065FFE0 79 fcmchan 1 65536 1 246 3315196337
0x10580068 0x10580080 13 fcmbp 3 524288 1 495 3002113363
0x10570048 0x10570060 13 fcmbp 2 768 1 388 3002113363
0x1055FFC8 0x1055FFE0 13 fcmbp 1 65536 1 246 3315196337
0x10978C78 0x10978C90 73 fcmctl 11 160592 1 1650 2986298236
0x10948C78 0x10948C90 73 fcmctl 10 160592 1 1650 2986298236
0x1092C528 0x1092C540 73 fcmctl 5 80544 1 1476 2986298236
…
Total size for DBMS memory set: 10178767 bytes
接下來是已排序的“效能池”輸出:
Memory blocks sorted by size for fcmsess pool:
PoolID PoolName TotalSize(Bytes) TotalCount LOC File
77 fcmsess 849920 1 495 3002113363
77 fcmsess 262144 1 246 3315196337
77 fcmsess 6000 1 388 3002113363
Total size for fcmsess pool: 1118064 bytes
Memory blocks sorted by size for fcmchan pool:
PoolID PoolName TotalSize(Bytes) TotalCount LOC File
79 fcmchan 93184 1 495 3002113363
79 fcmchan 65536 1 246 3315196337
79 fcmchan 768 1 388 3002113363
Total size for fcmchan pool: 159488 bytes
…
Memory blocks sorted by size for apmh pool:
PoolID PoolName TotalSize(Bytes) TotalCount LOC File
70 apmh 286464 12 1476 2986298236
70 apmh 260200 1 285 1586829889
70 apmh 130100 1 271 1586829889
70 apmh 16000 1 1650 2986298236
70 apmh 4404 2 195 2986298199
70 apmh 4208 2 815 1411768055
70 apmh 2380 7 1581 3342001786
70 apmh 840 2 3380 1953793439
70 apmh 840 1 1472 3878879032
…
…
最後一部分輸出對整個記憶體集的記憶體使用者進行排序:
All memory consumers in DBMS memory set:
PoolID PoolName TotalSize(Bytes) %Bytes TotalCount %Count LOC File
72 eduah 2816016 27.67 1 0.06 189 4210081592
50 sqlch 1205268 11.84 1 0.06 193 2576467555
73 fcmctl 854872 8.40 6 0.33 1476 2986298236
77 fcmsess 849920 8.35 1 0.06 495 3002113363
62 resynch 604820 5.94 1 0.06 128 1599127346
13 fcmbp 524288 5.15 1 0.06 495 3002113363
50 sqlch 423228 4.16 1 0.06 250 2576467555
73 fcmctl 321184 3.16 2 0.11 1650 2986298236
70 apmh 286464 2.81 12 0.67 1476 2986298236
…
在UNIX和Linux上,還會在最後報告專用記憶體的記憶體塊:
All memory blocks in FMP set.
Address DataAddress PoolID PoolName BlkAge Size(Bytes) I LOC File
0x126A1FB8 0x126A1FD0 59 undefh 3 122900 1 408 1937674139
0x12681FB8 0x12681FD0 59 undefh 2 122900 1 408 1937674139
0x12661FB8 0x12661FD0 59 undefh 1 122900 1 408 1937674139
Total size for FMP memory set: 368700 bytes
…
7、確定哪個應用程式耗盡表空間
使用db2pd –tcbstats可以確定對錶執行的插入運算元。以下是sample資料庫中T表的資訊:(此處只說明過程,實際T表並沒有耗盡表空間)
[db2inst@localhost ~]$ db2pd -db sample -tcbstats
TCB Table Information:
Address TbspaceID TableID PartID MasterTbs MasterTab TableName SchemaNm ObjClass DataSize LfSize LobSize XMLSize
0xA5904944 3 8 n/a 3 8 T DB2INST Perm 1 0 0 0
TCB Table Stats:
Address TableName SchemaNm Scans UDI RTSUDI PgReorgs NoChgUpdts Reads FscrUpdates Inserts Updates Deletes OvFlReads OvFlCrtes RowsComp RowsUncomp CCLogReads StoreBytes BytesSaved
0xA5904944 T DB2INST 3 0 0 0 0 5 0 2 0 0 0 0 0 0 0 - -
然後,通過使用db2pd –tablespaces命令獲取表空間3的資訊:
Tablespace Configuration:
Address Id Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC NumCntrs MaxStripe LastConsecPg Name
0xA4965D80 3 DMS Large 8192 32 Yes 32 1 1 Off 1 0 31 IBMDB2SAMPLEREL
Tablespace Statistics:
Address Id TotalPgs UsablePgs UsedPgs PndFreePgs FreePgs HWM Max HWM State MinRecTime NQuiescers PathsDropped
0xA4965D80 3 4096 4064 864 0 3200 864 864 0x00000000 0 0 No
Tablespace Autoresize Statistics:
Address Id AS AR InitSize IncSize IIP MaxSize LastResize LRF
0xA4965D80 3 Yes Yes 33554432 -1 No None None No
Containers:
Address TspId ContainNum Type TotalPgs UseablePgs PathID StripeSet Container
0xA4967230 3 0 File 4096 4064 0 0 /home/db2inst/db2inst/NODE0000/SAMPLE/T0000003/C0000000.LRG
FreePgs值加上UsedPgs值等於UsablePgs值。FreePgs列值下降表示可用空間減少。
然後通過執行db2pd –db sample –dyn來確定正在使用表T的動態SQL語句:
[db2inst@localhost ~]$ db2pd -db sample -dyn | more
Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 02:00:19 -- Date 2012-12-11-07.15.08.862395
Dynamic Cache:
Current Memory Used 1265017
Total Heap Size 1271398
Cache Overflow Flag 0
Number of References 741
Number of Statement Inserts 225
Number of Statement Deletes 179
Number of Variation Inserts 63
Number of Statements 46
Dynamic SQL Statements:
Address AnchID StmtUID NumEnv NumVar NumRef NumExe Text
0xA5ADFDF0 647 1 0 0 1 1 insert into t values (2,'b')
0xA5B13F00 106 1 1 1 3 3 insert into t values(4,'d')
最後,通過執行db2pd –db sample –app將以上輸出中的資訊對映到應用程式輸出,以便確定應用程式:
Applications:
Address AppHandl [nod-index] NumAgents CoorEDUID Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid WorkloadID WorkloadOccID CollectActData CollectActPartition CollectSectionActuals
0x10A908C0 270 [000-00270] 1 36 UOW-Waiting 0 0 106 1 *LOCAL.db2inst.121210233431 1 2 N C N
可以使用用於標識動態SQL語句的錨點標識(AnchID)值來標識相關聯的應用程式。
db2pd –agent的輸出將指示應用程式讀取的行數(Rowsread列)和寫入的行數(Rowswrtn列)。這些值顯示應用程式已完成的部分及未完成的部分:
[db2inst@localhost ~]$ db2pd -agent app=270
Address AppHandl [nod-index] AgentEDUID Priority Type State ClientPid Userid ClientNm Rowsread Rowswrtn LkTmOt DBName LastApplId LastPooled
0x10B00060 270 [000-00270] 36 0 Coord Inst-Active 7074 db2inst db2bp 1 8 NotSet SAMPLE *LOCAL.db2inst.121210233431 Tue Dec 11 07:30:45
可以將執行db2pd –agent命令時生成的AppHandl和AgentEDUID值對映到執行db2pd –app命令時生成的相應AppHandl和CoorEDUID值。
8、監視恢復
如果執行db2pd –recovery命令,輸出將顯示多個計數器,這些計數器可用於驗證是否正在執行恢復。
9、確定事務正在使用的資源量
db2pd –transactions命令輸出鎖定數、第一個日誌序號(LSN)、最後一個LSN、以用日誌空間量和保留空間量。
[db2inst@localhost ~]$ db2pd -db sample -transactions
Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 04:00:20 -- Date 2012-12-11-09.15.09.876334
Transactions:
Address AppHandl [nod-index] TranHdl Locks State Tflag Tflag2 Firstlsn Lastlsn SpaceReserved LogSpace TID AxRegCnt GXID ClientUserID ClientWrkstnName ClientApplName ClientAccntng
0xA3034B00 445 [000-00445] 2 0 READ 0x00000000 0x00000000 0x0000000000000000 0x0000000000000000 0 0 0x000000001A56 1 0 n/a n/a n/a n/a
0xA3035800 8 [000-00008] 3 0 READ 0x00000000 0x00000000 0x0000000000000000 0x0000000000000000 0 0 0x0000000011B6 1 0 n/a n/a n/a n/a
0xA3036500 9 [000-00009] 4 0 READ 0x00000000 0x00000000 0x0000000000000000 0x0000000000000000 0 0 0x000000001A57 1 0 n/a n/a n/a n/a
10、監視日誌使用情況
[db2inst@localhost ~]$ db2pd -db sample –logs
Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 04:02:49 -- Date 2012-12-11-09.17.38.279599
Logs:
Current Log Number 0
Pages Written 421
Cur Commit Disk Log Reads 0
Cur Commit Total Log Reads 0
Method 1 Archive Status n/a
Method 1 Next Log to Archive n/a
Method 1 First Failure n/a
Method 2 Archive Status n/a
Method 2 Next Log to Archive n/a
Method 2 First Failure n/a
Log Chain ID 0
Current LSN 0x0000000003C3D376
Address StartLSN State Size Pages Filename
0xA3032888 0000000003A98010 0x00000000 1000 1000 S0000000.LOG
0xA3032048 0000000003E80010 0x00000000 1000 1000 S0000001.LOG
0xA3011598 0000000004268010 0x00000000 1000 1000 S0000002.LOG
通過寫入頁數值,可以確定日誌使用量是否正在增加。如果最近大多數的日誌歸檔操作都失敗,那麼歸檔狀態的值將被設定為失敗。如果正在發生的歸檔失敗導致完全無法對日誌進行歸檔,那麼歸檔狀態值將被設定為首次失敗。
11、生成堆疊跟蹤
使用db2pd –stack all命令生成當前資料庫分割槽中所有程式的堆疊跟蹤。如果懷疑某個程式或執行緒正在迴圈或正被掛起,那麼可能要反覆使用此命令。
使用db2pd –stack eduid來獲取特定引擎可分派單元(EDU)的當前呼叫堆疊。
可以使用dumpdir引數將db2pd –stacks命令的輸出重定向至特定目錄路徑以及使用timeout引數僅重定向特定持續時間的輸出:
[db2inst@localhost trapfiles]$ db2pd -stack all dumpdir=~/trapfiles timeout=30
12、檢視資料庫分割槽的記憶體統計資訊
db2pd –dbptnmem命令顯示DB2伺服器當前消耗的記憶體量,並在較高階別顯示使用這些記憶體的伺服器區域。
[db2inst@localhost ~]$ db2pd –dbptnmem
Database Partition 0 -- Active -- Up 0 days 04:47:32 -- Date 2012-12-11-09.58.07.495126
Database Partition Memory Controller Statistics
Controller Automatic: Y
Memory Limit: 773492 KB
Current usage: 214848 KB
HWM usage: 230336 KB
Cached memory: 48064 KB
Individual Memory Consumers:
Name Mem Used (KB) HWM Used (KB) Cached (KB)
========================================================
APPL-SAMPLE 24768 40000 23488
DBMS-db2inst 39232 39232 5568
FMP_RESOURCES 22528 22528 0
PRIVATE 11456 11456 0
DB-SAMPLE 116608 116608 19008
LCL-p7074 128 128 0
LCL-p2109 128 128 0
說明:
Controller Automatic:指示記憶體控制器設定。如果instance_memory配置引數設定為AUTOMATIC,那麼它將顯示“Y”,意味著資料庫管理器自動確定記憶體耗用量上限。
Memory Limit:如果強制施加了例項記憶體限制,那麼instance_memory配置引數的值是可以耗用的DB2伺服器記憶體的上限。
Memory Limit:伺服器當前耗用的記憶體量。
HWM usage:自啟用資料庫分割槽(在db2start命令執行時)以來消耗的記憶體高水位標記(HWM)或峰值。
Cached memory:快取記憶體的記憶體,當前使用量中未使用但為了提高將來記憶體請求的效能而快取記憶體的記憶體量。
APPL-dbname:為資料庫dbname耗用的應用程式記憶體
DBMS-name:全域性資料庫管理器記憶體需求
FMP_RESOURCES:與db2fmps進行通訊所需的記憶體
PRIVATE:其他專用記憶體需求
DB-dbname:為資料庫dbname耗用的資料庫記憶體
LCL-pid:用於與本地應用程式進行通訊的記憶體段
13、顯示耗費處理器時間最多的幾個EDU並顯示EDU堆疊資訊
使用db2pd –edus,輸出將列示所有引擎可分派單元(EDU)。在Linux和UNIX上,可以指定interval引數,以便生成所有EDU的兩個快照,這兩個快照將相隔指定的時間間隔,這樣輸出會增加兩列:USER DELTA列指示該時間間隔內處理器使用者時間的增量,SYS DELTA列指示時間間隔內處理器系統時間的增量。
要僅檢視有關耗費處理器時間最多的幾個EDU的資訊以減少返回的輸出量,可以指定top引數。
[db2inst@localhost ~]$ db2pd -edus interval=5 top=5
Database Partition 0 -- Active -- Up 0 days 05:24:37 -- Date 2012-12-11-10.35.12.331994
List of all EDUs for database partition 0
db2sysc PID: 2037
db2wdog PID: 2035
db2acd PID: 2052
EDU ID TID Kernel TID EDU Name USR (s) SYS (s) USR DELTA SYS DELTA
=========================================================================================================
1 2911890288 2041 db2sysc 0 1.010000 12.190000 0.000000 0.010000
25 2928667504 2254 db2pfchr (SAMPLE) 0 0.030000 0.030000 0.000000 0.000000
11 2943347568 2042 db2alarm 0 0.160000 1.450000 0.000000 0.000000
12 2942298992 2043 db2thcln 0 0.000000 0.000000 0.000000 0.000000
14 2940201840 2046 db2ipccm 0 0.100000 0.450000 0.000000
九、db2support
使用db2support命令來收集環境資訊,並將這些系統資料放到一個壓縮檔案中。db2support實用程式將自動收集所有可用的DB2診斷資訊和系統診斷資訊。它還有一個可選的互動式會話。該會話提出有關問題的詳情。
使用db2support可以避免可能的使用者錯誤,因為不必手動輸入GET DATABASE CONFIGURATION FOR database-name或LIST TABLESPACES SHOW DETAIL之類的命令。而且,不需要有關要執行的命令或要收集的檔案的指示資訊,因此收集資料的速度會比較快。
十、db2val
db2val命令用於確保DB2副本在正常執行。它通過以下方法驗證DB2副本的核心功能:驗證安裝檔案、例項、資料庫建立情況、與該資料庫的連線以及分割槽資料庫環境的狀態。db2val命令可以快速確保已正確完成所有配置,並且確保DB2副本就是期望的副本。可以指定例項和資料庫,也可以對所有例項執行db2val命令。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25744374/viewspace-750932/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 故障診斷學習工具
- Oracle故障診斷Oracle
- DB2資料庫故障與效能瓶頸診斷思路DB2資料庫
- 光纖故障診斷和故障排查
- ASM磁碟故障診斷(二)ASM
- ASM磁碟故障診斷(一)ASM
- RAC故障診斷指令碼指令碼
- 故障分析 | Kubernetes 故障診斷流程
- 9 Oracle Data Guard 故障診斷Oracle
- mysql複製故障診斷與排除MySql
- 部落格連結—Oracle故障診斷Oracle
- oracle 效能診斷工具Oracle
- 如何診斷和解決db2問題DB2
- [JVM] 應用診斷工具之Fastthread(線上診斷)JVMASTthread
- websphere中介軟體故障診斷troubleshootingWeb
- 利用 Java dump 進行 JVM 故障診斷JavaJVM
- oracle診斷工具-RDA使用Oracle
- oracle sqlt(sqltxplain) 診斷工具OracleSQLAI
- Oracle診斷工具RDA使用Oracle
- linux網路配置、測試及故障診斷方法和工具四薦Linux
- 故障診斷為什麼要用深度學習?深度學習
- 一次DG故障診斷過程分析
- Cisco路由器故障診斷技術(轉)路由器
- 如何選擇java診斷工具Java
- 網路診斷工具的使用
- .NET Core 服務診斷工具
- GreysJava線上問題診斷工具Java
- 【轉】oracle診斷工具-RDA使用Oracle
- oracle診斷工具-RDA使用(轉)Oracle
- 大語言模型與資料庫故障診斷模型資料庫
- oracle 10046事件故障診斷一例Oracle事件
- 【故障診斷】cr塊slot notfound解決過程
- 【記錄】Linux 系統故障診斷與排除Linux
- Oracle___診斷案例__資料庫的exp故障Oracle資料庫
- IBM Lotus Sametime Servers 故障診斷與排除IBMServer
- 風機故障診斷學習資源(更新中)
- 使用crsctl工具診斷cluster問題
- 吃透 JVM 診斷方法與工具使用JVM