国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

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

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

2016-10-07 08:19:47 7715

<1>主文件組問題

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

我們先來看數(shù)據(jù)庫:

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

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

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

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

解決方案

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

 

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

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

解決方案

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

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

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

 

<2>輔助文件組問題

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

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

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

解決方案:

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

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

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

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

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

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

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

 

<3>日志文件組

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

解決方案:

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

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

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

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

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

 

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

 

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

然后我們執(zhí)行CHECKDB命令,進行數(shù)據(jù)庫的修復

DBCC CHECKDB(CnblogsTestDB,REPAIR_ALLOW_DATA_LOSS)
GO

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

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

所以酌情考量。

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

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

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


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

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

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

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