博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

说明:灾难恢复系列的文章是由 Robert Davis 写的,发布在SQLSoldier 个人认为挺不错的,所以根据自己的理解,边测试边整理,并非直接翻译,如有不准确,欢迎指正。

 

本篇进入数据库灾难恢复第二篇,主要讨论还原包含数据库备份的还原时的保护措施,特别是当你拿到一个包含数据库备份,但没有人告诉你他是一般数据库还是包含数据库时,它本身会是一个什么样的保护措施呢?

还原包含数据库:
当我了解到包含性数据库,我第一个担心的问题是,作为一个dba如何阻止那些没有专业知识的人来访问数据库呢?还好,已经有三个保护层面了。

第一层保护:
在还原一个包含数据库或创建一个包含数据库之前,或者之前已经存在一个包含数据库,那么在服务器级别的包含选项必须要启动。如果服务器级别不启动包含选项,那么是完全的保护。你可以通过sp_configure或者通过服务器属性,它在高级选项里,不过他不是一个真的高级选项,所以在你修改或查看服务器级别包含选项时不需要开启Show advanced options选项。

如果要查看是否开启了服务器级别的包含选项,也可以查询sys.configurations这个系统表,用它的好处就是可以自动化脚本,如果要修改,还是需要用sp_configure。

如果在没有启用包含选项的服务器实例上还原一个包含数据库,将会失败并返回下面的信息:

Msg 12824, Level 16, State 1, Line 1
The 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 1
RESTORE 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 3
RECONFIGURE 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天:在还原数据库时确定需要哪些备份文件