15

对于在 MS SQL Server 2005 中创建的数据库,我有一个 MDF 文件,但没有 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 命令让我的数据库重新运行?

4

8 回答 8

21

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

patrikt:您会丢失数据,但可以做到。

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

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

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

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

更好的主意是尝试从任何旧备份中恢复这些(如果有的话)。

于 2013-05-28T09:33:01.990 回答
9

来自 SQL Server Forums 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') -- 创建新日志文件的未记录步骤。

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

  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
于 2009-04-21T15:11:20.970 回答
5

您是否尝试忽略 ldf 并仅附加 mdf:

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

我不确切知道您的未结交易会发生什么(可能只是丢失了),但它可能会使您的数据重新在线。

-大学教师

于 2009-04-22T03:05:39.410 回答
2

请参阅此处:Rebuild master and restore system databases from complete disk failure这有一个很好的解释

于 2009-04-21T16:52:52.770 回答
1

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

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

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

于 2010-09-13T14:29:08.590 回答
1

我自己也遇到了这个问题,但以上答案都不适合我。

但相反,我发现这很有效,所以我想我会与其他人分享这个:

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

于 2012-01-16T10:46:12.563 回答
0

我希望这样做很容易,

  1. 打开 SQL 服务器
  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 年完美工作。

于 2013-11-21T06:47:30.830 回答