乙個sqlserver資料庫會處於很多種狀態,例如 online 、restoring 、recovering 、recovery_pending 、suspect、emergency 、offline等等。
只有在online的狀態下,資料庫才能被正常訪問。
下圖主要反映了資料庫的主要狀態之間的切換路徑
下面說一下這些狀態:
recovering:
sqlserver正做資料庫修改的時候,是先寫日誌,然後再修改記憶體中的資料頁。至於硬碟上的資料頁內容,將在檢查點或者是sqlserver做lazy write的時候
完成。所以在大部分時間,都會有一些硬碟上的資料不是最新的版本。如果資料庫在這種時間點被關閉,下次sqlserver重新開啟資料庫的時候,為了維護資料庫
的一致性,sqlserver必須做兩件事情:
1、重做redo
2、回滾和撤銷 undo/rollback
在上次資料庫被關閉的時候,可能有一些修改已經在資料頁上完成,但是事務本身沒有提交。對於這些做到一半的事務,sqlserver一律回滾,以保證資料庫事務的
一致性。所以磁碟裡被改過的資料還要再改過來。
做這兩件事情的過程,叫做資料庫恢復。只有經過恢復的資料庫,才能保證是乙個「一致的」資料庫,才能被安全地訪問。
從圖中可以看出,下面的動作會讓sqlserver決定對資料庫做恢復
(1)create:建立新資料庫
(2)alter online:讓資料庫上線
(3)restore with recovery:以recovery方式恢復乙個資料庫
(4)database startup:啟動資料庫,
恢復如果能夠正常完成,那麼資料庫將進入online狀態。
如果恢復動作因為有些資源不能訪問而失敗,例如某個資料檔案或者日誌檔案打不開等等,資料庫會進入recovery pending狀態。
如果恢復因為資料檔案或者日誌檔案裡的內容損壞而失敗,例如sqlserver要做重做,但是日誌檔案裡相應的日誌資訊讀不出來;
或者要做撤銷,去修改資料檔案裡的頁面,卻發現頁面裡的資料不是想象中的那樣,那麼資料庫會進入乙個很有名的狀態:可疑(suspect)。
online:
這種狀態下,資料庫可以被普通使用者訪問,可以被查詢和修改。只有一種方法能夠使資料庫進入online狀態,那就是成功地恢復。
sqlserver通過這種機制保證資料庫的一致性。
乙個online的資料庫在管理員發出"alter offline"命令後,可以進入offline狀態。在管理員發出「restore」命令後,可以進入restoring狀態
recovery pending:
如果資料庫在做恢復的時候不能正常開啟所有的資料庫檔案,資料庫會進入recovery pending狀態。在這個狀態下管理員有兩種選擇,
要不用alter online命令使sqlserver做一次上線,要不就只能放棄當前資料庫,還原備份。
suspect:
當資料庫做恢復的時候由於資料檔案或者日誌檔案裡的損壞而失敗,資料庫會進入suspect狀態。在這個狀態下管理員只有3種選擇。
(1)再做一次alter online ,讓sqlserver再做一次恢復
(2)放棄當前資料庫,還原備份
(3)將資料庫狀態設定為emergency,繼續嘗試修復資料庫
emergency:
緊急模式。這個狀態下,sqlserver對沒有完成恢復的資料庫開放乙個唯讀視窗,供管理員在沒有備份的情況下盡可能地挽救資料。
restoring:
資料庫正在做恢復。在任何狀態下,管理員都能去恢復資料庫。在with recovery的模式下,恢復資料庫的最後一步,資料庫進入recovering狀態。
offline:
資料庫離線狀態。這時候資料庫也不能被訪問。管理員可以使用alter online命令,讓資料庫開始恢復,從而進入online狀態。
SQLSERVER資料庫主要狀態和切換路徑
乙個sqlserver資料庫會處於很多種狀態,例如 online restoring recovering recovery pending suspect emergency offline等等。只有在online的狀態下,資料庫才能被正常訪問。下圖主要反映了資料庫的主要狀態之間的切換路徑 下面說...
SQLServer收縮資料庫
以下語句用於設定資料庫定時自動收縮資料庫 use master gosp dboption testdb,autoshrink true gouse testdb gocheckpoint go 清空日誌語句 dump transaction testdb with no log 截斷事務日誌 ba...
SQL Server資料庫檢修
使用資料庫的過程中,由於斷電或其他原因,有可能導致資料庫出現一些小錯誤,比如檢索某些表特別慢,查詢不到符合條件的資料等.出現這些情況的原因,往往是因為資料庫有些損壞,或索引不完整.在access中,有個修復資料庫的功能可以解決這個問題,在sql企業管理器,沒有這個功能,要用語句來完成,下面就介紹如何...