SQLSERVER數據庫主要狀態和切換路徑
一個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狀態。
從上面可以看出,恢復是數據庫進入在線狀態的關鍵步驟。如果這一步失敗,數據庫就沒有辦法被使用!!