一次sqlserver数据库因内存占用过高,导致某些数据库连接超时,于是强制重启后,checkdb后报告数据库存在多处错误,以下是解决方案:
1.检查数据库以及表
USE 'DBname'
GO
DBCC CHECKDB
USE DBNAME
GO
DBCC CHECKTABLE('TableName')
2.修复有错误的数据库
USE MASTER
---如果是数据库是“多用户模式”,先修改为“单用户模式”
ALTER DATABASE 'DBname' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CHECKDB('DBname',REPAIR_ALLOW_DATA_LOSS)
DBCC CHECKDB('DBname',REPAIR_REBUILD)
--还原"多用户模式"
ALTER DATABASE 'DBname' SET MULTI_USER WITH ROLLBACK IMMEDIATE
3.修复有错误的表
USE 'DBname'
GO
---如果是数据库是“多用户模式”,先修改为“单用户模式”
ALTER DATABASE 'DBname' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DECLARE @TableName VARCHAR(255)
SET @TableName='TableName'
DBCC CHECKTABLE(@TableName,REPAIR_ALLOW_DATA_LOSS)
DBCC CHECKTABLE(@TableName,REPAIR_REBUILD)
/*如果还有问题,修复索引表
DBCC DBREINDEX('TableName')
DBCC CHECKTABLE('TableName')
*/
--还原"多用户模式"
ALTER DATABASE 'DBname' SET MULTI_USER WITH ROLLBACK IMMEDIATE
4.循环操作
使用第一步查询,确认错误是否仍然还在。原因:有些错误只有多用户模式下才存在,单用户模式没有错误,所以最后需要在多用户模式下重新检查;
5.注意
如果设置数据库为单用户模式后,重新设置多用户模式时提示错误,可以强制杀掉该数据库的模式实例
USE MASTER
DECLARE @kid VARCHAR(8000)
SET @kid=''
SELECT @kid=@kid+' kill '+CAST(SPID AS VARCHAR(8))
FROM MASTER..sysprocesses
WHERE DBID=DB_ID('DBname')
Exec(@kid)
--更改成多用户模式:
ALTER DATABASE DBname SET MULTI_USER