由于不止一个人干预了数据库,我们丢失了事务日志文件,从而丢失了数据库。幸运的是,我们的 MDF 文件仍然完好无损,我们并不担心丢失的事务,因为它们只是“删除”事务。
我做了一些研究,发现 sp_attach_single_file_db 命令非常适合此用途,并且在删除文件之前 SQL 服务器已关闭。我使用了这个命令:
EXEC sp_attach_single_file_db @dbname = 'RecoveredDatabase',
@PhysName = 'E:\SQL Data\AerationBasinsTrend_data.mdf'
其中“RecoveredDatabase”是我的新数据库,“E:\SQL DATA\AerationBasinsTrend_Data.mdf”是物理 .mdf 文件。运行此程序时出现错误。服务器报告以下内容:
服务器:消息 1813,级别 16,状态 2,第 1 行
无法打开新数据库“RecoveredDatabase”。CREATE DATABASE 已中止。
设备激活错误。物理文件名“E:\SQL Data\AerationBasinsTrend_Log.LDF”可能不正确。
设备激活错误。物理文件名“C:\SQL Backup\TransLog”可能不正确。
据我所知,如果旧 ldf 文件不存在,此命令应该会创建一个新的 ldf 文件。我遗漏了什么?
答案1
你可以尝试一下:
创建具有相同名称和相同 MDF 和 LDF 文件的新数据库
停止 SQL 服务器并将现有 MDF 重命名为新 MDF,然后将原始 MDF 复制到此位置并删除 LDF 文件。
启动 SQL Server
现在你的数据库将被标记为可疑
更新 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
重新启动 SQL Server。现在数据库将处于紧急模式
现在执行未记录的 DBCC 来创建日志文件
DBCC REBUILD_LOG(dbname,'c:\dbname.ldf') —— 创建新日志文件的未记录步骤。
(根据您的要求替换数据库名称和日志文件名)
执行 sp_resetstatus
重新启动SQL服务器并查看数据库是否在线。