- What does it mean to attach or detach a database?
- How do I detach a database?
- How do I attach a database?
- What does it mean to attach and rebuild the log?
- How do I do it in sql Server Express?
- When might I consider detaching and attaching?
- Are there any risks or warnings?
- What about attaching between versions and editions of sql Server? (Standard to Enterprise? 2000 to 2008? 2012 to 2008?)
解决方法
我们将从分离开始.在sql Server中分离数据库时,您将使数据库脱机并将其从要从中分离的sql Server实例中删除.数据库数据和日志文件保持一致并保持一致状态,因此您可以稍后将数据库附加到另一个sql Server实例. Attach将数据和日志文件从已正确分离的数据库(或从完全关闭的sql Server实例复制的数据库)连接到sql Server实例,并使数据库联机.
如何分离数据库?
您可以在T-sql或sql Server Management Studio GUI中执行此操作.
在GUI中,右键单击要分离的数据库,选择“所有任务”,然后单击“分离”.从那里你将获得分离对话框.您可以选择首先删除连接以强制断开所有活动连接以及它们在执行过程中的回滚工作.您还可以选择在分离之前更新统计信息.
在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’,则可接受的输入为’True’或’False’,sql Server将在分离之前更新统计信息.如果’错’,则不会.如果您未在此处指定任何内容,则将在sql Server 2005或更高版本中更新统计信息.
> @keepfulltextindexfile – 此处的默认值为“True” – 如果设置为true,则在分离期间不会删除全文索引元数据.
要了解更多关于分离的信息以及我在下面重点介绍的风险的更多细节,sp_detach_db的Books Online article是一个很好的起点.
如何附加数据库?
您也可以在T-sql或sql Server Management Studio GUI中执行此操作.
(注意:如果您拥有未正确分离的数据库中的数据和日志文件,则您的附加可能无法正常工作.当发生分离时,数据库将脱机,并且日志和数据文件将进入一致状态.当服务被彻底关闭时发生.)
在GUI中,右键单击实例的顶级Databases文件夹,然后选择Attach.在下一个对话框中,您将选择要附加的数据库的主数据文件(.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
您还可以在线查看有关Create Database声明的更多信息.
如何在sql Server Express中分离/附加?
它实际上是一样的.如果您使用的是sql Server Management Studio Express,则可以使用上述GUI中的分离/附加对话框或上述SSMS Express中的T-sql步骤.与Express没有区别.
如果您没有SSMS Express,可以下载它(Here是sql Server 2012 Express版本).
我应该何时考虑进行分离或附加?
首先,关于什么分离和附加不应该用于:备份和恢复分离和附加不是备份数据库以进行常规恢复的方法.这种方式没有事务日志备份,它使您的数据库处于可以意外删除数据库文件的状态,并且根本不是一个好方法.
这就是说,分离和附加对于一些用例是好的(不是详尽的,随意编辑以添加或创建更多的新答案):
>有时用于迁移(虽然我更喜欢备份/恢复,如我在答案here中所讨论的那样)
>如果要删除不再使用但可以根据需要稍后附加的数据库.
>在某些故障排除情况下,可能需要这样做
>没有空间来备份或将数据和日志文件还原到另一个环境(你不应该在这里,但我曾经用它来移动环境中的dev数据库有时候..不想要或者需要日志所以附加/重建日志文件)
风险和警告
同样,在线图书是一个很好的资源here,但我会在分离或附加数据库时考虑一些特定的考虑事项 –
分离
>您正在使数据库脱机.它将不再可访问.这应该是显而易见的,但值得一提.这就是为什么它不是一个很好的备份选项.
>当数据库联机时,sql Server会锁定文件.我不建议尝试这样做来证明我的错误,因为可能还有其他一些情况,但是当sql Server联机时,您通常无法删除数据库文件(数据,辅助数据或日志文件).这是件好事.当你分离时,你没有这样的保护 – 这可能是一件坏事.
>如果您正在处理数据库损坏,并且您发现某个文章某个地方有分离的第一步 – 这是错误的 – 如果您分离损坏的数据库,那可能就是这样.您可能无法再次附加该数据库.
>在整个网络中剪切和粘贴生产数据库文件是一种可能导致文件级损坏的方法.另一个原因是我喜欢在进行迁移时进行备份/恢复.
>这可能会导致维护计划失败.实际情况是,您可以像我一样设置维护计划,以便在不检查最佳实践的情况下对所有数据库进行定期备份.这很好,所以你不要再考虑它了.然后其他人决定采用他们没有离线使用的数据库.从该点开始,维护计划将失败,直到您通过选中“数据库”对话框中的“忽略状态不在线的数据库”选项来修改维护计划.请注意,它不会仅对脱机数据库失败 – 维护计划将在尝试备份脱机数据库时失败并显示错误,因此可能无法备份某些联机数据库. (这一点的不同作者因此怀疑)
连接
– 就像你不应该从互联网上运行脚本或接受来自机场的陌生人的包裹一样,你不应该附上你从别人那里得到的数据库,而不需要一些步骤来验证它.此数据库可能在触发器,存储过程等中包含可能危及您的环境的代码.您应该在安全的防火墙环境中检查要附加的数据库,而不是生产系统.
那些sql Server的不同版本或版本呢?
这些与在版本之间恢复数据库的规则没有什么不同.您通常可以恢复到3个版本的下一个版本(例如,sql Server 2008到sql Server 2012可以正常工作.不会sql Server 2000到sql Server 2012).您无法通过备份/恢复或分离/附加向后退 – 您必须编写对象脚本并编写插入脚本,并手动或使用执行此操作的工具执行此操作.对于版本,您通常可以在sql Server的主要SKU之间移动 – 例如,您可以将数据库从Standard移动到Enterprise,而无需额外的工作.如果您使用的是Enterprise功能(Say,压缩或分区),则需要在移动之前禁用这些功能.通过查看here,您可以了解需要考虑禁用的功能.