无法继续执行,因为会话处于kill状态。同时构建聚集索引

时间:2016-11-06 13:42:52

标签: sql-server sql-server-2012

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

  

声明已经终止   Msg 596,Level 21,State 1,Line 0
  无法继续执行,因为会话处于kill状态   州。

     

消息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

我正在使用

  

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

我跑了

DBCC CheckDB ('concept-test') WITH NO_INFOMSGS, ALL_ERRORMSGS  

并且没有发现任何问题

因为我收到此错误,我担心我的数据库已损坏。如何更正我的问题并将此索引放在桌面上?

由于

6 个答案:

答案 0 :(得分:2)

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

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

如何解决

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

从根本上来说,我们必须首先解决根本问题,然后修复数据库。

包括:

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

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

10步修复方法

1。打开SSMS

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

2。准备执行SQL

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

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

执行以下SQL

EXEC sp_resetstatus database_name;
ALTER DATABASE database_name SET EMERGENCY

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

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

执行以下SQL

DBCC CHECKDB (database_name)
DBCC CHECKCATALOG (database_name)

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

5。准备修复

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

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

ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

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

请注意,在上面的代码中,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

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

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

ALTER DATABASE database_name SET MULTI_USER

8。立即备份

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

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

9。检查数据

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

10。修复其他错误

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

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

DBCC CHECKDB (database_name)

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

常见问题解答

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

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

方法如下:

首先执行以下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

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

执行以下SQL

Kill 51
Go

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

答案 1 :(得分:0)

Anduin接受的答案是正确的答案,这是出于人们搜索的利益。如果发生这种情况

  1. 您缺少临时表,并且
  2. 您已经打电话给RAISERROR(原文如此),表明表丢失了

“由于会话处于终止状态而无法继续执行”具有误导性(因为这意味着您的连接会话已失效;您仍处于连接状态),并且会将您发送到此类帖子。但是,在输出的前面,您将看到实际上正在抛出的异常消息。只需忽略分散注意力的令人恐惧的消息,该消息会使您将注意力从实际问题上转移开来。

示例:

SQL代码:

IF OBJECT_ID('tempdb..##example') IS NULL
BEGIN -- include ##example
  RAISERROR('ERROR: table ##example not loaded', 20, -1) WITH LOG
  -- This is often done to give intellisense hints when including tables
  CREATE TABLE ##example(ID INT, mydata VALUE)
END -- include ##example

错误消息:

Msg 2745, Level 16, State 2, Line 3
Process ID 57 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 3
ERROR: table ##example not loaded
Msg 596, Level 21, State 1, Line 0
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.
Completion time: 2019-11-27T08:28:21.1089985-07:00`

答案 2 :(得分:0)

  1. 备份数据库
  2. 分离数据库
  3. 删除数据库日志文件
  4. 附加数据库

答案 3 :(得分:0)

我的回答是针对发生在我身上的情况,希望对您有用! 当我运行删除行查询时,在您的问题中得到提到的错误。 我们的团队使用Sql Server历史记录(临时表)来审核所有数据。 通过禁用数据库中的所有历史记录表,查询可以很好地执行而不会出现任何错误。 我想您在数据库中有一个约束或配置会阻止执行查询,因此sql会显示此不清楚的消息。

答案 4 :(得分:0)

类似于sajjad的问题,我在SQL Server 2017中使用临时表时遇到此错误。我从头开始复制了它。以下是我管理的最小示例。升级到SQL Server 2019解决了我的问题。

USE master
DROP DATABASE IF EXISTS MyTest
GO 
CREATE DATABASE MyTest
GO 
USE MyTest

CREATE TABLE MyParent (
    ID int NOT NULL,
    CONSTRAINT [PK_TestGroupDetails] PRIMARY KEY (ID)
);

CREATE TABLE MyChild (
    ID int NOT NULL,
    MyParentID int NOT NULL,
    Dummy BIT NOT NULL,
    SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START, 
    SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
    CONSTRAINT [PK_Child] PRIMARY KEY (ID),
    CONSTRAINT [FK_Parent] FOREIGN KEY (MyParentID) REFERENCES MyParent (ID) ON DELETE CASCADE
);

-- To avoid the "Cannot continue the execution because the session is in the kill state", I can do any of the following:
-- Remove this DROP COLUMN line only
-- Remove all references to the Dummy column
-- Remove the Dummy column from the initial CREATE TABLE, and uncomment the ADD line below 
-- Move this DROP COLUMN line so that it occurs after the SET (SYSTEM_VERSIONING = ON)
-- Remove the ON DELETE CASCADE
--ALTER TABLE MyChild ADD Dummy BIT 
ALTER TABLE MyChild DROP COLUMN Dummy

ALTER TABLE MyChild SET (SYSTEM_VERSIONING = ON)

DELETE FROM MyParent

答案 5 :(得分:0)

就我而言,我的磁盘空间不足。我右键单击数据库,选择任务,然后缩小数据库。这使数据库大小减少了50%。我重试了命令,它起作用了。