Mar*_*tin 15 sql-server sql-server-2005 data-recovery mdf
我有一个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.
我想完成以下任何一个选项:
我可以尝试使用哪些SQL命令来重新启动数据库?
Mar*_*tin 21
我在专家交流中找到了以下文件.
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 DATABASEyourdbSET EMERGENCY 7. ALTER DATABASEyourdbSET SINGLE_USER 8. DBCC CHECKDB (yourdb, REPAIR_ALLOW_DATA_LOSS) 9. ALTER DATABASEyourdbSET MULTI_USER 10. ALTER DATABASEyourdbSET ONLINE
Geo*_*ber 11
以下是部分2)和3)的详细信息,以防重新创建日志不起作用,如果MDF文件已损坏,则可能发生这种情况.
您只能通过使用某些第三方工具读取MDF文件来恢复数据和结构,该工具可以对写入二进制数据的内容进行解码,但即使使用此类工具,也无法始终完全完成工作.
在这种情况下,您可以尝试ApexSQL Recover.据我所知,这是唯一可以做这种工作但却相当昂贵的工具.
更好的想法是尝试从任何旧备份恢复这些,如果你有任何.
来自SQL Server论坛的帖子在没有LDF的情况下附加MDF:
如果要连接不带LDF的MDF,可以按照以下步骤进行测试并正常工作
创建具有相同名称和相同MDF和LDF文件的新数据库
停止sql server并将现有MDF重命名为新MDF并将原始MDF复制到此位置并删除LDF文件.
启动SQL Server
现在您的数据库将被标记为可疑5.更新sysdatabases以更新为紧急模式.这不会在启动时使用LOG文件
Run Code Online (Sandbox Code Playgroud)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') - 未记录的步骤以创建新的日志文件.
(根据您的要求替换dbname和日志文件名)
执行sp_resetstatus
重新启动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
Run Code Online (Sandbox Code Playgroud)
你试图忽略ldf并只是附加mdf:
sp_attach_single_file_db [@dbname =]'dbname',[@ physname =]'physical_name'
我不确切知道您的开放交易会发生什么(可能只是丢失),但它可能会使您的数据重新上线.
-don