修复SQL2000数据库置疑时出现的错误

在执行最后一步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输出了错误信息,请与系统管理员联系。

提问者:风之辟尘-三级最佳答案备份数据文件,然后按下面的步骤处理:

新建一个同名的数据库(数据文件与原来的要一致)

再停掉sql server(注意不要分离数据库)

用原数据库的数据文件覆盖掉这个新建的数据库

再重启 sql server

此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改 其中的数据库名)

完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问

题,解决办法是,利用

数据库的脚本创建一个新的数据库,并将数据导进去就行了 .

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 n ame='置疑的

数据库名’

Go

sp_c on figure 'allow updates', 0 rec on figure with overr

de

Go

sp_dboption '置疑的数据库名','single user', 'false

假设数据库为TEST

按以下步骤执行

A ?设置数据库允许直接操作系统表。此操作可以在

SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择

“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。

也可以使用如下语句来实现。

use master

go

sp_c on figure 'allow updates',1

go

rec on figure with override

go

B ?设置test为紧急修复模式

update sysdatabases set status=-32768 where dbid=DB_ID('

test')

此时可以在SQL Server Enterprise Manager里面看到该数据库处于

“只读置疑脱机紧急模式”可以看到数据库里面的表,但是仅仅有系统表

C ?下面执行真正的恢复操作,重建数据库日志文件

dbcc rebuild」og('test','C:\Program Files\Microsoft SQL Se rver\MSSQL\Data\test_log.ldf)

执行过程中,如果遇到下列提示信息:

服务器: 消息5030,级别16,状态1,行1

未能排它地锁定数据库以执行该操作。

DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。

说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用

SQLServerEnterpriseManager打开了 test库的系统表,那么退出

SQLServerEn terpriseMan ager就可以了。

正确执行完成的提示应该类似于:

警告: 数据库'test'的日志已重建。已失去事务的一致性。应运

行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可 能需要删除多余的日志文件。

DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。

此时打开在SQL Server Enterprise Manager里面会看到数据库的状

态为“只供DBO使用”。此时可以访问数据库里面的用户表了。

D ?验证数据库一致性(可省略)

dbcc checkdb('test')

一般执行结果如下:

CHECKDB发现了 0个分配错误和 0个一致性错误(在数据

库'test'中)。

DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。

E ?设置数据库为正常状态

sp_dbopti on 'test','db