Showing posts with label SQLSvr. Show all posts
Showing posts with label SQLSvr. Show all posts
Wednesday, August 25, 2010

Error: 5243: An inconsistency was detected during an internal operation.

Environment: WinServer2008 SP2+SQL Server 2008

昨天檢查SQL Server的時候在記錄檔裡看見一整串長相不凡的訊息... 大概長這樣:

ex_raise2: Exception raised, major=52, minor=43, state=8, severity=22, attempting to create symptom dump
Using 'dbghelp.dll' version '4.0.5'
***Stack Dump being sent to D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\LOG\SQLDump0001.txt
... (略)
錯誤: 5243,嚴重性: 22,狀態: 8。
An inconsistency was detected during an internal operation. Please contact technical support.

最明顯的訊息大概就最後兩行了吧... 另外一個dump file內容更是人類無法閱讀=   =,明顯是要給機器讀的。

先是找到這篇: M$技術支援, Article ID:828337: An assertion or Msg 7987 may occur when an operation is performed on an instance of SQL Server.
標題看起來不怎麼有關係,不過內容確實有一些蛛絲馬跡。最早在SQL Server2000執行SELECT或UPDATE之類的transact-SQL時,就可能會有3624的錯誤訊息,而同樣的錯誤在SQL Server2005, 2008則是錯誤5242或5243。

造成5242/5243錯誤的原因只有簡單一小行: The problem may occur if inconsistencies exist in the databases on the instance of SQL Server....
還好相當有良心的還有solution..

  1. On the instance of SQL Server where the failure occurred, run the DBCC CHECKDB Transact-SQL command on all the databases.
  2. If the DBCC CHECKDB Transact-SQL command reports errors that indicate database inconsistencies, resolve the errors.

哈哈哈(乾笑三聲)... 一點都沒有好人做到底,送佛送到西的精神XD,連CHECKDB都不認識請參閱這兒(2000)或這兒(2008)。

所以就找了時間針對SQL Server裡的每個資料庫跑了下面這串指令。

DBCC CHECKDB(‘DB_NAME’) WITH ALL_ERRORMSGS;

(如果資料庫真的相當龐大,建議加個PHYSICAL_ONLY選項..)
結果每個資料庫的檢查結果都正常@_@a.. 雖然是個好消息,不過還是滿令人錯愕的阿XD 資料庫不會平白無故地耍人吧OTZ,所以不死心又多看了幾篇文章,終於,Paul S. Randal先生(SQL Server MVP, 撰寫2005 DBCC CHECKDB的人,這篇文章最後有簡介)給了個比較讓人釋懷的說明

基本上5242跟5243是一樣的錯誤,不過5242會明確指出資料庫的哪個地方出了問題,5243卻是不明原因,資料庫無法指出的錯誤所丟出來的。雖然記錄檔紀錄了相關的訊息,這中間有可能其他的維護作業重建了索引,currupt pages被釋放,所以事後跑checkdb就看不出有任何錯誤。

大致上就這樣囉~

Ref:

  1. Microsoft Support KB828337
  2. MSDN: DBCC CHECKDB (SQL Server2008)
  3. Corruption errors: Msg 5242, Level 22
Thursday, September 24, 2009

Reporting Server 2005 異機升級至2008

前陣子做了WSS的SQL SERVER搬家兼升級(2005 to 2008_x64)作業,可是不知道為什麼,搞了很久一直沒辦法好好的把reporting server一起弄過去,裡面有幾張報表,不過都是去撈Oracle資料庫的資料。

遇到的主要問題是:
1. 資料庫部分備份出來後,還需要備份加密金鑰,可是還原的時候加密金鑰的密碼一直打不過XD
2. 新主機上明明就裝了oracle client,可是測試報表時一直抱怨無法連接資料庫,用sqlplus又可以連

因為一直搞不定,所以就擱著不理他,沒想到上禮拜心血來潮找到了一篇相關的文章,照著做就成功了!! 可是該做的當初明明都做過XDD 整個莫名其妙~

moving reporting server 2005 to reporting server 2008
  1. 分別備份ReportServer與ReportServerTempDB兩個資料庫,用SQL Server Management Studio做就行了,步驟就不描述
  2. 開啟"Reporting Services組態管理員"(Microsoft SQL Server 2005>組態工具 下),點選"加密金鑰"頁籤,將加密金鑰備份出來
  3. 到新主機(SQL Server2008)上,利用"SQL Server Configuration Manager"(Microsoft SQL Server 2008>組態工具 下) 將Reporting Service服務停止
  4. 用SQL Server Management Studio分別還原ReportServer與ReportServerTempDB兩個資料庫(Restore With Recovery),步驟略
  5. 同步驟3,再將Reporting Service服務開啟
  6. 開啟"Reporting Services組態管理員"(Microsoft SQL Server 2008>組態工具 下)將金鑰還原
  7. 完工!!
Oracle client的部分真的是沒理他,也沒重開機,自己就忽然可以動了= = 就這樣~

Ref:

Thursday, July 23, 2009

"Performance counter registry hive consistency check" while installing SQLServer 2008

昨天在一台"全新"的WinServer 2008上準備安裝SQL 2008,前面會先進行一些檢查,結果還是遇到一些問題。主要是下面這一項無法通過檢查:
效能計數器登錄區一致性失敗(英文版的訊息如title)

點選後可以看見詳細"一點點點點"的訊息如圖:

勤勞一點的人可能就會循著訊息給的網址去一探究竟,是一篇主要教你做三個動作的文章:
  1. Rebuild the base performance counters
  2. Re-add the extensible counters
  3. Reinstall any custom .NET Framework assembly performance counters
它有英文版中文版,強烈不建議看中文版XD 機器翻的超奇怪。不過說真的,這篇文章對我個人似乎沒什麼幫助,相當遺憾。

先來說說這個訊息到底是要表達啥鬼好了。中文的話,了解了之後跟字面上的意思的確滿接近的XD,登錄區指的就是註冊表... 裡面有某些值因不明原因變的不一樣了,that's all.
根據 Ref #1 裡的敘述就是這兩對值:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
下的Last Counter還有Last Help
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009
下的Counter還有Help(這兩個是多字串值,分別看他們最後一組數字)

其實我看到90%的文章都說只要以 ...\Perflib\009這組值為準,把 ...\Perflib的Last Counter還有Last Help改成一樣就好。但是大家都不說,前提是你的作業系統是英文版的... = =
其實我的 ...\Perflib底下不只有\009還有一個\0404,但是\0404裡只有一個(預設值),沒有Counter跟Help,於時我就試著在\0404下替他新增這兩個多字串值,內容跟...\Perflib\009的一樣。就搞定了...

順便聊聊,很多人的中文版好像不是\0404而是\004,超奇怪的= =,我一直不知道這個數字是哪裡來的,不過有看到其他人再教怎麼找出這個數字(請參閱Ref #2)。只要隨便開個console程式,跑一行程式即可。

string str2 = string.Format("{0,3}", CultureInfo.InstalledUICulture.Parent.LCID.ToString("X")).Replace(" ", "0");
跑出來的數字就是所謂的LCID(Locale ID),請見Ref列表,而0404就是Chinese - Taiwan。

以上~ 下台一鞠躬。

Ref:

Tags