程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 淺談DB2數據庫故障處理及最佳實踐(1)

淺談DB2數據庫故障處理及最佳實踐(1)

編輯:DB2教程

當你在使用數據庫時,可能會遇到各種不同的問題。我認為解決問題的關鍵在於分清問題的種類,並清楚每種問題的解決辦法。另外很多的數據庫的問題都是由於錯誤的操作,錯誤的配置引起的,所以本文在解釋如何處理問題時也會給出一些好的建議,來避免產生問題。本文重點介紹實用的方法。

對問題的分類有很多種方法,在本文中我我采用了兩種分類方案。

第一種方案是是否有錯誤碼。即發生錯誤時是否同時返回了錯誤碼,錯誤碼既包括執行命令的返回碼,也包擴應用程序的返回碼。

有返回碼的錯誤解決方案是,在db2 CLP中運行 db2 ? SQLXXXX,然後根據對該問題的解釋采取相應的解決方案。對沒有錯誤碼的問題,如數據庫hang,CPU使用率過高等問題,解決問題的經驗將非常重要,在本文中會有詳細的說明。

根據錯誤碼解決問題舉例在下文中,再出現需要用這種方法解決問題時將不再重復):

如在連接數據庫時發生錯誤

db2 connect to sample

SQL0332N There is no available conversion for the source code page "1386" to

the target code page "819". Reason Code "1". SQLSTATE=57017

錯誤碼分為返回碼SQL0332N)和原因碼Reason Code "1"),針對不同的原因碼有不同的解決方案

運行db2 ? sql0332

從輸出種可以看到對於 reason code 1的解釋是

……

1 source and target code page combination is not supported by the database manager.

……

所以可以通過設置代碼頁來解決這個問題

db2set db2codepage=1386

db2 terminate

db2 connect to sample

就可以成功連接了。

第二種分類方案是按照問題的范圍和性質進行分類。分類如下:

1. 數據庫實例問題

2. 數據庫問題

3. 數據庫性能問題

4. 應用開發與數據庫有關的問題

下面對每一類問題進行詳細說明。

一、數據庫實例的問題

數據庫實例問題可以分為兩種情況

1. 實例無法啟動,運行db2start後,直接返回錯誤碼,如SQL1042C。

如果根據錯誤碼信息無法解決,可以嘗試如下方案:

重新更新該實例,以root身份登錄,

cd /usr/opt/db2_08_01/instance/

./db2iupdt <inst_name>

Tip:常見的產生實例無法啟動的原因

數據庫安裝了新的補丁後沒有運行db2iupdt

數據庫文件的權限被改成了777,數據庫文件的權限是有要求的,所以不能將所有的文件都改成777的權限

數據庫實例文件被刪除或損壞

主機名與db2nodes.cfg裡記錄的不一致

2. 運行db2start時,hang在那裡,既不報錯,也無法啟動實例

這種情況一般是由於實例沒有正常的停止造成的,一般運行下列命令可以解決:

su - <inst_owner>

db2_kill

ipclean

su – root

(將所有的與該實例有關的db2進程殺死 kill -9 <pid>)

然後重新啟動實例。

3. 數據庫實例崩潰問題

遇到實例崩潰的問題,首先查看db2diag.log,根據裡面的信息來分析數據庫宕機的原因。再看db2dump目錄中是否有trap文件。可以根據這些信息來分析原因,一般這類問題都需要IBM工程師協助解決。

宕機的原因可以分為兩類,一類是數據庫的BUG,即數據庫的缺陷引起的,一般如果遇到了數據庫的缺陷,都有臨時的解決方案,或者通過安裝最新的補丁來解決,對某些問題IBM也提供臨時的修訂來解決需要付費)。另一類是操作系統,誤操作等非產品問題導致的,對非產品問題導致的宕機盡量要避免。

Tip:常見的數據庫宕機原因

系統的交換空間paging space)用盡

數據庫的某個進程被kill

二、數據庫問題

1.數據連接問題

無法連接數據庫,常見的錯誤有代碼頁錯誤,通訊協議錯誤,數據庫狀態錯誤等。

對代碼頁類錯誤,可以通過設置db2codepage,db2country來解決,這兩個變量需要用db2set 設置成與數據庫一致的值。

當發生通訊類錯誤時,首先要要檢查環境變量DB2COMM=TCPIP是否已經設置,然後要檢查dbm cfg的SVCENAME,該變量可以直接設置成端口號,或者設置成服務名,該服務名要在services文件中設置成對應的端口號。要檢查該端口號是否已經被其他服務占用。在啟動數據庫後,可以運行netstat –an |grep <port>,來查看該端口處於的狀態。

TCP 0.0.0.0:50000 0.0.0.0:0 LISTENING

還有一種情況,當連接數據庫時,數據庫處於backup pending 狀態,無法連接。這是只要對數據庫做一個備份就可以了。

Tip:通常導致數據庫處於備份贊掛的原因

當一個數據庫從循環日志改成歸檔日志時,數據庫要求進行一次脫機備份,在重新啟動數據庫後,數據庫就處於備份贊掛的狀態

對於一個使用線形日志的數據庫,當做load時,表空間會處於備份贊掛的狀態,為了避免這種情況,load命令需要使用copy yes,或者nonrecoverable參數。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved