SQL只有MDF文件的恢复--SQL无日志LDF文件的恢复

SQL Server是一个关系数据库管理系统,在进行SQL Server数据库操作的过程中难免会出现误删或者别的原因引起的日志损坏,由于SQL Server数据库中数据的重要性,出现了以上的故障之后就必须对数据库中数据进行恢复。
    速达软件SQL数据库中的两个备份文件mdf和ldf文件,因误删或者别的原因引起的ldf日志文件被清除,现在只有一个mdf数据文件,怎么样才能恢复原来的帐套数据呢?下面就为大家介绍一种不打开速达服务器,即绕过速达软件,通过后台数据库修复,来恢复无日志LDF文件的方法。

运软件行环境:
       SQL SERVER 2000 SP4
      

准备:备份原速达帐套的mdf数据文件(假设原帐套名为:SD001),SD31502_SD0001.mdf

1、停止SQL SERVER 服务管理器,把数据库的数据文件SD31502_SD0001.mdf移走。

2、打开速达软件,新建一个跟原来帐套名称SD001同名的帐套SD0001,停掉SQL服务,用原帐套数据mdf文件(SD31502_SD0001.mdf)覆盖新建的帐套mdf文件,删除新建帐套的ldf文件(SD31502_SD0001_log.ldf)。

3、启动SQL数据库 --- 企业管理器,打开新建的SD0001速达数据库,可以看到数据库SD31502_SD0001为灰色的“置疑” 状态,现在不进行任何操作。

                                         图1

sql server修复mdb文件 sql mdf文件损坏的数据恢复_sql server修复mdb文件

开始:SQL Server无日志恢复数据库

1、将SQL数据库设置为“允许对系统目录直接进行修改”,右键(local)(windows NT)--- 属性 --- 服务器设置,选中“允许对系统目录直接进行修改”;图2

sql server修复mdb文件 sql mdf文件损坏的数据恢复_Server_02

或,运行以下语句,允许对系统目录直接进行修改。
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
    执行结果:
    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
    已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。 


sql server修复mdb文件 sql mdf文件损坏的数据恢复_Server_03

2、运行以下语句,设置置疑数据库为紧急模式:
update sysdatabases set status = -32768 where name = 'SD31502_SD0001'
go
    执行结果:
    (所影响的行数为 1 行)
   


sql server修复mdb文件 sql mdf文件损坏的数据恢复_sql server修复mdb文件_04

                                             图5

sql server修复mdb文件 sql mdf文件损坏的数据恢复_sql server修复mdb文件_05

3、运行以下语句,把应用数据库设置为Single User单项用户模式(可省略);
sp_dboption 'SD31502_SD0001', 'single user', 'true'
    执行结果:
   

sql server修复mdb文件 sql mdf文件损坏的数据恢复_数据库_06

4、运行以下语句,重新建立LOG (置疑数据库_log.ldf) 文件
dbcc rebuild_log('SD31502_SD0001','C: \Program Files\SuperData\速达V5\Data\SD31502_SD0001_log.ldf')

dbcc rebuild_log('SD31502_SD0001','C:\Program Files\Microsoft SQL Server\MSSQL\Data\SD31502_SD0001_log.ldf')

建议LDF保存速达数据Data文件夹,'C: \Program Files\SuperData\速达V5\Data。图7


sql server修复mdb文件 sql mdf文件损坏的数据恢复_Server_07

如果遇到下列提示信息:服务器: 消息 50xx,级别 16,状态 1,行 1 未能排它地锁定数据库以执行该操作。
    说明您的其他程序正在使用该数据库,如果刚才您正在使用SQL Server Enterprise Manager打开数据库的系统表,那么退出SQL Server Enterprise Manager就可以了。
    执行结果::
    警告: 数据库 '置疑数据库' 的日志已重建。已失去事务的一致性。应运行DBCC CHECKDB 以验证物理一致性。DBCC 执行完毕。如果DBCC 输出了错误信息,请与系统管理员联系。
    此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库了。 图8


sql server修复mdb文件 sql mdf文件损坏的数据恢复_SQL_08

如不执行第4步,则第3、第7步则不可省略,但执行完第9步后数据库能打开,数据库还处于紧急模式,打开速达软件会提示处于“未能在数据库 'SD31502_SD0001'中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式”。有些数据可能会不显示,如执行DTS导出,部份表可能不能导出,即使能导出表,部份表也会提示出错。图9


sql server修复mdb文件 sql mdf文件损坏的数据恢复_Server_09

5、验证数据库一致性(可省略) :
dbcc checkdb('SD31502_SD0001')
    执行结果:
   


sql server修复mdb文件 sql mdf文件损坏的数据恢复_数据库_10

6、设置数据库为正常状态 :
sp_dboption 'SD31502_SD0001','dbo use only','false'
    执行结果:
    数据库的状态“只供DBO使用”,恢复为正常状态
   

sql server修复mdb文件 sql mdf文件损坏的数据恢复_Server_11

7、运行以下语句,关闭Single User单用户模式(可省略):
sp_dboption 'SD31502_SD0001', 'single user', 'false'

图12

sql server修复mdb文件 sql mdf文件损坏的数据恢复_SQL_12

8、将步骤4中设置的“允许对系统目录直接修改”进行关闭,你可以在SQL Server Enterprise Manager(SQL企业管理器)里面恢复,也可以执行以下语句,在DBCC 完成关闭。
use master
go
sp_configure 'allow updates',0
go
reconfigure with override
go
    执行结果: 
    已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。

图13

sql server修复mdb文件 sql mdf文件损坏的数据恢复_SQL_13

9、你修改了'NESTED TRIGGERS'的值,需要运行RECONFIGURE语句来使这个修改生效。
    运行以下语句,使这个修改生效
RECONFIGURE

图14

sql server修复mdb文件 sql mdf文件损坏的数据恢复_数据库_14

最后、重启电脑,打开速达软件,就可以看到原帐套数据啦。衡量数据恢复成功与否的标准:第一:能不能进行速达帐套的修复操作,第二:能不能进行速达帐套的备份操作,同时附合上述两个标准,说明数据恢复成功。网上提供的数据恢复服务无非是恢复原数据库,再用DTS导入原数据库表数据而已。

提醒各位,请用DTS导入导出数据,不然你的数据库结构或多或少,会有点问题。如要恢复原帐套,用DTS数据导入时注意选择“扩展属性”。但SQL数据库不熟悉的,请千万不要碰。

致远会再写篇博文,首先介绍如何发现MDF文件中的错误,并在SQL表中定位错误位置;然后介绍如何利用SQ数据库“表”,修复已损坏的“速达帐套MDF文件”,并用DTS导入导出进行重建已修复的速达帐套的博文,教会你如何修复MDF数据文件,并用DTS导入导出方法重建新的MDF文件。

再次提醒各位速友,坚持每天备份帐套数据,以防万一。


附:在查询分析器中如执行存储过程,运行以下语句。

1,分离被置疑的数据库,
sp_detach_db @dbname = 'SD31502_SD0001'

图15


sql server修复mdb文件 sql mdf文件损坏的数据恢复_数据库_15

2,附加数据库,

sp_attach_single_file_db @dbname = 'SD31502_SD0001', @physname = 'C:\Program Files\SuperData\速达V5\Data\SD31502_SD0001.mdf'

图16

sql server修复mdb文件 sql mdf文件损坏的数据恢复_sql server修复mdb文件_16