6.2 分离和附加数据库

如果要将数据库更改到同一计算机的不同SQL Server实例或要移动数据库,分离和附加数据库会很有用。用户可以分离数据库的数据和事务日志文件,然后将它们重新附加到同一或其他SQL Server实例。

在64位和32位环境中,SQL Server磁盘存储格式均相同。因此,可以将32位环境中的数据库附加到64位环境中,反之亦然。从运行在某个环境中的服务器实例上分离的数据库可以附加到运行在另一个环境中的服务器实例。

建议不要从未知源或不可信源附加或还原数据库。此类数据库可能包含执行非预期T-SQL代码的恶意代码,或通过修改架构或物理数据库结构导致错误。在使用未知源或不可信源中的数据库之前,请在非生产服务器中对数据库运行DBCC CHECKDB,同时检查数据库中的代码。

6.2.1 分离数据库

分离数据库是指将数据库从SQL Server实例中删除,但使数据库在其数据文件和事务日志文件中保持不变。之后,就可以使用这些文件将数据库附加到任何SQL Server实例,包括分离该数据库的服务器。如果存在下列任何情况,就不能分离数据库。

(1)已复制并发布的数据库。如果进行复制,数据库就必须是未发布的。必须通过运行sp_replicationdboption禁用发布后,才能分离数据库。

(2)数据库中存在数据库快照。必须首先删除所有数据库快照,然后才能分离数据库。

(3)该数据库正在某个数据库镜像会话中进行镜像。除非终止该会话,否则无法分离该数据库。

(4)数据库处于可疑状态。

(5)该数据库是系统数据库。

确定了能够分离数据库后,用户可以通过SQL Server Management Studio进行分离,其具体操作步骤如下。

步骤01 在SQL Server Management Studio对象资源管理器中连接到SQL Server数据库引擎的实例,然后展开该实例。

步骤02 展开【数据库】,并选择要分离的用户数据库的名称。

步骤03 右击数据库名称,单击【任务】|【分离】菜单项,如图6.3所示。

图6.3 分离数据库

步骤04 将出现【分离数据库】对话框,如图6.4所示。

图6.4 【分离数据库】对话框

步骤05 分离数据库准备就绪后,单击【确定】按钮。

6.2.2 附加数据库

通过SQL Server Management Studio,用户同样可以附加复制的或分离的SQL Server数据库。例如,当将包含全文目录文件的SQL Server 2005数据库附加到SQL Server 2016服务器实例上时,系统会将目录文件从其以前的位置与其他数据库文件一起附加,这与在SQL Server 2005中的情况相同。

附加数据库时,该数据库必须已分离且所有数据文件(MDF文件和NDF文件)都必须可用。

附加日志文件的要求在某些方面取决于数据库是读写的还是只读的。如果读写数据库具有单个日志文件,并且没有为该日志文件指定新位置,附加操作将在旧位置中查找该文件。如果找到了旧日志文件,无论数据库上次是否完全关闭,都将使用该文件。但是,若未找到旧文件日志,数据库上次是完全关闭且现在没有活动日志链,则附加操作将尝试为数据库创建新的日志文件。

反之,若附加的主数据文件是只读的,则数据库引擎假定数据库也是只读的。对于只读数据库,日志文件在数据库主文件中指定的位置上必须可用。因为SQL Server 2016无法更新主文件中存储的日志位置,所以无法生成新的日志文件。

从上述内容可以看出,用户试图附加SQL Server 2016数据库前,必须具备一定的先决条件,具体如下:

(1)必须首先分离数据库。任何尝试附加未分离的数据库都将返回错误。

(2)附加数据库时,所有数据文件(MDF文件和LDF文件)都必须可用。若任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。

(3)在附加数据库时,如果MDF和LDF文件位于不同目录并且其中一条路径包含\\?\GlobalRoot,该操作将失败。

具备了如上先决条件后,用户就可以开始附加数据库到指定目标上了,其具体操作步骤如下:

步骤01 在SQL Server Management Studio对象资源管理器中连接到SQL Server数据库引擎的实例,然后展开该实例。

步骤02 右击【数据库】菜单,然后单击【附加】菜单项。

步骤03 在【附加数据库】对话框中,若要指定要附加的数据库,可以单击【添加】按钮,如图6.5所示,然后在【定位数据库文件】对话框中选择数据库所在的磁盘驱动器并展开目录树,以查找并选择数据库的.MDF数据文件。

图6.5 附加数据库