如何从SQL Server 2005的MDF文件中恢复数据库?

15

我有一个MDF文件,但没有为MS SQL Server 2005创建的数据库LDF文件。当我尝试将MDF文件附加到另一个SQL Server时,出现以下错误消息。

由于数据库关闭时存在打开事务/用户、数据库没有进行检查点或者数据库是只读的,因此无法重建日志。如果事务日志文件被手动删除或由于硬件或环境故障而丢失,则会发生此错误。

我想要实现以下任一选项:

  1. 在不丢失数据的情况下附加数据库(不太可能,但可以节省时间)。
  2. 在丢失数据的情况下附加数据库(任何打开的事务都将丢失)。
  3. 仅从MDF文件中恢复模式(无数据)。

有哪些SQL命令可以尝试使我的数据库重新启动?


您可以查看此查询的解决方案:https://dev59.com/qZnga4cB1Zd3GeqPfexw - Sean Smith
8个回答

21

我在Experts Exchange上找到了以下文件:

patrikt: 虽然会有数据丢失,但是还是可以进行操作的。

1. 分离数据库,并将mdf文件移动到一个安全的位置。
2. 创建同名、同文件、同文件位置和同文件大小的新数据库。
3. 停止SQL服务器。
4. 将刚创建的DB的mdf文件与您保存的文件进行交换。
5. 启动SQL。数据库将变为suspect状态。
6. ALTER DATABASE yourdb SET EMERGENCY
7. ALTER DATABASE yourdb SET SINGLE_USER
8. DBCC CHECKDB (yourdb, REPAIR_ALLOW_DATA_LOSS)
9. ALTER DATABASE yourdb SET MULTI_USER
10. ALTER DATABASE yourdb SET ONLINE

4
这些建议的质量极其糟糕。谁要是遇到了这个“解决方案”,一定要远离它。否则你会像 http://serverfault.com/questions/171145/sql-server-2005-attach-without-transaction-log-urgent 中描述的那样。 - Remus Rusanu
7
你能否准确说明这个建议有什么问题?问题明确表示数据丢失是可以接受的。 - Martin
我需要创建一些虚假账户,这样我就可以给这个更多点赞。 - Michael
不要这样做,它让我疯了...交换后我无法启动服务器。 - sansalk

11

以下是关于重新创建日志文件无法工作的情况下涵盖第二部分和第三部分的详细信息,这可能会发生在MDF文件损坏的情况下。

您可以使用某些第三方工具读取MDF文件并将其解码为二进制数据以恢复数据和结构,但即使使用此类工具,您也不能始终完全完成工作。

在这种情况下,您可以尝试ApexSQL Recover。据我所知,这是唯一能够完成此类工作的工具,但它相当昂贵。

更好的主意是尝试从旧备份中恢复它们,如果您有任何备份的话。


9

以下是SQL Server论坛上的一篇帖子《无LDF文件附加MDF文件》:

如果您想附加一个没有LDF的MDF文件,可以按照以下步骤操作。这已经测试过并且可以正常工作。

  1. 创建一个与原数据库同名、具有相同MDF和LDF文件的新数据库

  2. 停止SQL Server,将现有的MDF文件重命名为新文件名,并将原始MDF复制到此位置,然后删除LDF文件。

  3. 启动SQL Server

  4. 此时,您的数据库将被标记为5级怀疑状态。请更新sysdatabases以切换到紧急模式。这将不使用启动日志文件。

Sp_configure "allow updates", 1
go
Reconfigure with override
GO
Update sysdatabases set status = 32768 where name = "BadDbName"
go
Sp_configure "allow updates", 0
go
Reconfigure with override
GO
  1. 重新启动 SQL Server。现在数据库将处于紧急模式。

  2. 现在执行未记录的 DBCC 命令以创建日志文件。

DBCC REBUILD_LOG(dbname,'c:\dbname.ldf') -- 用于创建新日志文件的未记录步骤。

(根据您的要求替换 dbname 和日志文件名)

  1. 执行 sp_resetstatus 命令。

  2. 重新启动 SQL Server 并查看数据库是否在线。

更新:SQL2005 及以上版本中不存在 DBCC REBUILD_LOG 命令。可以尝试以下命令:

USE [master]
GO
CREATE DATABASE [Test] ON 
    (FILENAME = N'C:\MSSQL\Data\Test.mdf')
    FOR ATTACH_REBUILD_LOG
GO

我也看到了那篇文章。在SQL Server 2005中,DBCC REBUILD_LOG不存在。 - Martin
1
使用ATTACH_REBUILD_LOG标志会产生与原帖相同的错误消息。 - Martin
数据库不一定会出现"SUSPECT"状态。在执行这个问题中可能会出现错误,但是按照以下步骤操作后,数据库可能会变成正常的"ONLINE"状态。这取决于数据库异常分离时正在进行的操作。 - Chris Moschini
"Sp_configure "allow updates", 1}"在SQL 2005或更高版本中已不再适用,请使用ALTER DATABASE yourdb SET EMERGENCY。 - Juan Pablo Gomez
如果以上方法无法从.mdf文件中恢复数据库,则使用免费SQL MDF恢复工具是最佳解决方案。 - Jason Clark

5

您尝试忽略ldf文件,仅附加mdf文件吗:

sp_attach_single_file_db [ @dbname = ] '数据库名' , [ @physname = ] '物理路径'

我不确定您的未完成事务会发生什么情况(可能会丢失),但这可能会使您的数据重新上线。

-Don


这对我来说非常有效--其他所有方法都会产生错误。 - dmb
老兄,你太牛了。 - Daniel Dolz

2

1

找到了另一种完全可行的方法:

  1. 创建一个与默认数据库位置相同名称的新数据库。
  2. 停止 SQL Server。
  3. 复制旧的 mdf 文件以覆盖新创建的 mdf 文件并删除新的 ldf 文件。
  4. 启动 SQL Server,数据库将处于紧急模式。
  5. 卸载紧急模式数据库。
  6. 将原始 ldf 文件复制到默认数据库位置(根据步骤 3 中创建和删除的新 LDF 文件所在的位置)。
  7. 附加数据库 MDF 文件。

在尝试了以上失败的所有方法后,我终于得到了一个可工作的数据库。


1

0

希望这很容易实现,

  1. 打开SQL Server
  2. 点击新查询
  3. 执行以下查询

    sp_attach_single_file_db @dbname='dbname',@physname='C:\Database\dbname.MDF'

其中dbname是您想在对象资源管理器中显示的名称,@physname是mdf文件的本地文件路径位置。

希望这能帮助到某些人,我通过上述方法完成了操作,同时获得了结构和数据。

在Sql Server 2000和2008中进行了测试。在Sql Server 2000中无法工作,但在2008中完美运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接