【发布时间】:2017-04-14 20:08:18
【问题描述】:
在VS 2015中访问数据库后,我登录localdb SSMS发现数据库已经不在了,我必须右键单击数据库并附加它。这是正常的吗?顺便说一句,我正在使用 SSMS 2016
【问题讨论】:
标签: sql-server visual-studio visual-studio-2015 ssms ssms-2012
在VS 2015中访问数据库后,我登录localdb SSMS发现数据库已经不在了,我必须右键单击数据库并附加它。这是正常的吗?顺便说一句,我正在使用 SSMS 2016
【问题讨论】:
标签: sql-server visual-studio visual-studio-2015 ssms ssms-2012
我从未听说过消失的数据库。不过,我想你可能不小心把它拆了。
什么是分离或附加以及它们如何工作?
我们将从分离开始。当您在 SQL Server 中分离数据库时,您正在使数据库脱机并将其从要从中分离它的 SQL Server 实例中删除。数据库数据和日志文件保持完整并保持一致状态,因此您可以稍后将数据库附加到另一个 SQL Server 实例。附加将已正确分离(或从完全关闭的 SQL Server 实例复制)的数据库中的数据和日志文件连接到 SQL Server 实例并使数据库联机。 如何分离数据库?
您可以在 T-SQL 或 SQL Server Management Studio GUI 中执行此操作。
在 GUI 中,右键单击要分离的数据库,选择所有任务并单击分离。从那里你会得到分离对话框。您可以选择先断开连接以强制断开任何活动连接并回滚它们正在执行的工作。您还可以选择在分离之前更新统计信息。分离通过 - 选择分离...
In 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 - acceptable input is 'True' or 'False' if 'True', SQL Server will update statistics before detach. If 'False', it won't. If you don't specify anything here the statistics will be updated in SQL Server 2005 or later.
@keepfulltextindexfile - The default here is 'True' - if this is set to true, the full text index metadata will not be dropped during the detach.
要了解有关分离的更多信息以及我在下面强调的风险的更多详细信息,sp_detach_db 的联机丛书文章是一个不错的起点。 如何附加数据库?
您也可以在 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 方法:
-- 使用创建数据库和 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 结构。 我应该何时考虑进行分离或附加?
首先要说明分离和附加的用途:备份和恢复分离和附加不是为了日常恢复目的而备份数据库的一种方式。这种方式没有事务日志备份,它会使您的数据库处于一种数据库文件可能被意外删除的状态,这根本不是一个好方法。
也就是说,分离和附加适用于一些用例(并不详尽,请随意编辑以添加或创建更多答案):
有时用于迁移(尽管我更喜欢在我的回答中讨论的那些备份/恢复) 当您想要删除不再积极使用但能够在以后根据需要附加的数据库时。 在某些故障排除情况下,这可能会被调用 没有空间来备份或将数据和日志文件恢复到另一个环境(你不应该在这里,但我有时用它在环境中移动开发数据库..不想要或不需要日志文件的附加/重建)
风险和警告
再次重申,在线书籍在这里是一个很好的资源,但我会提出一些在分离或附加数据库时要牢记的具体注意事项 -
分离
您正在使您的数据库脱机。将无法再访问它。这应该是显而易见的,但值得一提。这就是为什么它不是一个很好的备份选项。 当您的数据库联机时,SQL Server 会锁定文件。我不建议尝试这样做来证明我错了,因为可能存在其他一些情况,但是当 SQL Server 在线时,您通常无法删除数据库文件(数据、辅助数据或日志文件)。这是一件好事。当你分离时,你没有这样的保护——这可能是一件坏事。 如果您正在处理数据库损坏并且您在某个地方发现了一些具有分离第一步的文章 - 这是错误的 - 如果您分离损坏的数据库,可能就是这样。您可能不会再次附加该数据库。 在整个网络中剪切和粘贴生产数据库文件是一种可能引入文件级损坏的方法。我在进行迁移时更喜欢备份/恢复的另一个原因。 这可能会导致维护计划失败。情况是,您像我一样制定了维护计划,在没有检查最佳实践的情况下对所有数据库进行定期备份。这工作正常,所以你停止思考它。然后其他人决定将他们不使用的数据库脱机。维护计划将从该点开始失败,直到您通过选中“数据库”对话框中的“忽略状态不在线的数据库”选项来修改维护计划。请注意,它不仅会因脱机数据库而失败 - 维护计划在尝试备份脱机数据库时将失败并出现错误,因此可能无法备份某些联机数据库。 (这一点不同作者,所以要持怀疑态度)
附加 - 就像您不应该从互联网上运行脚本或在机场接受陌生人的包裹一样,您不应该附加从其他人那里获得的数据库,而无需经过一些步骤来验证它。该数据库中的触发器、存储过程等代码可能会危及您的环境。您应该在安全且有防火墙的环境中查看要附加的数据库,而不是您的生产系统。 SQL Server 的不同版本或版本会怎样?
这些与在版本之间恢复数据库的规则没有什么不同。您通常最多可以将 3 个版本还原到下一个版本(例如,SQL Server 2008 到 SQL Server 2012 可以工作。SQL Server 2000 到 SQL Server 2012 不能)。您根本无法通过备份/恢复或分离/附加来倒退-您必须编写对象脚本并编写插入脚本并手动或使用执行此操作的工具来执行此操作。对于版本,您通常可以在 SQL Server 的主要 SKU 之间移动 - 例如,您可以将数据库从 Standard 移动到 Enterprise,而无需额外工作。但是,如果您使用的是企业功能(例如,压缩或分区),则需要在移动之前禁用这些功能。您可以通过查看此处了解需要考虑禁用的功能。
https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server
【讨论】: