由于会话处于终止状态,因此无法继续执行。在建立聚集索引时

use*_*235 5 sql-server sql-server-2012

尝试创建聚簇索引时出现以下错误

该语句已终止。
消息596,级别21,状态1,第0行
无法继续执行,因为会话处于终止状态。

消息0,级别20,状态0,行0
当前命令发生严重错误。结果(如果有的话)应丢弃。

索引是:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

CREATE CLUSTERED INDEX IX_CO_DES_INPUT 
ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME)
          WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
               ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

ALTER TABLE dbo.CO_DES_INPUT 
  SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Run Code Online (Sandbox Code Playgroud)

我在用


Windows NT 6.3(内部版本9600 :)上的Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)标准版(64位)

我跑了

DBCC CheckDB ('concept-test') WITH NO_INFOMSGS, ALL_ERRORMSGS  
Run Code Online (Sandbox Code Playgroud)

它没有发现任何问题

由于收到此错误,恐怕数据库已损坏。我该如何纠正我的问题并将此索引放在桌子上?

谢谢

And*_*uin 6

导致该状态的常见原因有:

  • 系统无法打开数据或日志文件所在的设备
  • 在创建或打开物理设备期间找不到指定的文件
  • SQL Server在事务中间崩溃
  • 由于安装了防病毒软件,因此在联机时无法访问数据或日志文件
  • 数据库服务器被非法关闭
  • 磁盘空间不足,无法写入
  • SQL无法完成回滚或前滚操作
  • 数据库文件被第三方备份软件锁定

怎么解决

首先找出问题的原因。请返回上一步,并检查是否由上述原因引起。例如,没有足够的磁盘空间。

对于根本原因,我们必须首先解决根本问题,然后修复数据库。

包括:

  • 检查系统是否更新,是否存在严重的安全风险,是否存在黑客攻击
  • 检查系统电源是否稳定
  • 检查磁盘空间是否足够
  • 检查数据库文件是否具有对数据库进程的读写权限
  • 检查是否安装了第三方防病毒软件
  • 检查是否安装了第三方备份软件
  • 尝试将数据库文件安装到另一台计算机

如果您解决了基本问题,则可以按照以下步骤操作。请注意,在启动之前,如果数据库是虚拟机,则强烈建议使用虚拟机快照。

10步修复方法

1.打开SSMS

打开SSMS并连接到失败的SQL Server实例。

2.准备执行SQL

查找处于可疑状态的数据库,并注意不要扩展它。只需创建一个新查询即可。

3.将数据库设置为紧急状态

执行以下SQL

EXEC sp_resetstatus database_name;
ALTER DATABASE database_name SET EMERGENCY
Run Code Online (Sandbox Code Playgroud)

这会将数据库设置为紧急情况,以允许进一步修复。

4.在数据库上运行错误扫描

执行以下SQL

DBCC CHECKDB (database_name)
DBCC CHECKCATALOG (database_name)
Run Code Online (Sandbox Code Playgroud)

这将在当前故障数据库上运行故障扫描。您可能会发现很多失败。这些错误可以依次检查。请注意,此步骤不会修复任何错误。

5.准备修复

要运行数据库修复脚本,必须将数据库设置为单个用户。这也可以防止可能正在维修的其他人意外进入。

同时,我们要回滚最近的事务,因为最后的事务一定失败了,并且最后的事务很可能导致数据库失败。

ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

6.运行修复程序

DBCC CHECKDB (database_name, REPAIR_FAST) -- quick fix
DBCC CHECKDB (database_name, REPAIR_REBUILD) -- reset index
DBCC CHECKDB (database_name, REPAIR_ALLOW_DATA_LOSS) -- Allows correction of missing data
DBCC CHECKALLOC (database_name, REPAIR_REBUILD) -- Fixed allocation problem
DBCC DBREINDEX (database_name, REPAIR_REBUILD) -- fix index problem
Run Code Online (Sandbox Code Playgroud)

上面的代码将尝试修复数据库错误。如果您在执行过程中遇到障碍,请查看本文末尾有关高频问题的章节。

请注意,在上面的代码中,REPAIR_ALLOW_DATA_LOSS表示允许为了修复数据库而丢弃数据。第六步可能会花费很长时间,而大约30GB的数据库通常会花费几个小时。需要耐心等待。

运行上述SQL可能无法完全解决。您可以使用以下SQL多次修复该错误。

DECLARE @Number INT = 1 ;
While @Number < = 10
Begin
PRINT @Number;
SET @Number = @Number + 1 ;
DBCC CHECKDB(database_name, REPAIR_ALLOW_DATA_LOSS)
End
Run Code Online (Sandbox Code Playgroud)

7.重新允许与数据库的多用户连接

此时,数据库已还原。我们可以重新允许与数据库的多个连接。

ALTER DATABASE database_name SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)

8.现在备份

此时,数据库已达到可用状态。应该立即备份数据库以导出可用数据状态的副本。如果数据库是虚拟机,建议在备份的同时拍摄快照。

同时,建议重新启动整个数据库服务器,并在重新启动后检查数据库是否仍然正常。这是为了避免重复数据库泄漏的可能原因。

9.检查数据

可用数据可用后,我们可以检查当前数据库状态是否为较新状态。

10.修正其他错误

在上述过程结束时,尽管大多数数据已经可用,但是数据库中仍然存在更多错误。

您可以使用以下SQL查看这些错误:

DBCC CHECKDB (database_name)
Run Code Online (Sandbox Code Playgroud)

如果要修复此部分错误,可以尝试备份然后还原备份,这可能可以解决此部分问题。

常问问题

当数据库处于单用户状态时,我们将无法离开当前连接。因为一旦我们离开,可能会直接占用其他连接。

在这种情况下,我们必须手动终止冲入的其他连接,以确保我们是操作数据库的唯一用户。

方法如下:

首先执行以下SQL

Select d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame
  From sysprocesses p inner join sysdatabases d on p.dbid = d.dbid
 Where d.name = 'testdb01'
Go
Run Code Online (Sandbox Code Playgroud)

您将看到输出会话的列表,并找出传入连接的SPID。例如,SPID为51。

执行以下SQL

Kill 51
Go
Run Code Online (Sandbox Code Playgroud)

此时,我们可以继续在此单用户数据库上执行SQL。