SSMS数据库在VS中访问后消失

时间:2017-04-14 20:08:19

标签: sql-server visual-studio visual-studio-2015 ssms ssms-2012

在VS 2015中访问数据库之后。我登录到localdb SSMS,发现数据库不再存在,我必须右键单击数据库并附加它。这是正常的吗?顺便说一句,我正在使用SSMS 2016

1 个答案:

答案 0 :(得分:0)

我从来没有听说过数据库正在消失。不过,我想你可能会意外脱离它。

什么是分离或附加以及它们如何工作?

我们从分离开始。在SQL Server中分离数据库时,您将使数据库脱机并将其从要从中分离的SQL Server实例中删除。数据库数据和日志文件保持一致并保持一致状态,因此您可以稍后将数据库附加到另一个SQL Server实例。 Attach将数据和日志文件从已正确分离的数据库(或从完全关闭的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方法:

- 使用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结构。 我应该何时考虑进行分离或附加?

首先要说明什么是分离和附加不适用于:备份和恢复分离和附加不是备份数据库以进行常规恢复的方法。这种方式没有事务日志备份,它会使您的数据库处于可以意外删除数据库文件的状态,并且根本不是一个好方法。

这就是说,分离和附加对于一些用例是好的(不是详尽的,可以随意编辑以添加或创建更多的新答案):

有时候是迁移(虽然我更喜欢备份/恢复,如我在这里的回答中所讨论的那样) 如果要删除不再主动使用但能够根据需要稍后附加的数据库。 在某些故障排除情况下,可能需要这样做 没有足够的空间来备份或将数据和日志文件还原到另一个环境(你不应该在这里,但我已经用它来移动开发数据库有时候环绕着环境。不想要或不需要日志,所以附加/重建日志文件)

风险和警告

同样,网上书籍在这里是一个很好的资源,但我会在分离或附加数据库时提出一些具体考虑因素 -

分离

enter image description 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,压缩或分区),则在移动之前,您需要禁用这些功能。通过查看此处,您可以了解您需要考虑禁用的功能。

https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server