【问题标题】:Issues while extracting data from corrupted database从损坏的数据库中提取数据时出现问题
【发布时间】:2016-12-05 16:37:07
【问题描述】:

我有一个损坏的数据库问题,我需要从中提取数据..

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

传递给数据库“XYZ”中的日志扫描的日志扫描编号 (218:387:1) 无效

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

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

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

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

我正在使用 SQL Server 2008 R2 顺便说一句

提前致谢,

【问题讨论】:

  • 这听起来更适合DBA站点,但你为什么使用NOLOCK?
  • 其实我没有使用 NOLOCK,输入的完整语句是 SELECT * INTO [new database].dbo.[table name] FROM [old table name]
  • 对不起,我没有完成我的评论错误地发布了,我只是编辑了它
  • 而且您没有使用未提交的事务级别读取?
  • 不,如果有帮助的话,实际上数据库处于紧急模式

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


【解决方案1】:

由于数据移动,无法使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多