說明:災難恢複系列的文章是由 Robert Davis 寫的,發布在SQLSoldier, 個人認為挺不錯的,所以根據自己的理解,邊測試邊整理,並非直接翻譯,如有不準確,歡迎指正。
本篇進入資料庫災難恢複第二篇,主要討論還原包含Database Backup的還原時的保護措施,特別是當你拿到一個包含Database Backup,但沒有人告訴你他是一般資料庫還是包含資料庫時,它本身會是一個什麼樣的保護措施呢?
還原包含資料庫:
當我瞭解到包含性資料庫,我第一個擔心的問題是,作為一個dba如何阻止那些沒有專業知識的人來訪問資料庫呢?還好,已經有三個保護層面了。
第一層保護:
在還原一個包含資料庫或建立一個包含資料庫之前,或者之前已經存在一個包含資料庫,那麼在伺服器層級的包含選項必須要啟動。如果伺服器層級不啟動包含選項,那麼是完全的保護。你可以通過sp_configure或者通過伺服器屬性,它在進階選項裡,不過他不是一個真的進階選項,所以在你修改或查看伺服器層級包含選項時不需要開啟Show advanced options選項。
如果要查看是否開啟了伺服器層級的包含選項,也可以查詢sys.configurations這個系統資料表,用它的好處就是可以自動化指令碼,如果要修改,還是需要用sp_configure。
如果在沒有啟用包含選項的伺服器執行個體上還原一個包含資料庫,將會失敗並返回下面的資訊:
Msg 12824, Level 16, State 1, Line 1The sp_configure value 'contained database authentication' must be set to 1 in order to restore a contained database. You may need to use RECONFIGURE to set the value_in_use.Msg 3013, Level 16, State 1, Line 1RESTORE DATABASE is terminating abnormally.
這個資訊告訴你需要先啟用伺服器層級包含選項才能還原,對於DBA來說,這是一個警告,是否啟用這個包含選項由你自己決定,並不是看到這樣的資訊就一定要去啟用,因為可能會影響伺服器或資料庫的安全。
開啟或禁用包含資料為選項命令為,注意,這裡是Reconfigure,不是Reconfigure WITH OVERRIDE,這裡有一個重要的原因,後面對提到。
-- Enable "contained database authentication"Exec sp_configure 'contained', 1;Reconfigure;-- Disable "contained database authentication"Exec sp_configure 'contained', 0;Reconfigure;
通過圖形介面:
第二層保護:
如果你啟用了包含資料庫選項,那麼當還原一個包含資料庫時,不會有任何警告或是提示。只能由你自己來確定還原的資料庫是不是包含資料庫,幸運的是,有一個內建的結構可以知道這點,在SQL Server 2012,當你執行RESTORE HEADERONLY時有一個新的列被增加,它就是Containment ,當它為1時,表明是包含資料庫,反之則不是,如我對一個包含資料庫做的檢查:
最後一層保護:
假設有這樣一個災難恢複情境,你需要儘快的恢複一個資料庫上線,但是當你把它還原到一台替代伺服器上時,你發現它是一個包含資料庫。現在讓我們假設你還沒有意識到已經啟用了這個設定,而且就你的能力和可以查閱的文檔,你會認為這個資料庫沒有使用包含使用者,再者,假設可能有一些法規或者安全性原則,在沒有確切有效文檔支援情況下,不能有包含使用者,但是你可能暫時沒有時間去找到相關人去解釋為什麼存在包含使用者,現在你又需要儘快的恢複資料庫又要遵守安全性原則。
在這種情況下,你可以做的就是先啟用包含資料庫選項,再恢複資料庫,然後再禁用掉。
在禁用時,會報錯,需要我們使用WITH OVERRIDE,這其實就是最後一個保護,這就是之前用Reconfigure而不用Reconfigure WITH OVERRIDE的原因。
-- Disable "contained database authentication"Exec sp_configure 'contained', 0;Reconfigure;
Configuration option 'contained database authentication' changed from 1 to 0. Run the RECONFIGURE statement to install.Msg 12818, Level 16, State 1, Line 3RECONFIGURE failed. Attempting to change the 'contained database authentication' value to 0 while there are existing contained databases requires a RECONFIGURE WITH OVERRIDE.
-- Force disabling of "contained database authentication"Reconfigure With Override;
Command(s) completed successfully.
總結:
三層保護按我個人理解應該就是:伺服器層級的contained啟用、RESTORE HEADERONLY可以確認是否為包含資料庫、禁用時如果用Reconfigure,那麼存在包含庫就會有警告。作為DBA來講,有責任理清這些,DBA是應該是第一道防護,其次才依靠這三個防護。
SQL Server 災難恢複31天之第3天:在還原資料庫時確定需要哪些備份檔案