Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254679
  • 博文数量: 52
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-03 08:39
文章分类
文章存档

2011年(4)

2010年(5)

2009年(6)

2008年(37)

我的朋友

分类: 数据库开发技术

2010-10-10 09:11:09

在执行最后一步dbcc checkdb(dbname) 检查完整性上出的错

服务器: 消息 8946,级别 16,状态 12,行 2
表错误: 分配页 (1:461016) 的 PFS_PAGE 页首结构值无效。类型为 0。请检查该页上的类型、对象 ID 和页 ID。
服务器: 消息 7995,级别 16,状态 1,行 1
数据库 'dbname' 在 sysobjects、sysindexes、syscolumns 或 systypes 中存在一致性错误,妨碍了进一步的 CHECKDB 处理。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

提问者: 风之辟尘 - 三级最佳答案备份数据文件,然后按下面的步骤处理: 
  
  1.新建一个同名的数据库(数据文件与原来的要一致) 
  
  2.再停掉sql   server(注意不要分离数据库) 
  
  3.用原数据库的数据文件覆盖掉这个新建的数据库 
  
  4.再重启sql   server 
  
  5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名) 
  
  6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用 
  数据库的脚本创建一个新的数据库,并将数据导进去就行了. 
  
  
  
  USE   MASTER 
  GO 
  
  SP_CONFIGURE   'ALLOW   UPDATES',1   RECONFIGURE   WITH   OVERRIDE 
  GO 
  
  UPDATE   SYSDATABASES   SET   STATUS   =32768   WHERE   NAME='置疑的数据库名' 
  Go 
  
  sp_dboption   '置疑的数据库名',   'single   user',   'true' 
  Go 
  
  DBCC   CHECKDB('置疑的数据库名')   
  Go 
  
  update   sysdatabases   set   status   =28   where   name='置疑的数据库名' 
  Go 
  
  sp_configure   'allow   updates',   0   reconfigure   with   override 
  Go   
  
  sp_dboption   '置疑的数据库名',   'single   user',   'false
假设数据库为TEST: 
  按以下步骤执行 
  
  
  A.设置数据库允许直接操作系统表。此操作可以在SQL   Server   Enterprise   Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。 
  use   master 
  go 
  sp_configure   'allow   updates',1 
  go   
  reconfigure   with   override 
  go 
  B.设置test为紧急修复模式 
  update   sysdatabases   set   status=-32768   where   dbid=DB_ID('test') 
  此时可以在SQL   Server   Enterprise   Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表 
  C.下面执行真正的恢复操作,重建数据库日志文件 
  dbcc   rebuild_log('test','C:\Program   Files\Microsoft   SQL   Server\MSSQL\Data\test_log.ldf') 
  执行过程中,如果遇到下列提示信息: 
  服务器:   消息   5030,级别   16,状态   1,行   1 
  未能排它地锁定数据库以执行该操作。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL   Server   Enterprise   Manager打开了test库的系统表,那么退出SQL   Server   Enterprise   Manager就可以了。 
  正确执行完成的提示应该类似于: 
  警告:   数据库   'test'   的日志已重建。已失去事务的一致性。应运行   DBCC   CHECKDB   以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  此时打开在SQL   Server   Enterprise   Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。 
  D.验证数据库一致性(可省略) 
  dbcc   checkdb('test') 
  一般执行结果如下: 
  CHECKDB   发现了   0   个分配错误和   0   个一致性错误(在数据库   'test'   中)。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  E.设置数据库为正常状态 
  sp_dboption   'test','dbo   use   only','false' 
  如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。 
  F.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL   Server   Enterprise   Manager里面恢复,也可以使用如下语句完成 
  sp_configure   'allow   updates',0 
  go   
  reconfigure   with   override 
  go
上面的语句操作步骤有点问题: 
  应该如下: 
  A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL   Server   Enterprise   Manager里面建立。 
  B.停掉数据库服务器。 
  C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。 
  D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。 
  E.设置数据库允许直接操作系统表。此操作可以在SQL   Server   Enterprise   Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。 
  use   master 
  go 
  sp_configure   'allow   updates',1 
  go   
  reconfigure   with   override 
  go 
  F.设置test为紧急修复模式 
  update   sysdatabases   set   status=-32768   where   dbid=DB_ID('test') 
  此时可以在SQL   Server   Enterprise   Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表 
  G.下面执行真正的恢复操作,重建数据库日志文件 
  dbcc   rebuild_log('test','C:\Program   Files\Microsoft   SQL   Server\MSSQL\Data\test_log.ldf') 
  执行过程中,如果遇到下列提示信息: 
  服务器:   消息   5030,级别   16,状态   1,行   1 
  未能排它地锁定数据库以执行该操作。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL   Server   Enterprise   Manager打开了test库的系统表,那么退出SQL   Server   Enterprise   Manager就可以了。 
  正确执行完成的提示应该类似于: 
  警告:   数据库   'test'   的日志已重建。已失去事务的一致性。应运行   DBCC   CHECKDB   以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  此时打开在SQL   Server   Enterprise   Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。 
  H.验证数据库一致性(可省略) 
  dbcc   checkdb('test') 
  一般执行结果如下: 
  CHECKDB   发现了   0   个分配错误和   0   个一致性错误(在数据库   'test'   中)。 
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。 
  I.设置数据库为正常状态 
  sp_dboption   'test','dbo   use   only','false' 
  如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。 
  J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL   Server   Enterprise   Manager里面恢复,也可以使用如下语句完成 
  sp_configure   'allow   updates',0 
  go   
  reconfigure   with   override 
  go

 18回答者: 格拉底欧拉 - 五级   2008-11-29 18:49


