你好,请教一个问题,由于阵列磁盘出问题后只找回数据库文件db.mdf,大小有1G多点,进行恢复过程中 
使用dbcc rebuild_log('db','c:\program files\microsoft sql server\mssql\data\db_log.ldf')后出现由于文件 ID 0(位于数据库 'pms_db' 中)无效,所以未能打开 FCB。 我用的恢复方法是网上说的最多的那种,可一直出现上面的错误 
Use Master 
Go 
sp_configure 'allow updates', 1 
reconfigure with override 
Go 
begin tran 
update sysdatabases set status = 32768 where name = 'db_name' 
-- Verify one row is updated before committing 
commit tran 
停止SQL然后重新启动SQL Server 服务,然后运行如下命令: 
DBCC TRACEON (3604) 
DBCC REBUILD_LOG('db_name','c:\mssql7\data\dbxxx_3.LDF') 
Go 
步骤6: 
停止SQL然后重新启动SQL Server 服务,然后运行: 
use master 
update sysdatabases set status = 8 where name = 'db_name' 
Go 
sp_configure 'allow updates', 0 
reconfigure with override 
Go 

解决方案 »

  1.   

    二、 数据库的恢复[/b]  当数据库的主数据MDF文件完好无损时,在丢失了LDF文件的情况下,如何利用MDF文件恢复数据库?我们把SQL Server的日志文件分为两类:一类是无活动事务的日志,另一类是含活动事务的日志,根据不同的日志,采取不同的方法来恢复数据库。  1. 无活动事务的日志恢复  无活动事务的日志丢失时,我们很容易利用MDF文件直接恢复数据库,具体方法如下:  ①.分离被质疑的数据库,可用企业管理器中的"分离数据库工具",或者用存储过程sp_detach_db分离数据库;  ②利用MDF文件附加数据库生成新的日志文件,可用企业管理器中的"附加数据库"的工具,或者用存储过程sp_attach_single_file_db附加数据库。  如果数据库的日志文件中含有活动事务,利用此方法就不能恢复数据库。  2. 含活动事务的日志恢复  含有活动事务的日志丢失时,利用上述方法就会出现"数据库和日志文件不符合,不能附加数据库"。对于这种情况下,我们采用如下方法:  ①新建同名数据库AAA,并设它为紧急模式  ·停止SQL Server服务器;  ·把数据库主数据MDF文件移走;  ·启SQL Server服务器,新建一个同名的数据库AAA;   ·停止SQL Server服务器,把移走的MDF文件再覆盖回来;  ·启动SQL Server服务器,把AAA设为紧急模式,不过默认情况下,系统表是不能随便修改的,必须首先设置一下使其能被修改,运行以下语句即可:[table=90%,#e3e3e3][tr][td]Use Master
    Go
    sp_configure ’allow updates’,1
    reconfigure with override
    Go[/td][/tr][/table]
      接着运行以下语句,把AAA数据库设为紧急模式,即把Sysdatabases表中AAA数据库的status属性设为’37268’,就表示把AAA数据库处于紧急模式。[table=90%,#e3e3e3][tr][td]update sysdatabases set status=32768 where hame=’AAA’[/td][/tr][/table]
      如果没有报告什么错误,就可以进行以下操作。  ②设置数据库AAA为单用户模式,并检查数据库  ·重启SQL Server服务器;  ·把数据库AAA设为单用户模式[table=90%,#e3e3e3][tr][td]Sp_dboption ’AAA’, ’single user’, ’true’[/td][/tr][/table]
      ·运行以下语句,检查数据库AAA[table=90%,#e3e3e3][tr][td]DBCC CHECKDB(’AAA’)[/td][/tr][/table]
      如果没有什么大的问题就可以把数据库的状态改回去。  ③还原数据库的状态  运行以下语句,就可以把数据库的状态还原:[table=90%,#e3e3e3][tr][td]update sysdatabases set status=28 where name=’AAA’
    sp_configure ’allow updates’,0
    reconfigure with override
    Go[/td][/tr][/table]
      如果没有什么大的问题,刷新一下数据库,数据库AAA又会出现在你面前,但目前恢复工作还没有做完,此时的数据库仍不能工作,还要进行下面的处理,才能真正恢复。  ④利用DTS的导入导出向导,把数据库AAA导入到一个新建数据库BBB中  ·新建一个数据库BBB;  ·右击BBB,选择IMPORT功能,打开导入向导;  ·目标源选择"在SQL Server数据库之间复制对象和数据库",这样可以把表结构,数据视图和存储过程导入到BBB中  ·再用此功能把BBB库替换成原来的AAA库即可。  到此为止,数据库AAA就完全恢复。 来源:www.piaoping.cn   三、 小结  日志文件丢失是一件非常危险的事情,很有可能你的数据库彻底毁坏。SQL Server数据库的恢复都是靠日志文件来完成,所以无论如何都要保证日志文件的存在,它至关重要。为了使我们的数据库万无一失,最好采用多种备份方式相结合,所以我们要从心里重视数据库的管理与维护工作。 
      

  2.   

    如果是SQL2000 ,直接附加上去,提示没有日志文件,问你是否生成,你点是,就OK了如果是SQL2005,那么直接附加没有日志文件的数据文件会失败的。
      

  3.   

    用sdhdy 的方法后当执行到
    Sp_dboption 'db', 'single user', 'true'时出现以下错误提示文件 'E:\Program Files\Microsoft SQL Server\MSSQL\data\db_Data.MDF' 的文件头不是有效的数据库文件头。PageAudit 属性不正确。
    sp_dboption 命令失败。
      

  4.   

    这个试了吧?1、把需要附加的数据库的MDF文件改名;2、建一个相同的数据库。库文件名称为要附加的数据库名。3、打开服务管理器(通常情况下应该在托盘),停止服务3、将新建的数据库文件的MDF文件删掉,并将原有的数据库mdf文件该为原来的名字4、重启sql  server服务 ,此时数据库变为置疑状态5、执行以下语句:
    sp_configure   'allow updates',  1 reconfigure   with   override
    update   sysdatabases   set   status='32768'   where   name='databasename'
    DBCC   rebuild_log   ('databasename','日志路径\databasename.ldf')
    update   sysdatabases   set   status='0'   where   name='databasename'
    sp_configure   'allow updates',  0 reconfigure   with   override
    重置数据库异常状态命令 
    sp_resetstatus 'database_name'到此时,表面上数据库没有什么问题了,实际上此时数据库处于回避恢复模式。新建一数据库,将原来的数据导入到新建的数据库中,完毕后将原来的数据库删除,新建,然后将数据重新导入,就行了。需要注意的是,SQL在进行数据导入导出的时候,原始表的主建信息会丢掉,所以需要注意以下。
      

  5.   

    当执行到
    DBCC  rebuild_log  ('db','E:\Program Files\Microsoft SQL Server\MSSQL\Data\db_Log.LDF')出现以下错误提示
    服务器: 消息 5172,级别 16,状态 15,行 1
    文件 'E:\Program Files\Microsoft SQL Server\MSSQL\data\db_Data.MDF' 的文件头不是有效的数据库文件头。PageAudit 属性不正确。
    服务器: 消息 5180,级别 22,状态 1,行 1
    由于文件 ID 4(位于数据库 'db' 中)无效,所以未能打开 FCB。连接中断
      

  6.   

    试试这两个方法.如果不行的话,你的MDF文件本身就可能有问题了.无数据库日志文件恢复数据库方法两则方法一1.新建一个同名的数据库2.再停掉sql server(注意不要分离数据库)3.用原数据库的数据文件覆盖掉这个新建的数据库4.再重启sql server5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
    数据库的脚本创建一个新的数据库,并将数据导进去就行了.USE MASTER
    GOSP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
    GOUPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
    Gosp_dboption '置疑的数据库名', 'single user', 'true'
    GoDBCC CHECKDB('置疑的数据库名') 
    Goupdate sysdatabases set status =28 where name='置疑的数据库名'
    Gosp_configure 'allow updates', 0 reconfigure with override
    Gosp_dboption '置疑的数据库名', 'single user', 'false'
    Go方法二事情的起因:昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的?!这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。最终成功恢复的全部步骤如下:设置数据库为紧急模式
    停掉SQL Server服务;把应用数据库的数据文件XXX_Data.mdf移走;重新建立一个同名的数据库XXX;停掉SQL服务;把原来的数据文件再覆盖回来;运行以下语句,把该数据库设置为紧急模式;运行“Use MasterGosp_configure 'allow updates', 1reconfigure with overrideGo”执行结果:DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。接着运行“update sysdatabases set status = 32768 where name = 'XXX'”执行结果:(所影响的行数为 1 行)重启SQL Server服务;运行以下语句,把应用数据库设置为Single User模式;运行“sp_dboption 'XXX', 'single user', 'true'”执行结果:命令已成功完成。做DBCC CHECKDB;运行“DBCC CHECKDB('XXX')”执行结果:'XXX' 的 DBCC 结果。'sysobjects' 的 DBCC 结果。对象 'sysobjects' 有 273 行,这些行位于 5 页中。'sysindexes' 的 DBCC 结果。对象 'sysindexes' 有 202 行,这些行位于 7 页中。'syscolumns' 的 DBCC 结果。………运行以下语句把系统表的修改选项关掉;运行“sp_resetstatus "XXX"gosp_configure 'allow updates', 0reconfigure with overrideGo”执行结果:在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。重新建立另外一个数据库XXX.Lost;DTS导出向导
    运行DTS导出向导;复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;视图和存储过程是执行SQL语句添加的。这样,XXX.Lost数据库就可以替换原来的应用数据库了。
      

  7.   

    磁盘阵列恢复的有问题,文件是完全不对的,重新从磁盘阵列文件下手,我们已经遇见很多这样的情况了。http://www.sosdb.com/mssql/sqlserver/