我遇到了数据损坏的问题,我需要从中提取数据..
作为一个开始,我们的数据库服务器崩溃了,我们从文件系统中提取了.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
提前致谢,
答案 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