【问题标题】:How to recover database from MDF in SQL Server 2005?如何从 SQL Server 2005 中的 MDF 恢复数据库?
【发布时间】:2010-10-20 20:36:49
【问题描述】:

我有一个 MDF 文件,但没有用于在 MS SQL Server 2005 中创建的数据库的 LDF 文件。当我尝试将 MDF 文件附加到不同的 SQL Server 时,我收到以下错误消息。

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 命令让我的数据库重新运行?

【问题讨论】:

标签: sql-server sql-server-2005 mdf data-recovery


【解决方案1】:

我在Experts Exchange找到了以下文档。

帕特里克: 您会丢失数据,但可以做到。

1. 分离数据库并将您的 mdf 移动到保存位置。 2. 创建相同名称、相同文件、相同文件位置和相同文件大小的新数据库。 3. 停止 SQL 服务器。 4. 将刚刚创建的数据库的 mdf 文件交换到您的保存文件中。 5. 启动 SQL。 DB会怀疑。 6. ALTER DATABASE yourdb SET EMERGENCY 7. 更改数据库yourdb SET SINGLE_USER 8. DBCC CHECKDB (yourdb, REPAIR_ALLOW_DATA_LOSS) 9. 更改数据库yourdb SET MULTI_USER 10. 更改数据库yourdb 在线设置

【讨论】:

  • 这条建议的质量难以置信很差。遇到这个解决方案的人,只要避开。你最终会像serverfault.com/questions/171145/…
  • 您能否准确定义此建议的坏处?该问题明确指出数据丢失是可以接受的。
  • 我需要创建一些假账户,这样我才能多点赞。
  • 不要这样做它让我发疯......交换后我无法启动服务器
【解决方案2】:

以下是涵盖第 2) 部分和第 3) 部分的详细信息,以防万一重新创建日志不起作用,如果 MDF 文件损坏,可能会发生这种情况。

您只能通过使用一些第三方工具读取 MDF 文件来恢复数据和结构,该工具可以将写入的内容解码为二进制数据,但即使使用此类工具,您也无法始终完全完成这项工作。

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

如果有的话,最好尝试从任何旧备份中恢复它们。

【讨论】:

    【解决方案3】:

    来自 SQL Server 论坛 Attaching MDF without LDF 上的帖子:

    如果您想在没有 LDF 的情况下附加 MDF,您可以按照以下步骤操作 它已经过测试并且工作正常

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

    2. 停止 sql server 并将现有的 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
    
    1. 重启 sql server。现在数据库将处于紧急模式

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

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

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

    1. 执行 sp_resetstatus

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

    更新: DBCC REBUILD_LOG 不存在 SQL2005 及更高版本。这应该有效:

    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。
    • 使用 ATTACH_REBUILD_LOG 标志会产生与原始帖子相同的错误消息。
    • 数据库不会总是以状态可疑的形式出现。有可能在这个问题中得到错误,执行这些步骤,并最终得到一个很好的数据库(状态在线)。这取决于数据库意外分离时发生的情况。
    • ´´Sp_configure "allow updates", 1}´´ 不再适用于 sql 2005 或更高版本使用 ALTER DATABASE yourdb SET EMERGENCY
    • 如果上述方法无法从 .mdf 文件中恢复数据库,那么使用Free SQL MDF Recovery Tool 是最好的解决方案。
    【解决方案4】:

    您是否尝试过忽略 ldf 而只是附加 mdf:

    sp_attach_single_file_db [ @dbname = ] 'dbname' , [ @physname = ] 'physical_name'

    我不知道您的未结交易(可能只是丢失)究竟会发生什么,但它可能会让您的数据重新上线。

    -不要

    【讨论】:

    • 这对我来说就像一个魅力——其他一切都会产生错误。
    • 老兄,你摇滚了
    【解决方案5】:

    【讨论】:

      【解决方案6】:

      我自己也遇到了这个问题,但以上答案都没有对我有用。

      但是,相反,我发现这是一种享受,所以我想我会与其他人分享这个:

      http://www.kodyaz.com/articles/sql-server-attach-database-mdf-file.aspx

      【讨论】:

        【解决方案7】:

        找到另一种完全有效的方法:

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

        在尝试了以上所有对我来说都失败的方法后,我得到了一个工作数据库。

        【讨论】:

          【解决方案8】:

          我希望这样做很容易,

          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 年可以完美运行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多