细化解析:带你轻松接触—重置置疑状态
来源:岁月联盟
时间:2007-10-12
如果 SQL Server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复,那么 Microsoft® SQL Server™ 2000 会返回错误 1105 并且将 sysdatabases 中的 status 列设为置疑。按下面的步骤解决这个问题:
·执行 sp_resetstatus。
·用 ALTER DATABASE 向数据库添加一个数据文件或日志文件。
·停止并重新启动 SQL Server。
用新的数据文件或日志文件所提供的额外空间,SQL Server 应该能完成数据库的恢复。
·释放磁盘空间并且重新运行恢复操作。
sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。
注意 只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用 sp_resetstatus。否则,可能会损坏数据库。
由于该过程修改了系统表,系统管理员必须在创建这个过程前,启用系统表更新。要启用更新,使用下面的过程:
USE masterGOsp_configure 'allow updates', 1GORECONFIGURE WITH OVERRIDEGO |
过程创建后,立即禁用系统表更新:
sp_configure 'allow updates', 0GORECONFIGURE WITH OVERRIDEGO |
只有系统管理员才能执行 sp_resetstatus。执行该过程后,立即关闭 SQL Server。
语法为:
sp_resetstatusdatabase_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_resetstatusGOCREATE PROC sp_resetstatus @dbname varchar(30) ASDECLARE @msg varchar(80)IF @@trancount > 0BEGINPRINT 'Can''t run sp_resetstatus from within a transaction.'RETURN (1) ENDIF suser_id() != 1 BEGIN SELECT @msg = 'You must be the System Administrator (SA)'SELECT @msg = @msg + ' to execute this procedure.'RETURN (1) ENDIF (SELECT COUNT(*) FROM master..sysdatabases WHERE name = @dbname) != 1 BEGIN SELECT @msg = 'Database ' + @dbname + 'does not exist!'PRINT @msg RETURN (1) ENDIF (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) ENDBEGIN TRAN UPDATE master..sysdatabases SET status = status ^ 256 WHERE name = @dbname IF @@error != 0 OR @@rowcount != 1ROLLBACK 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 ''ENDGO |
(责任编辑:卢兆林)