数据库置疑修复评析

  • 格式:doc
  • 大小:33.50 KB
  • 文档页数:14

数据库置疑修复[评析]

数据库置疑修复

数据库置疑的解决方法:

(1):如果是严重的置疑,就这样解决 停止SQL服务,备份你的置疑的数据库的数据文件(直接将MDF,LDF文件拷贝出去就可以).

然后启动SQL服务,再删除置疑的数据库

然后按下面的步骤处理:

1.新建一个同名的数据库

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

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

4.再重启sql server

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

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'

Go

------------------------------------------------------------------------------------------------------------------------

(2)

重置置疑状态

如果 SQL Server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复,那么 Microsoft? SQL Server? 2000 会返回错误 1105 并且将 sysdatabases

中的 status 列设为置疑。按下面的步骤解决这个问题:

执行 sp_resetstatus。

用 ALTER DATABASE 向数据库添加一个数据文件或日志文件。

停止并重新启动 SQL Server。

用新的数据文件或日志文件所提供的额外空间,SQL Server 应该能完成数据库的恢复。 释放磁盘空间并且重新运行恢复操作。 sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。

注意 只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用 sp_resetstatus。否则,可能会损坏数据库。

由于该过程修改了系统表,系统管理员必须在创建这个过程前,启用系统表更新。要启用更新,使用下面的过程:

USE master

GO

sp_configure 'allow updates', 1 GO

RECONFIGURE WITH OVERRIDE GO

过程创建后,立即禁用系统表更新:

sp_configure 'allow updates', 0 GO

RECONFIGURE WITH OVERRIDE GO

只有系统管理员才能执行 sp_resetstatus。执行该过程后,立即关闭 SQL

Server。

语法为:

sp_resetstatus database_name

下面的例子将关闭 PRODUCTION 数据库的置疑标志。

sp_resetstatus PRODUCTION

下面是结果集:

Database 'PRODUCTION' status reset! WARNING: You must reboot SQL

Server prior to accessing this

database!

sp_resetstatus 存储过程代码 下面是 sp_resetstatus 存储过程的代码:

IF EXISTS ( SELECT * from sysobjects where name = 'sp_resetstatus' )

DROP PROCEDURE sp_resetstatus

GO

CREATE PROC sp_resetstatus @dbname varchar(30) AS

DECLARE @msg varchar(80)

IF @@trancount > 0

BEGIN

PRINT 'Can''t run sp_resetstatus from within a transaction.'

RETURN (1)

END

IF suser_id() != 1

BEGIN

SELECT @msg = 'You must be the System Administrator

(SA)'

SELECT @msg = @msg + ' to execute this procedure.'

RETURN (1)

END

IF (SELECT COUNT(*) FROM master..sysdatabases

WHERE name = @dbname) != 1

BEGIN

SELECT @msg = 'Database ' + @dbname + ' does not exist!'

PRINT @msg

RETURN (1) END

IF (SELECT COUNT(*) FROM master..sysdatabases

WHERE name = @dbname AND status & 256 = 256) != 1

BEGIN

PRINT 'sp_resetstatus can only be run on suspect databases.'

RETURN (1)

END

BEGIN TRAN

UPDATE master..sysdatabases SET status = status ^ 256

WHERE name = @dbname

IF @@error != 0 OR @@rowcount != 1

ROLLBACK TRAN

ELSE

BEGIN

COMMIT TRAN

SELECT @msg = 'Database ' + @dbname + ' status reset!'

PRINT @msg

PRINT ''

PRINT 'WARNING: You must reboot SQL Server prior to '

PRINT ' accessing this database!'

PRINT ''

END

GO

----------------------------------------------------------- ---------------------------------

(3)

在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因:

1.错误的删除日志;

2.硬件(HD)损坏,造成日志和数据文件写错误;

3.硬盘的空间不够,比如日志文件过大;

解决办法:

这是最简单的办法是有数据库的全备份,然后恢复即可.

步骤:

1. 删除原始的数据库:

USE MASTER

GO

DROP DATABASE DB_SUEPECT

2.建立同名的数据库:

USE master

GO

CREATE DATABASE DB_SUSPECT

ON

( NAME = DBNAME_DAT,

FILENAME = 'C:',

SIZE = 10,

FILEGROWTH = 5 )

LOG ON ( NAME = 'DBNAME_LOG',

FILENAME = 'g:',

SIZE = 5MB,

FILEGROWTH = 5MB )

GO

3.恢复数据库:

RESTORE DATABASE DB_SUSPECT

FROM DBNAME_BACKUP.DAT

4.数据库完整性检测:

DBCC CHECKDB('DB_SUSPECT')

5.重新启动MSSQLSERVER服务.

如果没有全备份,那就要用一些特殊的方法:

1.设置数据库为紧急模式

Use Master

GO

sp_configure 'allow updates', 1

reconfigure with override

GO

UPDATE sysdatabases SET status = 32768 where name =

'DB_SUSPECT'

GO

2.停掉SQL Server服务:

NET STOP MSSQLSERVER

3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走: 4.启动SQL Server服务:

NET START MSSQLSERVER

5.重新建立一个同名的数据库DB_SUSPECT;

USE master

GO

CREATE DATABASE DB_SUSPECT

ON

( NAME = DBNAME_DAT,

FILENAME = 'C:',

SIZE = 10,

FILEGROWTH = 5 )

LOG ON

( NAME = 'DBNAME_LOG',

FILENAME = 'g:',

SIZE = 5MB,

FILEGROWTH = 5MB )

GO

6.设置数据库运行在单用户的模式:

USE MASTER

GO

ALTER DATABASE DB_SUSPECT SET SINGLE_USER

GO

7.停掉SQL服务:

NET STOP MSSQLSERVER