如何在数据库文件损坏(日志文件完好)情况下,进行恢复数据库文件损坏的时候如何恢复
1 建一个测试数据库test(数据库类型为完全)
2 建一个表,插入点记录
  create table a(c1 varchar(2))
  go
  insert into a values('aa')
  go
  insert into a values('bb')
  go
3 作完全备份,到文件test_1.bak
4 在作一点修改
  insert into a values('cc')
  go
  create table b(c1 int)
  go
  insert into b values(1)
  go
  insert into b values(2)
  go
5 shutdown 数据库服务器
6 用ultraedit编辑数据库文件test_data.mdf,随便修改点字节内容
7 启动数据库,并且运行企业管理器,点开数据库,看到test变成灰色,而且显示置
疑。
8 运行isql -SLocalhost -Usa -P
1> backup log test TO DISK='D:\Program Files\Microsoft SQL
Server\MSSQL\BACKUP\t
est_2.bak' WITH NO_TRUNCATE
2>go
已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。
BACKUP LOG 操作成功地处理了 2 页,花费了 0.111 秒(0.087 MB/秒)。9 进行恢复最老的完全备份
1> RESTORE DATABASE test FROM DISK='D:\Program Files\Microsoft SQL
Server\MSSQLBACKUP\test_1.bak' WITH NORECOVERY
2> go
已处理 96 页,这些页属于数据库 'test' 的文件 'TEST_Data'(位于文件 1 上)。
已处理 1 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。
RESTORE DATABASE 操作成功地处理了 97 页,花费了 0.107 秒(7.368 MB/秒)。10 恢复最近的日志
1> RESTORE LOG test FROM DISK='D:\Program Files\Microsoft SQL
Server\MSSQL\BACKU
P\test_2.bak' WITH RECOVERY
2> go
已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。
RESTORE LOG 操作成功地处理了 2 页,花费了 0.056 秒(0.173 MB/秒)。数据已经完全恢复了,可以使用了。
select * from a
goselect * from b
go
c1
---- 
aa
bb
cc
有老的备份的话1 backup log db TO DISK='e:\db2.bak' WITH NO_TRUNCATE2 恢复最老的完全备份
RESTORE DATABASE db FROM DISK='e:\db1.bak' WITH NORECOVERY3  恢复最近的日志
RESTORE LOG db FROM DISK='e:\db2.bak' WITH RECOVERY

解决方案 »

  1.   

    修复SQLSERVER2000数据库之实战经验
    http://www.mscommunity.com/article/article.asp?old=0&id=669
      

  2.   

    谢谢 progress99(如履薄冰)!!我在拜读,小弟昨晚回去太晚,刚回来,先谢谢了!一会儿再向你请教!!
      

  3.   

    用 log explore ,非常不错。
      

  4.   

    ALTER DATABASE cati
    在执行操作:
    ADD FILE 
    (
     NAME = CCC_dat2,
     FILENAME = 'D:\Program Files\Microsoft SQL Server\MSSQL\Data\CCC_dat2.mdf',
     SIZE = 1000MB,
     FILEGROWTH = 20MB
    )
    GO
    提示错误:未能找到 ID 为 8 的数据库。可能该数据库尚未激活,也可能正在转换过程中。
      

  5.   

    我的MSN :[email protected] 欢迎大家直接给我联系一下,问题非常奇怪!!
      

  6.   

    --试试这样处理.停止SQL服务,备份有问题的这个数据库的数据文件及日志文件
    然后启动SQL服务,删除有问题的这个数据库
    接下来按下面的步骤处理: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
    Go sp_dboption '置疑的数据库名', 'single user', 'false'
    Go
      

  7.   

    错误 1105
    严重级别 17
    消息正文
    未能为数据库 ''%3!'' 中的对象 ''%1!'' 分配空间,因为文件组 ''%5!'' 已满。解释
    指定的文件组可用空间已用完。对策
    若要获得更多空间,可以释放包含完整文件组中的某个文件的任何磁盘驱动器上的磁盘空间,以允许组中的文件增长。或者可以将某数据文件用于指定的数据库来获得空间。释放磁盘空间
    可以释放本地驱动器或另一个磁盘驱动器上的可用磁盘空间。释放另一个驱动器上的可用磁盘空间: 将可用磁盘空间不足的文件组中的数据文件移动到另一个磁盘驱动器中。
    执行 sp_detach_db 分离数据库。
    执行 sp_attach_db 附加数据库,指向被移动的文件。 
    使用数据文件
    另一种解决方案是使用 ALTER DATABASE 语句的 ADD FILE 子句向指定的数据库添加数据文件。或者可以使用 ALTER DATABASE 语句的 MODIFY FILE 子句、指定 SIZE 和 MAXSIZE 语法来扩大数据文件。
      

  8.   

    多谢zjcxc(: 邹建 :) ,你的方法有效,我现在正在复制数据!真是非常感谢,小弟在这次事故处理中学到了很多东西!
    同时也谢谢progress99(如履薄冰)老兄,你的及时回答让我有了很大信心,以后还会向大家请教,我也会常来这里跟大家学习!
    谢谢各位参与的朋友!小弟正在复制数据库,有什么需要注意的,不妨提醒一下!!这个数据库里面的键值设置太多了,我先用导出SQL脚本,然后在导入数据,大家讨论一下,这样行吗?
    中场结论:
    用停止SQL服务,备份有问题的这个数据库的数据文件及日志文件
    然后启动SQL服务,删除有问题的这个数据库
    接下来按下面的步骤处理:1.新建一个同名的数据库2.再停掉sql server(注意不要分离数据库)3.用原数据库的数据文件覆盖掉这个新建的数据库4.再重启sql server5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
    数据库的脚本创建一个新的数据库,并将数据导进去就行了.这个方法有效!其他的因为我添加不了新数据或日志文件而失败!