SQLSERVER啟動不起來(錯誤9003)的解決方案分享_MsSql

來源:互聯網
上載者:User

先說一下環境

客戶環境:Windows2003企業版SP2 32位 SQL2005企業版 32位 SP4
自己膝上型電腦環境:Windows7 SP1  32位  SQL2005個人開發人員版 32位
我的筆記本電腦的電腦名稱:joe
客戶電腦的電腦名稱:hs

客戶那邊的master資料庫大小:幾MB
業務系統是winform系統
客戶的環境是單機系統沒有使用到域
網路環境:客戶那邊的網速比較慢,用遠程協助的時候比較卡
為什麽要說明我自己膝上型電腦的環境呢?請大家繼續耐心看下去

檢查

先開啟SQLSERVER組態管理員,啟動SQLSERVER,發現SQLSERVER啟動不起來

於是我開啟Windows EventLog,發現了下面錯誤

複製代碼 代碼如下:

SQLSERVER 錯誤9003:LSN無效(日誌掃描號無效)
"傳遞給資料庫 'master' 中的日誌掃描操作的日誌掃描號 (2806:120:1) 無效。
此錯誤可能指示資料損毀,或者記錄檔(.ldf)與資料檔案(.mdf)不匹配。
如果此錯誤是在複製期間出現的,請重新建立發布。否則,如果該問題導致啟動期間出錯,請從備份還原。

於是我就在自己的電腦上百度了一下這個錯誤
搜尋到這篇文章:sql server 錯誤9003:LSN無效(日誌掃描號無效),對資料庫的修複
這篇文章裡的資料庫是使用者資料庫,用rebuild log,dbcc checkdb解決了問題
悲催的是客戶那邊損壞的是master資料庫

想辦法
作為一個好的資料庫工程師,一定要快速知道有哪些方法可以解決當前客戶的問題
這些方法有什麼利弊,因為延遲一秒鐘,就會造成客戶更多的損失,客戶的業務系統無法正常運作,後果可想而知

 

由下面幾個因素,我作出了一個選擇
網速比較慢,不方便在客戶的電腦上寫SQL語句
業務系統是winform系統

 選擇:以前專案經理教我的一個方法,遇到SQLSERVER啟動不起來
可以用剛剛安裝好的SQLSERVER的master資料庫替換掉客戶那邊的master資料庫

 

這種方法有下面的弊端

(1)你所用的資料庫版本一定要和客戶的一樣
(2)將SQLSERVER2012的master資料庫給客戶是不行的
(3)伺服器觸發器,認證,連結的伺服器,登入使用者等資訊會丟失

為什麽會有這些弊端,大家可以看一下下面的文章
SQL Server 2008中的Service SID 介紹

複製代碼 代碼如下:

【SERVICE SID的引入】
NT SERVICE\MSSQL$KATMAI, NT SERVICE\SQLAgent$KATMAI和NT SERVICE\ClusSvc 其實都是Service SID所對應的名字。
Service SID的引入,是為瞭解決多個Service可能同用一個service帳號所帶來的安全隱患。
如IIS 使用Network Service帳號,可能其他服務也使用Network Service帳號。
為了使得IIS能夠串連到SQL Server, 我們可能會把Network Service作為SQL Server的login, 但是這是不安全的。
因為其他服務如果以Network Service做為啟動帳號的話,也能訪問SQL Server。
為瞭解決這個問題,在SQL Server 2008/Windows Server 2008及以後,
我們有了SID這個概念,這樣,不同的服務,即使服務啟動帳號是相同的,它們的SID也是不同的。

因為登入使用者的機制在SQLSERVER2008的時候發生了變化,所以你所用的資料庫版本不和客戶的一樣是不行的
但是就算一樣,也有弊端,客戶的登入使用者原本是下面的樣子

複製代碼 代碼如下:

builtin\administrators
hs\administrators
hs\SQLServer2005MSFTEUser$hs$MSSQLSERVER
hs\SQLServer2005MSSQLUser$hs$MSSQLSERVER
hs\SQLServer2005SQLAgentUser$hs$MSSQLSERVER


但是如果我把自己的master資料庫給客戶的話,就會變成下面的樣子
如果客戶的業務系統是B/S系統,會用到IIS,或者客戶的環境是域環境,
登入SQLSERVER需要使用Windows登入驗證不是SQL登入驗證,那麼這樣做就很麻煩了
還有一個我自己電腦的SQLSERVER是個人開發人員,客戶的是企業版,不過之前也這樣做過,發現沒有什麼問題

開始實施

弊端說完了,開始實施了

第一步:先把我自己膝上型電腦上的SQLSERVERD 所有使用者資料庫全部分離,

刪除一些安裝時候沒有的登入使用者只保留預設的登入使用者,停止自己電腦的SQL服務,然後把master.mdf和mastlog.ldf複製出來,發給客戶

第二步:使用遠程協助,把客戶電腦裡的master資料庫master.mdf檔案改名為master22.mdf

mastlog.ldf檔案改名為mastlog22.ldf

然後把發過來的master資料庫放進去data檔案夾裡

第三步:啟動SQLSERVER,由於當時沒有截圖,這裡就不放截圖了,這時候可以發現SQLSERVER成功啟動了

第四步:把我們的業務庫重新附加進來

第五步:刪除原來業務庫裡的那個資料庫使用者gxhtsyrain

第六步:建立登入使用者gxhtsyrain並且映射到我們的業務庫

第七步:禁用sa使用者

由於不是替換msdb資料庫,所以維護計劃沒有丟失


錯誤記錄檔

我查看SQL ERRORLOG,發現了下面的錯誤

無法啟用資料庫 "msdb" 中的 Service Broker,因為master與msdb 的 Service Broker 的ID不一樣

NT AUTHORITY\SYSTEM登入失敗

由於我們沒有用到 Service Broker技術,所以“無法啟用資料庫 "msdb" 中的 Service Broker”這個錯誤可以忽略

而NT AUTHORITY\SYSTEM登入失敗,在文章SQL Server 2008中的Service SID 介紹中說到

複製代碼 代碼如下:

但是我們也不能認為有這幾個SID的帳號,就能隨便把其他的登入如NT AUTHORITY\SYSTEM給刪除。

某些應用,如VSS Writer,Windows自動更新等,還是需要用服務啟動帳號來進行處理。

如果客戶那邊有做SQLSERVER的系統資料庫備份

我會這樣做:

第一步:先備份我自己膝上型電腦裡的master資料庫出來

第二步:將客戶那邊的master.bak拿到自己的電腦裡

第三步:還原客戶的master.bak到自己的SQLSERVER

第四步:停止SQL服務,然後把master.mdf和mastlog.ldf複製出來發送給客戶

第五步:把客戶電腦裡的master資料庫master.mdf檔案改名為master22.mdf,mastlog.ldf檔案改名為mastlog22.ldf

第六步:然後把發過來的master資料庫放進去data檔案夾裡

第七步:啟動SQLSERVER

總結

其實除了備份使用者資料庫之外,系統資料庫的備份也是很重要的
我們需要備份master和msdb這兩個資料庫
我們當時部署業務系統的時候沒有備份系統資料庫,其實也是一個反面教材
我的方法是基於我們的業務系統使用到SQLSERVER的功能就只有維護計劃,所以作出上面的的解決方案
如果用到很多SQLSERVER的相關技術的話,可能我的解決方案不是最好的
我也希望大家能夠提出您的意見和見解,或者您使用的方法比我還要好,更快速

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.