新聞中心
我認為解決問題的關(guān)鍵在于分清問題的種類,并清楚每種問題的解決辦法。另外很多的數(shù)據(jù)庫的問題都是由于錯誤的操作,錯誤的配置引起的,所以本文在解釋怎么樣處理問題時也會給出一些好的建議,來避免產(chǎn)生問題。本文重點介紹實用的方法。

對問題的分類有很多種方法,在本文中我我采用了兩種分類方案。
第一種方案是是否有錯誤碼。即發(fā)生錯誤時是否同時返回了錯誤碼,錯誤碼既包括執(zhí)行命令的返回碼,也包擴應(yīng)用程序的返回碼。
有返回碼的錯誤解決方案是,在db2 CLP中運行db2 ? SQLXXXX,然后根據(jù)對該問題的解釋采取相應(yīng)的解決方案。對沒有錯誤碼的問題,如數(shù)據(jù)庫hang,CPU使用率過高等問題,解決問題的經(jīng)驗將非常重要,在本文中會有詳細的說明。
根據(jù)錯誤碼解決問題舉例(在下文中,再出現(xiàn)需要用這種方法解決問題時將不再重復(fù)):
如在連接數(shù)據(jù)庫時發(fā)生錯誤
db2 connect to sample |
錯誤碼分為返回碼(SQL0332N)和原因碼(Reason Code "1"),針對不同的原因碼有不同的解決方案
運行db2 ? sql0332
從輸出種可以看到對于reason code 1的解釋是
…… |
所以可以通過設(shè)置代碼頁來解決這個問題
db2set db2codepage=1386 |
就可以成功連接了。
第二種分類方案是按照問題的范圍和性質(zhì)進行分類。分類如下:
1.數(shù)據(jù)庫實例問題
2.數(shù)據(jù)庫問題
3.數(shù)據(jù)庫性能問題
4.應(yīng)用開發(fā)與數(shù)據(jù)庫有關(guān)的問題
下面對每一類問題進行詳細說明。
一、數(shù)據(jù)庫實例的問題
數(shù)據(jù)庫實例問題可以分為兩種情況
1.實例無法啟動,運行db2start后,直接返回錯誤碼,如SQL1042C。
如果根據(jù)錯誤碼信息無法解決,可以嘗試如下方案:
重新更新該實例,以root身份登錄,
cd /usr/opt/db2_08_01/instance/ |
Tip:常見的產(chǎn)生實例無法啟動的原因
數(shù)據(jù)庫安裝了新的補丁后沒有運行db2iupdt
數(shù)據(jù)庫文件的權(quán)限被改成了777,數(shù)據(jù)庫文件的權(quán)限是有要求的,所以不能將所有的文件都改成777的權(quán)限
數(shù)據(jù)庫實例文件被刪除或損壞
主機名與db2nodes.cfg里記錄的不一致
2.運行db2start時,hang在那里,既不報錯,也無法啟動實例
這種情況一般是由于實例沒有正常的停止造成的,一般運行下列命令可以解決:
su - |
(將所有的與該實例有關(guān)的db2進程殺死kill -9 )
然后重新啟動實例。
3.數(shù)據(jù)庫實例崩潰問題
遇到實例崩潰的問題,首先查看db2diag.log,根據(jù)里面的信息來分析數(shù)據(jù)庫宕機的原因。再看db2dump目錄中是否有trap文件??梢愿鶕?jù)這些信息來分析原因,一般這類問題都需要IBM工程師協(xié)助解決。
宕機的原因可以分為兩類,一類是數(shù)據(jù)庫的BUG,即數(shù)據(jù)庫的缺陷引起的,一般如果遇到了數(shù)據(jù)庫的缺陷,都有臨時的解決方案,或者通過安裝最新的補丁來解決,對某些問題IBM也提供臨時的修訂來解決(需要付費)。另一類是操作系統(tǒng),誤操作等非產(chǎn)品問題導(dǎo)致的,對非產(chǎn)品問題導(dǎo)致的宕機盡量要避免。
Tip:常見的數(shù)據(jù)庫宕機原因
系統(tǒng)的交換空間(paging space)用盡
數(shù)據(jù)庫的某個進程被kill
二、數(shù)據(jù)庫問題
1.數(shù)據(jù)連接問題
無法連接數(shù)據(jù)庫,常見的錯誤有代碼頁錯誤,通訊協(xié)議錯誤,數(shù)據(jù)庫狀態(tài)錯誤等。
對代碼頁類錯誤,可以通過設(shè)置db2codepage,db2country來解決,這兩個變量需要用db2set設(shè)置成與數(shù)據(jù)庫一致的值。
當發(fā)生通訊類錯誤時,首先要要檢查環(huán)境變量DB2COMM=TCPIP是否已經(jīng)設(shè)置,然后要檢查dbm cfg的SVCENAME,該變量可以直接設(shè)置成端口號,或者設(shè)置成服務(wù)名,該服務(wù)名要在services文件中設(shè)置成對應(yīng)的端口號。要檢查該端口號是否已經(jīng)被其他服務(wù)占用。在啟動數(shù)據(jù)庫后,可以運行netstat –an |grep,來查看該端口處于的狀態(tài)。
TCP 0.0.0.0:50000 0.0.0.0:0 LISTENING |
還有一種情況,當連接數(shù)據(jù)庫時,數(shù)據(jù)庫處于backup pending狀態(tài),無法連接。這是只要對數(shù)據(jù)庫做一個備份就可以了。
Tip:通常導(dǎo)致數(shù)據(jù)庫處于備份贊掛的原因
當一個數(shù)據(jù)庫從循環(huán)日志改成歸檔日志時,數(shù)據(jù)庫要求進行一次脫機備份,在重新啟動數(shù)據(jù)庫后,數(shù)據(jù)庫就處于備份贊掛的狀態(tài)
對于一個使用線形日志的數(shù)據(jù)庫,當做load時,表空間會處于備份贊掛的狀態(tài),為了避免這種情況,load命令需要使用copy yes,或者nonrecoverable參數(shù)。
2.數(shù)據(jù)庫損壞
數(shù)據(jù)庫最嚴重的問題莫過于數(shù)據(jù)庫損壞,那么當數(shù)據(jù)庫損壞時,最好的辦法是從備份恢復(fù)數(shù)據(jù)庫。
如果無法從備份恢復(fù),可以根據(jù)損壞的原因嘗試相應(yīng)的解決方案。
由于存儲問題導(dǎo)致部分數(shù)據(jù)文件損壞,但是數(shù)據(jù)庫還可以連接,這種情況可以采用導(dǎo)出數(shù)據(jù)庫的表結(jié)果和數(shù)據(jù)的方法來恢復(fù)數(shù)據(jù)庫。當然對損壞的表,導(dǎo)出是無法完成的,這是可以使用db2dart的導(dǎo)出數(shù)據(jù)功能來導(dǎo)出這些損壞的表的數(shù)據(jù)。
如果數(shù)據(jù)庫損壞到已經(jīng)無法連接的程度,那么除了從備份恢復(fù),唯一的辦法是使用db2dart來導(dǎo)出所有的數(shù)據(jù)了。
Tip:怎么樣使用db2dart來導(dǎo)出數(shù)據(jù)
運行命令
db2dart /DDEL |
按照提示輸入表名,表空間id,起始頁數(shù),需要導(dǎo)出的頁數(shù)
3.數(shù)據(jù)庫的活動日志被刪除
這個問題經(jīng)常會遇到。也屬于數(shù)據(jù)庫損壞的一種情況。并且數(shù)據(jù)庫無法連接。
首先考慮是否有可以恢復(fù)的備份,如果有,可以從備份恢復(fù),然后前滾到日志的末尾,可以完全恢復(fù)該數(shù)據(jù)庫。如果沒有可用的備份來恢復(fù),可以通過IBM的技術(shù)支持中心來協(xié)助解決。如果想自己解決那只有使用db2dart工具了。
Tip:怎么樣避免數(shù)據(jù)庫的活動日志被刪除
啟用數(shù)據(jù)庫的鏡像日志功能
啟用數(shù)據(jù)庫的日志出口程序,這樣可以避免手工來刪除活動日志目錄中的日志
當一定要手工刪除活動日志目錄中的歸檔日志時,使用命令
PRUNE LOGFILE PRIOR TO log-file-name,] |
可以避免失誤將活動日志刪除
三、數(shù)據(jù)庫性能問題
數(shù)據(jù)庫的性能問題一般不屬于故障,但是當性能問題變得很嚴重時,就變成了故障。
解決數(shù)據(jù)庫的性能問題,可以從以下方面入手,檢查數(shù)據(jù)庫的配置,如緩沖池,排序堆等是否合理;檢查數(shù)據(jù)庫是否收集過統(tǒng)計信息,準確的統(tǒng)計信息對語句優(yōu)化起著重要的左右;對sql語句進行優(yōu)化;查看是否有系統(tǒng)資源瓶頸。
確認性能問題首先要從系統(tǒng)的資源消耗來分析,一般可以借助操作系統(tǒng)的工具,如aix的topas命令。數(shù)據(jù)庫的性能問題一般的表現(xiàn)是應(yīng)用變慢,甚至沒有響應(yīng)。
Tip:怎么樣快速定位問題
如果系統(tǒng)的CPU利用很高,IO很少,那么數(shù)據(jù)庫的排序較多
如果系統(tǒng)的IO繁忙,CPU很多是wait,那么說明數(shù)據(jù)庫有過多的IO
如果系統(tǒng)CPU,IO都很空閑,那么說明可以是有鎖的問題
如果系統(tǒng)IO,CPU都非常忙,說明有執(zhí)行代價非常高的sql在執(zhí)行
數(shù)據(jù)庫一般有三類的性能問題,一是CPU占用過多,二是IO過于繁忙,三是有鎖等待。
1.快速找到執(zhí)行成本較高的sql
首先要打開監(jiān)視器的開關(guān)
db2 update monitor switches using bufferpool on lock on sort on statement on table on uow on |
在系統(tǒng)最繁忙的時候,運行
db2 get snapshot for all applications > app.out |
然后在該文件中查找處于Executing狀態(tài)的應(yīng)用,找到執(zhí)行的對應(yīng)的sql語句。
如果用這種方法找不到,可以收集sql的快照
db2 get snapshot for dynamic sql on > sql.out |
這個快照記錄了動態(tài)語句的快照信息,可以根據(jù)
Total execution time (sec.ms) = 0.000000 |
這些信息來找到最耗時的語句。
2.怎么樣優(yōu)化sql語句
DB2提供了很好的工具來做sql語句優(yōu)化。首先要對找到的sql語句進行分析,看是否是該語句引起了性能問題。我們可以使用db2expln來查看sql語句的訪問計劃和執(zhí)行成本。
首先將找到的sql語句寫到一個文本文件中sql.in,以“;”結(jié)尾,然后運行
db2expln –d -f -z “;” –g –o sql.exp |
查看sql.exp可以看到這個sql語句的執(zhí)行成本。
如果確認該語句有問題,可以使用db2advis來通過建索引的方法來優(yōu)化該語句
db2advis –d -i sql.in |
如果通過創(chuàng)建索引無法優(yōu)化該語句,一般只能從業(yè)務(wù)角度優(yōu)化。
3.如果發(fā)生鎖的問題怎么樣處理
發(fā)生鎖的問題,一般有兩種情況,一是鎖等待,二是死鎖。首先檢查數(shù)據(jù)庫配置參數(shù)locktimeout,該參數(shù)一定不能設(shè)為-1,因為會引起某些應(yīng)用無限期的等待。
可以通過快照來確定數(shù)據(jù)庫發(fā)生的問題是哪一種。
db2 get snapshot for db on |
查看輸出中的下列內(nèi)容:
Deadlocks detected = 0 |
如果發(fā)生了死鎖,可以通過創(chuàng)建死鎖監(jiān)視器來分析產(chǎn)生死鎖的原因,命令如下:
mkdir /tmp/dlmon |
分享名稱:DB2故障處理的思路及一般問題的解決辦法
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/djgeseg.html


咨詢
建站咨詢
