首先,同情试试:Syntaxsp_attach_db [@dbname =] 'dbname',
[@filename1 =] 'filename_n' [,...16]Arguments[@dbname =] 'dbname'Is the name of the database to be attached to the server. The name must be unique. dbname is sysname, with a default of NULL. [@filename1 =] 'filename_n'Is the physical name, including path, of a database file. filename_n is nvarchar(260), with a default of NULL. There can be up to 16 file names specified. The parameter names start at @filename1 and increment to @filename16. The file name list must include at least the primary file, which contains the system tables that point to other files in the database. The list must also include any files that were moved after the database was detached.
参考:
EXEC sp_attach_db @dbname = N'pubs', 
@filename1 = N'c:\mssql7\data\pubs.mdf', 
@filename2 = N'c:\mssql7\data\pubs_log.ldf'

解决方案 »

  1.   

    当SQL Server数据库崩溃时如何恢复转载 
     任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备……仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,无法承受这样昂贵的硬件投资。所以,在系统崩溃的时候,如何恢复原有的宝贵数据就成为一个极其重要的问题了。 在恢复的时候,最理想的情况就是你的数据文件和日志文件都完好无损了,这样只需要sp_attach_db,把数据文件附加到新的数据库上即可,或者在停机的时候把所有数据文件(一定要有master等)都copy到原有路径下也行,不过一般不推荐这样的做法,sp_attach_db比较好,虽然麻烦许多。 但是呢,一般数据库崩溃的时候系统是未必能有时间把未完成的事务和脏页等写入磁盘的,这样的情况sp_attach_db就会失败。那么,寄期望于DBA制定了一个良好的灾难恢复计划吧。按照你的恢复计划,还原最新的完全备份,增量备份或者事务日志备份,然后如果你的活动事务日志还能读得出来的话,恭喜你!你可以还原到崩溃前的状态。 一般的单位都是没有专职的DBA的,如果没有可用的备份,更可能是最近一次备份的时间过于久远而导致不可接受的数据损失,而且你的活动事务日志也处于不可用的状态,那就是最麻烦的情况了。 不幸的很的是,一般数据库崩溃都是由于存储子系统引起的,而这样的情况是几乎不可能有可用的日志用于恢复的。
    那么就只好试一下这些方案了。当然,是要求至少你的数据文件是存在的,要是数据文件、日志文件和备份都没有了的话,别找我,你可以到楼顶上去唱“神啊,救救我吧”。 首先,你可以试一下sp_attach_single_file_db,试着恢复一下你的数据文件,虽然能恢复的可能性不大,不过假如这个数据库刚好执行了一个checkpoint的话,还是有可能成功的。 如果你没有好到有摸彩票的手气,最重要的数据库没有像你期盼的那样attach上去,不要气馁,还是有别的方案的。 我们可以试着重新建立一个log,先把数据库设置为emergency mode,sysdatabases的status为32768 就表示数据库处于此状态。 不过系统表是不能随便改的,设置一下先
    Use Master
    Go
    sp_configure 'allow updates', 1
    reconfigure with override
    Go
    然后
    update sysdatabases set status = 32768 where name = '<db_name>'
    现在,祈求满天神佛的保佑吧,重新建立一个log文件。成功的机会还是相当大的,系统一般都会认可你新建立的日志。如果没有报告什么错误,现在就可以松一口气了。 虽然数据是恢复了,可是别以为事情就算完成了,正在进行的事务肯定是丢失了,原来的数据也可能受到一些损坏。 先把SQL Server 重新启动一下,然后检查你的数据库吧。
    先设置成单用户模式,然后做dbcc
    sp_dboption '<db_name>', 'single user', 'true'
    DBCC CHECKDB('<db_name>')
    如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉。
    update sysdatabases set status = 28 where name = '<db_name>' --当然你的数据库状态可能不是这个,自己改为合适的值吧。也可以用sp_resetstatus
    go
    sp_configure 'allow updates', 0
    reconfigure with override
    Go checkdb的时候可能报告有一些错误,这些错误的数据你可能就只好丢弃了。
    checkdb有几种修复选项,自己看着用吧,不过最后你可能还是得用REPAIR_ALLOW_DATA_LOSS,完成所有修复。
    chekcdb并不能完成所有的修复,我们需要更进一步的修复,用DBCC CHECKTABLE对每一个表做检查吧。
    表的列表可以用sysobjects里面得到,把OBJECTPROPERTY是IsTable的全部找出来检查一下吧,这样能够基本上解决问题了,如果还报告错误,试着把数据select into到另一张表检查一下。
    这些都做完了之后,把所有索引、视图、存储过程、触发器等重新建立一下。DBCC DBREINDEX也许可以帮你一些忙。 然后,就可以向boss吹嘘一下你的丰功伟业,顺便小小的提一下加薪的要求,如果(很有可能)不得逞的话,也只好回家睡觉去:'(
    记得下次别忘了做好备份哦~ 
     
      

  2.   

    samfeng_2003(风云)
    你的方法我试过了,没成功,能否联系我帮我给弄弄,有酬谢。
      

  3.   

    呵呵!你开个分高的帖子,请皱大哥这样的高手帮帮你吧!因为你的数据库文件在雷击的时候系统崩溃留下来的,所以数据库文件应该存在着脏页这些信息。如果上面的方法通过不了,你把你的那数据库的date和log文件保存到其他地方,然后新建一个数据库以后,你把数据库通过exec sp_detach_db '新建的数据库名' 来分解了!然后,你用你的以前的文件来替换该数据库的date和log文件。然后你再用 exec sp_attach_db的方式来附加看行不行。
      

  4.   


    samfeng_2003(风云)
    我用你上面的方法:提示如下:
    《文件 'D:\1\YBHSP_Data.MDF' 的文件头不是有效的数据库文件头。PageAudit 属性不正确。》
    好像数据库的文件头坏了,是不是没办法了。
      

  5.   

    你也别太灰心。我查找了几个国外的站点,发现了一些信息。
    http://www.mcse.ms/archive81-2004-6-817585.html
    这个帖子和你问题一样,但是没有找到解决办法,但是最后一个回复指到的地址
    http://www.officerecovery.com/mssql/
    有个叫做Recovery for SQL Server 的软件
    好象能够修复一些mdf文件,你去看看吧!
    You can try to create a database with the same file locations as the original database, stop SQL Server, replace files and start SQL Server.
    If your database would be connected, you can use DBCC commands.But if you didn't recover files correctly, you cannot use normal methods.The correct MDF header (hex) - MSSQL2K SP3
    还有个老外让别人创建一个新的同名数据库本地文件大概设置和你最初的相同。然后停止sql server,直接把文件替换掉,然后开始启动sqlserver,如果能够连接的话,那么你通过DBCC来更改数据库的属性试试。
      

  6.   

    http://www.ttdown.com/SoftView/SoftView_8467.html
    这里有个2.1版本的,我本想找个1.5的,因为有注册机。你看能不能用?:)