美文网首页
记录一次暴力强制重启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