Sql 如何在没有日志文件的情况下附加MDF?

Sql 如何在没有日志文件的情况下附加MDF?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试在SQLServerManagementStudio中附加Yafnet.mdf,它没有日志文件 我得到下面的错误。你知道怎么做吗 执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo) 无法打开物理文件“C:\sql\u logs\YAFnet\u log.ldf”。操作系统 错误2:“2(系统找不到指定的文件)。”。 (Microsoft SQL Server,错误:5120) 对于您的初始情况,您似乎尝试了类似

我正在尝试在SQLServerManagementStudio中附加
Yafnet.mdf
,它没有日志文件

我得到下面的错误。你知道怎么做吗

执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)

无法打开物理文件“C:\sql\u logs\YAFnet\u log.ldf”。操作系统 错误2:“2(系统找不到指定的文件)。”。 (Microsoft SQL Server,错误:5120)


对于您的初始情况,您似乎尝试了类似的方法(或者当您通过对话框时GUI为您准备的任何方法):

但是,此方法需要
mdf
文件和
ldf
文件。否则,您将收到类似以下内容的错误消息:

Msg 5120,第16级,状态101,第1行
无法打开物理文件“C:\sql\u logs\YAFnet\u log.ldf”。操作系统错误2:“2(系统找不到指定的文件)。”

现在,即使只有
mdf
文件,也有一种方法可以继续。假设您有一个从SQL Server正确分离的
mdf
文件,您应该能够使用以下语法附加
mdf
文件,而无需日志文件:

CREATE DATABASE YAFnet ON (FILENAME = N'C:\sql_data\YAFnet.mdf')
FOR ATTACH_REBUILD_LOG;
但是,在您的情况下,文件似乎没有正确地从SQL Server分离:

Msg 1813,第16级,第2状态,第1行
物理文件名“C:\sql\u logs\YAFnet\u log.ldf”可能不正确。无法重建日志,因为数据库关闭时存在打开的事务/用户、数据库未出现检查点或数据库为只读。如果由于硬件或环境故障而手动删除或丢失事务日志文件,则可能会发生此错误

有几种可能的解释,包括错误消息中提到的解释。可能是从某个无效的SAN卷影中检索到的,或者是在只读时分离的,或者是在SQL Server或底层系统崩溃后恢复的,或者是在复制/下载过程中损坏的,或者谁知道还有什么

您需要返回Yaf的支持部门或其服务提供商的支持部门,查看是否有可用的正确备份,或者如果没有,是否有
mdf
文件的备用副本。还请记住,我们中没有人真正知道什么是雅芙,也没有人有任何方法来验证你所说的雅芙

否则,您似乎运气不好,因为这个特定的
mdf
文件无效,因此不会让您走得很远


这正是为什么分离/附加和/或O/S级别的文件复制方法不是SQL Server非常有用的备份(或迁移)方法的原因。您需要一个适当的备份/恢复计划,这意味着采取适当的完整/差异/日志备份,以适应您对数据丢失的容忍度。分离数据库几乎总是一个低级的想法-当分离过程中或之后
mdf
文件发生问题时,您现在有零个数据库副本。

有几件事可以尝试。第一:

CREATE DATABASE Yafnet ON (NAME = 'Yafnet', FILENAME='*filepath*\Yafnet.mdf') FOR ATTACH;
如果不起作用,请尝试以下方法:


右键单击SSMS并以管理员身份运行。然后再次尝试连接。这应该可以解决问题。

为什么没有日志文件?您是否使用.mdf文件作为备份而不是运行正确的备份?我不知道为什么Yaf不包含日志文件。这两个选项都不能解决缺少.ldf文件的问题-
对于“附加”
仍然需要ldf文件,它与权限无关-文件根本没有OP所述的权限。它应该允许4thSpace在没有ldf文件的情况下附加mdf文件。Aaron是正确的。我得到这个错误:文件激活失败。物理文件名“C:\sql\u logs\YAFnet\u log.ldf”可能不正确。无法重建日志,因为数据库关闭时存在打开的事务/用户、数据库未出现检查点或数据库为只读。如果由于硬件或环境故障而手动删除或丢失事务日志文件,则可能会发生此错误。Msg 1813,16级,状态2,第1I行,已纠正。Aaron拥有58.8k的声誉&显然他知道自己的东西。这不一定是因果关系。从理论上讲,我可以在回答Java问题时赢得所有声誉,只知道如何拼写SQL Server.:-)我得到了如下所示的相同错误。然后你需要得到一个适当的备份。这对我来说很有效“[…]我们没有人真正知道Yaf是什么,也没有任何方法来验证你说的是哪一个Yaf。”这让我的一天变得愉快。
CREATE DATABASE Yafnet ON (NAME = 'Yafnet', FILENAME='*filepath*\Yafnet.mdf') FOR ATTACH;