尝试创建聚簇索引时出现以下错误
声明已经终止 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
并且没有发现任何问题
因为我收到此错误,我担心我的数据库已损坏。如何更正我的问题并将此索引放在桌面上?
由于
答案 0 :(得分:2)
导致该状态的常见原因是:
首先查找问题的原因。请返回上一步,并检查是否由上述原因引起。例如,没有足够的磁盘空间。
从根本上来说,我们必须首先解决根本问题,然后修复数据库。
包括:
如果您解决了基本问题,则可以执行以下步骤。请注意,在启动之前,如果数据库是虚拟机,则强烈建议使用虚拟机快照。
打开SSMS并连接到失败的SQL Server实例。
找到可疑状态的数据库,并注意不要扩展它。只需创建一个新查询即可。
执行以下SQL
EXEC sp_resetstatus database_name;
ALTER DATABASE database_name SET EMERGENCY
这会将数据库设置为紧急情况,以允许进一步修复。
执行以下SQL
DBCC CHECKDB (database_name)
DBCC CHECKCATALOG (database_name)
这将在当前故障数据库上运行故障扫描。您可能会发现很多失败。这些错误可以依次检查。请注意,此步骤不会修复任何错误。
要运行数据库修复脚本,必须将数据库设置为单个用户。这也可以防止可能正在维修的其他人意外进入。
同时,我们要回滚最近的事务,因为最后一个事务一定失败了,并且很可能最后一个事务导致了数据库失败。
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE
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
此时,数据库已还原。我们可以重新允许与数据库的多个连接。
ALTER DATABASE database_name SET MULTI_USER
此时,数据库已达到可用状态。应该立即备份数据库以导出可用数据状态的副本。如果数据库是虚拟机,建议与备份同时拍摄快照。
同时,建议重新启动整个数据库服务器,并在重新启动后检查数据库是否仍然正常。这是为了避免重复数据库泄漏的可能原因。
在可用数据可用之后,我们可以检查当前数据库状态是否为较新状态。
在上述过程结束时,尽管大多数数据已经可用,但是数据库中仍然存在更多错误。
您可以使用以下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接受的答案是正确的答案,这是出于人们搜索的利益。如果发生这种情况
“由于会话处于终止状态而无法继续执行”具有误导性(因为这意味着您的连接会话已失效;您仍处于连接状态),并且会将您发送到此类帖子。但是,在输出的前面,您将看到实际上正在抛出的异常消息。只需忽略分散注意力的令人恐惧的消息,该消息会使您将注意力从实际问题上转移开来。
示例:
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)
答案 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%。我重试了命令,它起作用了。