美文网首页
记录一次暴力强制重启sqlserver后,数据库数据错误的cas

记录一次暴力强制重启sqlserver后,数据库数据错误的cas

作者: SixClock | 来源:发表于2019-03-07 20:03 被阅读0次

一次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

相关文章

网友评论

      本文标题:记录一次暴力强制重启sqlserver后,数据库数据错误的cas

      本文链接:https://www.haomeiwen.com/subject/bdihpqtx.html