2009-04-21 177 views
15

我有一个MDF文件,并且没有在MS SQL Server 2005中创建的数据库的LDF文件。当我尝试将MDF文件附加到不同的SQL Server时,出现以下错误消息。如何在SQL Server 2005中从MDF恢复数据库?

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

我想完成下列任一选项:

  1. 连接而不会丢失数据的数据库(不可能的,但可以节省我一些时间)。
  2. 将数据库连接到数据丢失(丢失任何事务)。
  3. 从MDF文件中仅恢复模式(无数据)。

什么SQL命令可以尝试让我的数据库再次运行?

回答

21

我在Experts Exchange找到以下文件。

patrikt: 您将有数据丢失,但它可以做到的。

 
1. Detach database and move your mdf to save location. 
2. Create new databse of same name, same files, same file location and same file size. 
3. Stop SQL server. 
4. Swap mdf file of just created DB to your save one. 
5. Start SQL. DB will go 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 
9

FROM在SQL Server论坛Attaching MDF without LDF一个帖子:

如果您要附加一个MDF没有LDF你可以按照下面 步骤据测试,工作正常

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

  2. 停止sql服务器并将现有MDF重命名为新的MDF并将原始MDF复制到此位置并删除LDF文件。

  3. 启动SQL Server

  4. 现在你的数据库将被标记为可疑5.更新sysdatabases中更新到紧急模式。这不会在开始使用LOG文件向上

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 
  • 启动SQL Server。现在该数据库将在紧急模式下

  • 现在执行的DBCC创建日志文件

  • DBCC REBUILD_LOG(数据库, 'C:\ dbname.ldf') - 无证步到 创建一个新的日志文件。

    (取代dbname和登录基于乌尔要求文件名)

  • 执行sp_resetstatus

  • 重新启动SQL服务器,看看在数据库联机。

  • UPDATE: DBCC REBUILD_LOG不现有SQL2005及以上。这应该工作:

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

    我碰到这篇文章之际,以及完美的作品。 DBCC REBUILD_LOG在SQL Server 2005中不存在。 – Martin 2009-04-21 15:18:17

    +1

    使用ATTACH_REBUILD_LOG标志会产生与原始帖子相同的错误消息。 – Martin 2009-04-21 15:48:53

    +0

    数据库不会总是以状态SUSPECT的形式出现。有可能在这个问题中得到错误,执行这些步骤,最后得到一个没问题的数据库(状态为ONLINE)。这取决于数据库意外分离时发生了什么。 – 2012-05-29 18:58:46

    5

    你试图忽略LDF,只是附加MDF:

    sp_attach_single_file_db [@dbname =] 'DBNAME',[@ PHYSNAME =“physical_name的”

    我不知道到底会发生在你开什么样的交易(可能只是失去了),但它可能让你的数据重新联机。

    -don

    1

    发现了一个的作品完全另一种方式:

    1. 创建具有相同名称的新数据库默认数据库位置。
    2. 停止SQL服务器。
    3. 复制旧的mdf文件覆盖新创建的MDF文件,并删除新的LDF文件
    4. 启动SQL Server,数据库将在紧急模式
    5. 拆离紧急模式数据库
    6. 复制原始LDF文件到默认的数据库位置(其中为创建并在上述步骤3中删除新的LDF文件。
    7. 附加数据库的MDF文件。

    我尝试以上所有的失败,我得到了后一个工作数据库。

    11

    下面是详细介绍)和3)的情况下,再创建日志不起作用可能发生如果MDF文件已损坏。

    只能通过阅读MDF文件的一些第三方工具,可以去代码什么写成二进制数据,但即使有这样的工具,你不能总是完全胜任恢复数据和结构。

    在这种情况下,你可以试试ApexSQL Recover。从我所知道的这是唯一可以完成这种工作的工具,但它非常昂贵。

    更好的主意是尝试,如果您有任何从任何旧的备份恢复这些。

    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年

    相关问题