数据库置疑修复评析
- 格式: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