我有一个损坏的数据库问题,我需要从中提取数据。
首先,我们的数据库服务器崩溃了,我们从文件系统中提取了.mdf和.ldf文件,但当崩溃发生时,特定的数据库"XYZ"似乎正在运行一些操作,就像我试图连接时一样,我得到了以下错误:
传递给数据库"XYZ"中日志扫描的日志扫描编号(218:387:1)不是有效的
所以我通过创建一个同名数据库来破解它,并在停止SQL SERVER服务以重现您的场景后替换.mdf文件并删除新的.ldf,然后重新启动它。
我按照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文件\Microsoft SQLServer\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XYZ_log.ldf"可能是不准确的无法重建日志,因为存在打开的数据库关闭时的事务/用户,没有检查点数据库发生错误,或者数据库是只读的。此错误如果事务日志文件被手动删除或丢失,则可能发生由于硬件或环境故障。消息5123,级别16,状态1,第1行CREATE FILE遇到操作系统错误3(未能检索此错误的文本。原因:15105)在尝试打开时或创建物理文件"C:\Program Files\Microsoft SQLServer\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XYZ_log.ldf'.Msg 5024,级别16,状态2,第1行中找不到主日志文件的条目sysfiles1.无法重新生成日志。消息5028,级别16,状态2,第1行系统无法激活足够的数据库以重新生成日志。文件激活失败。物理文件名"E:\Program文件\Microsoft SQLServer\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XYZ_log.ldf"可能是不准确的无法重建日志,因为存在打开的数据库关闭时的事务/用户,没有检查点数据库发生错误,或者数据库是只读的。此错误如果事务日志文件被手动删除或丢失,则可能发生由于硬件或环境故障。消息5123,级别16,状态1,第1行CREATE FILE遇到操作系统错误3(未能检索此错误的文本。原因:15105)在尝试打开时或创建物理文件"C:\Program Files\Microsoft SQLServer\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XYZ_log.ldf'.Msg 5024,级别16,状态2,第1行中找不到主日志文件的条目sysfiles1.无法重新生成日志。消息5028,级别16,状态2,第1行系统无法激活足够的数据库以重新生成日志。Msg7909,级别20,状态1,行1紧急模式修复失败。您必须从备份中恢复。
因此,作为最后的手段,我尝试在一个新的数据库中单独选择INTO每个表,它对80%的表都有效,但当涉及到特定的表时,当我尝试SELECT INTO语句时,我遇到了以下错误:
由于数据移动,无法使用NOLOCK继续扫描。
有什么解决方案吗?我得到了一个提示,可以自己阅读每一页,但我不知道如何做到这一点。
我正在使用SQL Server 2008 R2 btw
提前感谢,
由于数据移动,无法使用NOLOCK继续扫描。
当您从损坏的表中选择时,也可能发生此错误
我能够重新处理您的整个问题,但我没有像您那样复制日志文件,这可能是您DBCC失败的原因
若要避免DBCC失败,请尝试以下步骤
1.不创建日志文件
2.只需创建相同名称的数据库,并在相同路径中复制mdf文件
然后运行以下查询。。
alter database yourdb set emergency;
go
alter database yourdb set single_user;
go
现在运行dbcccheckDB,这将纠正错误,还可能从重要的表中删除数据
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