项目场景:

SQLSERVER 2012



问题描述

1、服务器意外断电
2、SqlServer数据库恢复挂起状态
3、SqlServer数据库操作过程意外分离数据库
4、SqlServer数据库分离后导致无法附加


解决步骤

1、创建一个空数据库,命名采用“问题数据库“名称

建议在其他空闲服务器或设备上进行此操作,数据库修复完成后再拷贝到原服务器附加。

2、停止 MSSQLSERVER服务

3、将“问题数据库”替换到空数据库位置

4、启动MSSQLSERVER服务

5、将数据库设置为单用户模式和紧急模式

将test替换为对应数据库名称

alter database test set single_user
alter database test set emergency
  • 1.
  • 2.

6、执行步骤5若出现数据库无法访问报错执行以下步骤

将数据库文件权限添加EveryOne完全修改权限,继续步骤5

7、执行数据库修复指令

将test替换为对应数据库名称

USE master
GO
ALTER DATABASE test SET SINGLE_USER
GO
ALTER DATABASE test SET EMERGENCY
GO
DBCC CHECKDB(test,REPAIR_ALLOW_DATA_LOSS)
go
ALTER DATABASE test SET ONLINE
GO
ALTER DATABASE test SET MULTI_USER
GO
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

8、执行修复报错无法放置锁错误,排查后发现是有用户占用,执行以下命令

将test替换为对应数据库名称,kill掉占用进程后继续步骤7。

USE master;
GO
DECLARE @SQL VARCHAR(MAX);
SET @SQL=''
SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID)
FROM master..sysprocesses
WHERE dbid=DB_ID('test');

EXEC(@SQL);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

9、修复完成后重新附加数据库到原位置,问题解决。

END...