我来评论>> 相关内容
?  sql2000数据库(置疑)  1  2008-3-4
?  如何分析sql2000数据库置疑的原因  3  2008-10-10
?  SQL2000数据库在操作过程中突然断电引起的置疑?  1  2006-7-22
?  谁有修复SQL2000数据库文件(.mdf和.ldf)的工具?  2010-6-12
?  SQL2000数据库不能备份如何修复  2008-11-5
  更多关于sql 数据库 置疑的问题>>
查看同主题问题: sql2000 数据库 数据库 置疑 修复 

等待您来回答更多
1回答 20 谁给我个dnf好感度查询器啊 能自动送礼物的那种!!!!!!! 1回答 大家推荐一个诺基亚5230电影播放器啊!要放f4v不卡的!用uc会卡! 2回答 50 您好,邵老师,我梦见家里墙倒向外侧,请问这是? 0回答 南京新港叉车工培训机构有哪些 0回答 能把《周瞳探案四剥皮者》第12章 情难自禁(3)开始,到最新的章节发... 0回答 求诺基亚手机主题的下载网站,谢谢 2回答 我爱上了拜托了老师里得老师,做梦还梦见了,咋办啊 0回答 南京新港开发区乐金显示南京有限公司的邮寄地址是什么
其他回答    共 4 条
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL   Server   Enterprise   Manager里面建立。  
  B.停掉数据库服务器。  
  C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。  
  D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。  
  E.设置数据库允许直接操作系统表。此操作可以在SQL   Server   Enterprise   Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。  
  use   master  
  go  
  sp_configure   'allow   updates',1  
  go    
  reconfigure   with   override  
  go  
  F.设置test为紧急修复模式  
  update   sysdatabases   set   status=-32768   where   dbid=DB_ID('test')  
  此时可以在SQL   Server   Enterprise   Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表  
  G.下面执行真正的恢复操作,重建数据库日志文件  
  dbcc   rebuild_log('test','C:\Program   Files\Microsoft   SQL   Server\MSSQL\Data\test_log.ldf')  
  执行过程中,如果遇到下列提示信息:  
  服务器:   消息   5030,级别   16,状态   1,行   1  
  未能排它地锁定数据库以执行该操作。  
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。  
  说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL   Server   Enterprise   Manager打开了test库的系统表,那么退出SQL   Server   Enterprise   Manager就可以了。  
  正确执行完成的提示应该类似于:  
  警告:   数据库   'test'   的日志已重建。已失去事务的一致性。应运行   DBCC   CHECKDB   以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。  
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。  
  此时打开在SQL   Server   Enterprise   Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。  
  H.验证数据库一致性(可省略)  
  dbcc   checkdb('test')  
  一般执行结果如下:  
  CHECKDB   发现了   0   个分配错误和   0   个一致性错误(在数据库   'test'   中)。  
  DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。  
  I.设置数据库为正常状态  
  sp_dboption   'test','dbo   use   only','false'  
  如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。  
  J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL   Server   Enterprise   Manager里面恢复,也可以使用如下语句完成  
  sp_configure   'allow   updates',0  
  go    
  reconfigure   with   override  
  go

回答者: clanboo - 七级   2008-11-29 16:33


1.新建一空数据库,点空数据库所有任务,选择导入数据,数据源选择问题库,目标空数据库!注意要选择"在SQL之间复制对象或数据".选择全部的表复制过去即可
2.如果还是不行,那只有用dbcc checkdb('dbname',repair_allow_data_loss)修复受损库.但是可能会丢失数据!

回答者: 16956995 - 三级   2008-12-2 08:40


数据库出问题、客户告急、修复中、、没修好、数据要完蛋、、本想放弃、、不甘心、继续、、鼓捣半天终于搞定、、 过程如下:
sql2000 表损坏时提示 select * from A 时提示 连接中断、、、、
 1:首先将数据库设置成单用户模式。可以在企业管理器里选择数据库然后右键-属性-选项里改为单用户模式。or执行语句:
   sp_dboption   '数据库名','single user','true'
   go   
 2:执行DBCC CHECKDB(数据库名)
 3: 有错误提示继续执行:DBCC CHECKTABLE('表名',,REPAIR_ALLOW_DATA_LOSS) 如果出错的表多 那就执行这句:

    select 'DBCC CHECKTABLE('+''''+name+''''+',REPAIR_ALLOW_DATA_LOSS)'+'' from sysobjects where xtype='u'
然后copy出来 在查询分析器里执行即可。

这样修复数据库表容易丢失数据 不过没办法还没想到更好的方法。、、、

回答者: ★菜鸟也疯狂★ - 三级   2008-12-3 11:31


这和我遇到的问题是一样的,
可以使用下面的方法进行修复(需要将数据库名修改成你的数据库名):
--MyDB为修复的数据名
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
ALTER DATABASE MyDB SET EMERGENCY
GO
sp_dboption 'MyDB', 'single user', 'true'
GO
DBCC CHECKDB('MyDB','REPAIR_ALLOW_DATA_LOSS')
GO
ALTER DATABASE MyDB SET ONLINE
GO
sp_configure 'allow updates', 0 reconfigure with override
GO
sp_dboption 'MyDB', 'single user', 'false'
GO

阅读(5785) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~