无法打开数据库 'kq'。恢复操作已将该数据库标记为 SUSPECT。详细信息请参阅 SQL Server 错误日志。

时间:2021-12-20 11:39:16
连接数据库时报如下错误:
无法打开数据库 'kq'。恢复操作已将该数据库标记为 SUSPECT。详细信息请参阅 SQL Server 错误日志。
数据库已经标上了"置疑",请问该如何才能恢复数据库中的数据?

6 个解决方案

#1


数据库文件是不是被删除了.或是转移了目录.

#2


文件存在,目录也对的,文件名也没动.

#3


重置置疑状态
如果 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

#4


还是不行啊,利用事件查看器查看操作系统的应用程序事件,发现以下错误信息(数据库是kq,xkq0502和xkq_dwcqtjfx是其中的两个表):
错误: 605,严重度: 21,状态: 1 试图从数据库 'kq' 中提取的逻辑页 (1:4713) 属于对象 'xkq0502',而非对象 'xkq_dwcqtjfx'。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8093) 中找到 RID '1630303031393538000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 4 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:271:14)。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8093) 中找到 RID '1630303031393538000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 4 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:271:14)。 
错误: 9001,严重度: 21,状态: 1 数据库 'kq' 的日志不可用。 
错误: 3314,严重度: 21,状态: 5 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345957:68:1)。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8092) 中找到 RID '1630303031393534000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 3 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:151:99)。 
错误: 3414,严重度: 21,状态: 1 数据库 'kq'(数据库 ID 7)未能恢复。请与技术支持联系。 

请各位帮忙看看还有没有办法恢复?

#5


是不是没办法了呀?客户的数据库出了这问题,丢失了很多数据!

#6


建议用备份数据恢复到稍早一点的时间再用日志文件恢复到当前时间.这样基本就没问题了.

#1


数据库文件是不是被删除了.或是转移了目录.

#2


文件存在,目录也对的,文件名也没动.

#3


重置置疑状态
如果 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

#4


还是不行啊,利用事件查看器查看操作系统的应用程序事件,发现以下错误信息(数据库是kq,xkq0502和xkq_dwcqtjfx是其中的两个表):
错误: 605,严重度: 21,状态: 1 试图从数据库 'kq' 中提取的逻辑页 (1:4713) 属于对象 'xkq0502',而非对象 'xkq_dwcqtjfx'。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8093) 中找到 RID '1630303031393538000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 4 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:271:14)。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8093) 中找到 RID '1630303031393538000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 4 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:271:14)。 
错误: 9001,严重度: 21,状态: 1 数据库 'kq' 的日志不可用。 
错误: 3314,严重度: 21,状态: 5 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345957:68:1)。 
错误: 644,严重度: 21,状态: 1 未能在索引页 (1:8092) 中找到 RID '1630303031393534000000304' 的索引条目(索引 ID 0,数据库 'kq')。 
错误: 3314,严重度: 21,状态: 3 撤消数据库 'kq' 的日志中记录的操作时出错。出错位置在日志记录 ID (345966:151:99)。 
错误: 3414,严重度: 21,状态: 1 数据库 'kq'(数据库 ID 7)未能恢复。请与技术支持联系。 

请各位帮忙看看还有没有办法恢复?

#5


是不是没办法了呀?客户的数据库出了这问题,丢失了很多数据!

#6


建议用备份数据恢复到稍早一点的时间再用日志文件恢复到当前时间.这样基本就没问题了.