久久青草精品A片狠狠,日韩欧美视频一区二区,亚洲国码AV日韩,国产精品黄在

幫助中心 >  技術知識庫 >  數據庫 >  相關技術支持 >  SQL Server數據庫啟動過程(用戶數據庫加載過程常見問題)第二部分

SQL Server數據庫啟動過程(用戶數據庫加載過程常見問題)第二部分

2016-10-07 08:19:47 6757

<1>主文件組問題

當不能訪問主文件組文件的時候,也就是上面的CnblogsTestDB.mdf文件,會報如下錯誤:

我們先來看數據庫:

在實例啟動的過程,恰巧有一個庫顯示了上面我們提到的一個狀態:RECOVERING(恢復中),我順便把圖給截圖了,當然出現這個情況很正常,有時候刷新一下就正常,其它用戶庫沒有顯示是因為庫太小,恢復時間太短,我們捕捉不到。

我們來看,上我們建立的測試庫CnblogsTestDB已經不能訪問了,我們來看一下Error中的錯誤信息:

錯誤信息很明顯,說這個該文件不能訪問,并且確切的說出了這個為操作系統錯誤,那我們看操作系統的錯誤記錄:

可以看到在Windows系統日志中也能看到該部分錯誤信息。

解決方案

此問題的解決方法還是很簡單的,一般主要是因為權限問題,只需要將數據庫管理員賬戶組,提權到可讀寫權限就可以,然后重啟服務:

 

上面的情況是找到數據庫文件,但是不能打開數據庫文件,當然還有可能是直接找不到數據庫文件,系統會報出如下錯誤:

會給出17204錯誤,報找不到文件錯誤

解決方案

a、如果能找到數據文件最好了,拷貝到錯誤制定的路徑下既可以,然后重啟實例

b、不能找到文件了,那就得只能刪除該庫,重新新建同名庫?從備份文件中還原

一般上述問題發生在物理存儲出現了故障,當然不排除某些軟件操作,比如殺毒軟件、還有人為誤刪等原因。如果沒有備份,這可能是一個很大的遭難,基本可以確定的完全還原的可能性不高!所以記住:備份數據庫的重要性!

 

<2>輔助文件組問題

上面的出現問題的文件為數據庫的主文件組,當我們數據庫在承載到一定數據量的情況下,我么采取多個輔助文件組來容納數據,下面我們來看一下輔助文件組的問題:

同樣的提示的輔助文件組不能正常打開,或者找不到相關的輔助文件組,遇到這樣的問題我們怎么解決呢?

其實SQL Server數據庫輔助文件存儲的主要為數據庫的數據內容信息,關于本庫的一些架構信息是放在主(primary)文件組中,所以我們可以先這樣

解決方案:

a、我們將打不開或者不能訪問的數據庫文件(輔助文件)設置成離線,然后先將能夠正常的數據文件上線,確保除了損壞的那部分文件的其它庫信息能正常訪問,我們通過以下代碼更改:

ALTER DATABASE CnblogsTestDB MODIFY FILE(NAME=CnblogsTestDB2,OFFLINE)
GO
ALTER DATABASE CnblogsTestDB set ONLINE
GO

這樣,我們刷新下數據庫,既可以正常訪問正確的數據信息:

當我們處于生產環境中,生產庫不能正常啟動的時候,此刻的火燒眉毛的時刻,采取上面的方法先確保一部分數據能正常訪問也不失為一種緩議之計。

下面的步驟就是找到該輔助文件,并且確保有正常的權限訪問,更重要的是找到的輔助文件不能是損壞的,然后拷貝至錯誤文件中給出的路徑,然后重啟實例,上線該庫。

b、當然大部分情況下,我們找不到該文件,或者這個文件已經損壞,那就得采取第二種方案,通過備份還原,根據以往的經驗,建議采取的措施是:

先將能訪問的數據庫做一次備份,然后通過文件組恢復的方式,恢復上面出問題的文件組。

 

<3>日志文件組

其實從市面上的所有數據庫而言,其本身所有的機制都是通過先寫日志,然后通過一個進程后寫入(lazy write)方式寫入到磁盤,這種方式是為了避免IO的阻塞,因為我們都知道磁盤IO這個問題一直是所有文件讀寫的最大瓶頸。

