【发布时间】: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