附加或分离数据库是什么意思?
如何分离数据库?
如何附加数据库?
附加并重建日志是什么意思?
如何在SQL Server Express中进行操作?
我什么时候可以考虑分离和附加?
是否有任何风险或警告?
在SQL Server的各个版本之间进行附加呢? (企业标准?2000年至2008年?2012年至2008年?)
#1 楼
什么是分离或连接以及它们如何工作?我们将从分离开始。在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 ,在分离过程中不会删除全文本索引元数据。 要了解有关分离的更多信息以及我在下面强调的风险的更多详细信息,
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步骤。
如果没有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之间移动-例如,您可以将数据库从标准移动到企业,而无需进行额外的工作。但是,如果您使用的是企业功能(说,压缩或分区),则需要在移动之前禁用这些功能。通过查看此处,您可以了解需要考虑禁用的功能。
评论
@Mike-定期分离和附加数据库会对性能产生影响吗?我以为缓冲区缓存对于任何分离的数据库都是无效的(显然),但是您知道其他影响吗?
– Max Vernon♦
2014年3月20日在20:04
我有一个数据库,当我停止SQL Server实例并复制这3个文件,然后将它们附加到另一个实例上时,该数据库进入恢复(在同一数据库上两次发生于我身上)。根据您的描述,这应该不会发生,那么我应该对我的数据库产生什么怀疑?它以某种方式损坏了吗?备份需要创建和还原才能完成,此功能可以节省生命!至少出于开发人员数据库共享的目的...
– NoOne
2014-10-10 17:08