什么是分离或附加,它们是如何工作的?
我们先从分离开始。当你在SQL Server中分离一个数据库时,你是将该数据库脱机并从你所分离的SQL Server实例中移除。数据库的数据和日志文件保持完好,并处于一致的状态,因此你可以稍后将数据库附加到另一个SQL Server实例上。 附加将已正确分离的数据库(或从干净关闭的SQL Server实例复制的文件)连接到一个SQL Server实例,并使数据库在线。
如何分离数据库?
你可以使用T-SQL或通过SQL Server Management Studio GUI来完成。
在GUI中,右键单击要分离的数据库,选择All Tasks,然后点击Detach。然后你会看到分离对话框。你可以选择首先断开所有活动连接并回滚正在执行的工作,也可以选择在分离之前更新统计信息。
在T-SQL中:
-- You don't want to be in the database you are trying to detach
USE Master
GO
-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO
对于系统存储过程sp_detach_db,有两个可选参数:
- @skipchecks - 可接受的输入是'True'或'False'。如果为'True',SQL Server将在分离之前更新统计信息。如果为'False',则不会更新。如果您在此处未指定任何内容,则统计信息将在SQL Server 2005或更高版本中更新。
- @keepfulltextindexfile - 默认值为'True'。如果设置为true,则在分离期间不会删除全文索引元数据。
要了解更多关于分离以及下面我强调的风险的详细信息,请参阅Books Online article中的sp_detach_db。
如何附加数据库?
您也可以使用T-SQL或从SQL Server Management Studio GUI执行此操作。
(注意:如果您有来自未正确分离的数据库的数据和日志文件,则可能无法正常附加。在分离发生时,数据库被脱机并且日志和数据文件被置于一致状态。当服务被干净地关闭时,也会发生这种情况。)
在图形用户界面中,您右键单击实例的顶级“数据库”文件夹,然后选择“附加”。在下一个对话框中,您将选择要附加的数据库的主数据文件(.MDF),并确保选择了其他文件并指定了它们的适当位置,然后点击“确定”,即可附加您的数据库。
在T-SQL中,在SQL Server 2005及更高版本中,最好的方法是使用“CREATE DATABASE”命令。这是在SQL Server 2012之后得到支持的方法。如果您想了解如何使用“sp_attach_db”,可以在书籍在线文章“[sp_attach_db][3]”或“[sp_attach_single_file_db][4]”中找到相关信息。
当您拥有可用且一致的日志文件和数据文件时,以下是T-SQL的操作方法:
-- 使用Create Database和FOR ATTACH子句进行附加
CREATE DATABASE DatabaseName
ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
(FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
(FILENAME = 'FilePath\SecondaryDataFile.ndf) -- Optional - any secondary data files
FOR ATTACH
GO
你可以在在线书籍中了解更多关于创建数据库语句的信息。
如何在SQL Server Express中进行分离/附加操作?
实际上是一样的。如果你正在使用SQL Server Management Studio Express,你可以使用上面描述的GUI中的分离/附加对话框,或者也可以使用上面描述的通过SSMS Express进行的T-SQL步骤。在这方面,与Express没有区别。
如果你没有SSMS Express,你可以下载它(这里是SQL Server 2012 Express版本)。
或者你可以进入SQLCMD会话,并使用上面描述的相同的T-SQL结构。
何时应考虑进行分离或附加操作?
首先,关于分离和附加不适用于备份和恢复:分离和附加不是用于常规恢复目的的数据库备份方法。这种方式没有事务日志备份,它使你的数据库处于可以意外删除数据库文件的状态,对于此目的来说并不好。
话虽如此,分离和附加在一些使用情况下是很有用的(不是详尽无遗的,随意编辑以添加或创建一个新答案):
有时用于迁移(尽管我更喜欢备份/还原,就像我在这里讨论的那样here)
当您想要删除一个不再活跃使用但以后可能需要附加的数据库时。
在某些故障排除情况下,可能会调用此功能
没有空间备份或还原数据和日志文件到另一个环境(你永远不应该在这里,但我有时使用它来在不同环境中移动开发数据库... 不需要日志,所以进行了附加/重建日志文件的操作)
风险和警告
再次强调,书籍在线是一个很好的资源here,但我将指出一些特定的注意事项,以便在分离或附加数据库时牢记:
分离
您正在使数据库脱机。它将不再可访问。这应该是显而易见的,但值得一提。这就是为什么它不是一个很好的备份选项。
当数据库在线时,SQL Server会锁定文件。我不建议尝试这样做来证明我的错误,因为可能存在其他情况,但通常情况下,您无法在SQL Server在线时删除数据库文件(数据、二级数据或日志文件)。这是一件好事。当您分离时,您就没有这样的保护 - 这可能是一件坏事。
如果您遇到数据库损坏,并且找到某个地方的文章中有第一步是分离的做法 - 这是错误的 - 如果您分离一个损坏的数据库,那可能就是了。您可能无法再次附加该数据库。
在整个网络中剪切和粘贴生产数据库文件可能会引入文件级别的损坏。这是我在进行迁移时更喜欢备份/还原的另一个原因。
这可能导致维护计划失败。情况是您像我一样,设置了一个维护计划来定期备份所有数据库,而没有检查最佳实践。这样做没问题,所以您停止考虑它。然后其他人决定将一个未使用的数据库脱机。从那时起,维护计划将会失败,直到您通过在“Database(s)”对话框中勾选“忽略状态不是在线的数据库”选项来修改维护计划。请注意,它不仅会对脱机数据库失败 - 维护计划将在尝试备份脱机数据库时出错,因此可能无法对某些在线数据库进行备份。(此点有不同的作者,所以要持怀疑态度)
附件
- 就像你不应该从互联网上运行脚本或接受陌生人在机场送来的包裹一样,你也不应该在没有验证的情况下附加一个从他人那里得到的数据库。这个数据库可能在触发器、存储过程等中包含有可能危害你环境的代码。你应该在一个安全且防火墙保护的环境中审查你想要附加的数据库,而不是在你的生产系统中。
SQL Server 的不同版本或版本有什么区别?
这与不同版本之间恢复数据库的规则没有任何区别。通常情况下,你可以连续恢复3个版本(例如,从SQL Server 2008到SQL Server 2012是可行的,但从SQL Server 2000到SQL Server 2012是不行的)。你不能通过备份/还原或分离/附加回退 - 你需要手动编写脚本来创建对象并插入数据,或者使用支持此操作的工具。关于版本的迁移,你通常可以在主要SQL Server版本之间进行转移 - 比如你可以将一个数据库从标准版转移到企业版而不需要额外工作。但如果你正在使用企业版的功能(比如压缩或分区),在进行迁移之前需要先禁用这些功能。你可以通过这里了解哪些功能需要考虑禁用。