所以,日志文件是數據庫不可分割的一部分。當數據庫在啟動的過程,會通過日志中的記錄做一次數據的一致性校驗,文章的開端有介紹。

所以說,如果日志文件不能訪問,或者說出問題,那我們的SQL Server數據庫出現什么問題呢?

我們先來看數據庫模式為簡單(SIMPLE)模式的,我將咱們的測試庫設置成簡單模式:

USE CnblogsTestDB
GO
ALTER DATABASE [CnblogsTestDB] SET RECOVERY SIMPLE WITH NO_WAIT
GO

然后我們停掉實例,然后刪除掉該庫的日志文件,然后重新啟動

可以看到處于簡單模式下,如果日志文件出現錯誤,在啟動的過程是不會發生任何問題的,這里的原因我們在啟動Error日志文件中能找到答案:

經過上面的日志分析,我們可以看到,當數據庫處于簡單模式下,數據庫在啟動的過程中,如果發現任何與日志相關的信息,則會重新創建一份日志文件,保證數據庫的正常訪問。

如果這樣那我們數據庫的完整性怎么保證呢,是這樣,如果數據庫處于簡單模式,在我們數據庫關閉的時候,系統會先將該提交的所有事務都寫入到磁盤中去,所有該回滾的就撤銷。

上面能正常創建數據庫日志文件的前提條件有兩條:1、數據庫為簡單模式;2、數據庫正常關閉,保證事務都已正常寫入磁盤

 

下面我們在看?如果恢復模式為“完整”模式下的,數據庫上次沒有正常的情況,SQL Server數據庫是如何處理的,

我們先將數據庫改成完整恢復模式,停掉實例,然后刪除日志,然后啟動

然后我們啟動,可以看到這個時候,數據庫不能正常訪問的,該錯誤的Error的日志信息為:

windows平臺下也為我們記錄了該錯誤的日志信息:

其實出現上面的錯誤,很正常,因為有些數據庫的事務性操作已經記錄到事務日志中,還未寫入磁盤數據頁中,這時候發生了宕機,或者非正常關閉,這個對SQL Server數據庫是能應付的,但是,而在啟動的過程找不到相關的事務日志盡心回滾和寫入操作,所以該庫的數據時非一致性的,所以SQL Server是不讓我們使用該庫,出現此種錯誤,我們的解決方式有如下幾種:

解決方案:

a、如果有備份,最好最快的方式就是恢復數據庫備份或者找到了該日志文件拷貝到錯誤路徑下(推薦

b、如果沒有備份,我們只能通過使用CHECKDB命令修復數據庫(不推薦

上述解決方案中CHECKDB命令,是一種萬不得已的方式?而且,我可以明確的告訴你這命令使用的時候會可能造成數據丟失,并且在大數據庫中,運行周期很長!

當然在萬不得已的情況下,我們還的采取,過程如下:

我們先將數據庫設置成EMERGENCY(緊急)模式,并且為單用戶(SINGLE_USER)模式

 

USE CnblogsTestDB
GO
ALTER DATABASE CnblogsTestDB SET EMERGENCY
GO
ALTER DATABASE CnblogsTestDB SET SINGLE_USER
GO

 

經過我們上面的設置,將庫設置成了“緊急”模式,并且只為單用戶方式訪問,便于我們進行數據?復

然后我們執行CHECKDB命令,進行數據庫的修復

DBCC CHECKDB(CnblogsTestDB,REPAIR_ALLOW_DATA_LOSS)
GO

經過該命令的修復,數據庫會為系統新建一個日志,但是不能保證事務的一致性,也就是說會因此而丟失數據,所以非常不推薦的一種方式!

并且,在這過程中,如果是大數據庫的話,該修復過程會很漫長,當然我不能給出一個漫長參考值,因為這過程還有會出現其它的錯誤需要修復。

所以酌情考量。

當然,在恢復完成之后,不要忘記將數據庫改回多用戶模式

USE [master]
GO
ALTER DATABASE [CnblogsTestDB] SET  MULTI_USER WITH ROLLBACK IMMEDIATE
GO

至此,這個有問題的庫就能夠正常訪問了。


提交成功!非常感謝您的反饋,我們會繼續努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務,我們很需要您進一步的反饋信息:

在文檔使用中是否遇到以下問題: