从损坏的数据库中提取数据时出现问题

时间:2016-07-31 13:45:56

标签: sql sql-server database sql-server-2008-r2 recovery

我遇到了数据损坏的问题,我需要从中提取数据..

作为一个开始,我们的数据库服务器崩溃了,我们从文件系统中提取了.mdf和.ldf文件,但是当崩溃发生时,当我试图连接时,似乎某个特定数据库“XYZ”正在运行某些操作得到以下错误:

  

日志扫描号(218:387:1)传递到数据库'XYZ'中的日志扫描   无效

所以我通过创建一个具有相同名称的数据库来附加它,并替换.mdf文件并在停止SQL SERVER服务以重现您的场景后删除新的.ldf,然后重新启动它。

我按照以下Link跟随Paul Randal的说明:

ALTER DATABASE [XYZ] SET EMERGENCY;
GO

ALTER DATABASE [XYZ] SET SINGLE_USER;
GO

DBCC CHECKDB (N’XYZ’, REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS, NO_INFOMSGS;
GO

但是当我运行DBCC CHECKDB命令时,我遇到了以下消息

  

文件激活失败。物理文件名“E:\ Program   Files \ Microsoft SQL   Server \ MSSQL10_50.MSSQLSERVER \ MSSQL \ DATA \ XYZ_log.ldf“可能是   不正确。由于打开了日志,因此无法重建日志   数据库关闭时的事务/用户,没有检查点   发生在数据库中,或者数据库是只读的。这个错误   如果手动删除或丢失事务日志文件,则可能发生   由于硬件或环境故障。 Msg 5123,Level 16,State 1,   第1行CREATE FILE遇到操作系统错误3(未通过   检索此错误的文本。原因:15105)试图打开时   或创建物理文件'C:\ Program Files \ Microsoft SQL   服务器\ MSSQL10_50.MSSQLSERVER \ MSSQL \ DATA \ XYZ_log.ldf”。消息5024,级别   16,状态2,行1找不到主日志文件的条目   sysfiles1。无法重建日志。 Msg 5028,Level 16,State 2,   第1行系统无法激活足够的数据库进行重建   日志。文件激活失败。物理文件名“E:\ Program   Files \ Microsoft SQL   Server \ MSSQL10_50.MSSQLSERVER \ MSSQL \ DATA \ XYZ_log.ldf“可能是   不正确。由于打开了日志,因此无法重建日志   数据库关闭时的事务/用户,没有检查点   发生在数据库中,或者数据库是只读的。这个错误   如果手动删除或丢失事务日志文件,则可能发生   由于硬件或环境故障。 Msg 5123,Level 16,State 1,   第1行CREATE FILE遇到操作系统错误3(未通过   检索此错误的文本。原因:15105)试图打开时   或创建物理文件'C:\ Program Files \ Microsoft SQL   服务器\ MSSQL10_50.MSSQLSERVER \ MSSQL \ DATA \ XYZ_log.ldf”。消息5024,级别   16,状态2,行1找不到主日志文件的条目   sysfiles1。无法重建日志。 Msg 5028,Level 16,State 2,   第1行系统无法激活足够的数据库进行重建   日志。 Msg 7909,Level 20,State 1,Line 1紧急模式修复   失败。您必须从备份恢复。

所以作为最后的手段,我试图在一个新的数据库中自己选择每个表,并且它适用于80%的表,但是当涉及到特定的表"最重要的一个" 当我尝试SELECT INTO语句时遇到以下错误:

  

由于数据移动,无法继续使用NOLOCK扫描。

是否有任何解决方案,我有一个提示单独阅读每个页面,但我无法找到如何做到这一点。

我正在使用SQL Server 2008 R2 btw

提前致谢,

1 个答案:

答案 0 :(得分:0)

  

由于数据移动,无法继续使用NOLOCK扫描。

从损坏的表中选择

时也会发生此错误

我能够重新编写您的整个问题,但我没有像您那样复制日志文件,这可能是导致您的DBCC失败的原因

为避免DBCC失败,请尝试以下步骤。
1.不要创建日志文件
2.只需创建具有相同名称的数据库并在同一路径中复制mdf文件

然后在查询下运行..

alter database yourdb set emergency;
go

alter database yourdb set single_user;
go

现在运行dbcc checkDB,这将纠正错误,也可能会删除重要表中的数据

DBCC CHECKDB (N'yourdb', REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS, NO_INFOMSGS;
GO

这将成功完成..

现在运行以下语句..

alter database  yourdb set online
go

alter database yourdb set multi_user
go