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


11

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

该语句已终止。
消息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

我正在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  

它没有发现任何问题

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


当我在同一张表上添加非聚集索引时,我确实得到了相同的错误。我尝试先添加非群集。我得到这个错误。所以我认为我可能有索引损坏,并尝试删除所有索引并重新创建它们。那是当我收到我最初发布的错误消息时。我可能会补充说,Idera SQL完整性检查的确在该表的索引上发现了损坏。现在的问题是,我该如何解决。
user2904235 '16

当发现约束冲突或类似情况时,您的操作是否有可能失败?请看一下以下内容:http
维克多·巴拉哈斯

Answers:


4

只是一个指针:SQL Server 2017(我曾遇到此错误)和某些版本的2016(可能会节省一些时间):

在SQL Server 2017 CU8(以及2016 SP1 CU9和2016 SP2 CU1)之前,存在一个问题,如果DML操作导致自动更新统计信息,则具有增量统计信息的分区表将生成此错误。

最小KB页面在这里:

https://support.microsoft.com/zh-CN/help/4163478/fix-access-violation-when-incremental-statistics-automatically-updated

安装比上面列出的更高的CU可以解决此问题。


3

这可能是由于索引损坏,

最好的管理方法是删除损坏的旧索引。

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

而且,与运行有问题的查询相比,如果所有记录都是唯一的,它应该可以正常工作。在给定的列中。


3

在为Always On可用性组配置的数据库中,如果可用性组处于SYNCHRONOUS模式并且辅助节点已脱机或已挂起,则您也可能会遇到此行为。这是应用程序服务器遇到的副作用。谢谢,


2

我不知不觉中发现了什么:在禁用/重建索引视图上的索引时,如果在构建集群或使用REBUILD ALL之前尝试重建一个或多个非集群索引,则会遇到相同的错误。


2

当我有一个正在运行的查询,使用Always On AG侦听器,使用AG数据库之一并且存在故障转移时,总是会收到此错误:

.Net SqlClient数据提供程序:消息596,级别21,状态1,行0无法继续执行,因为会话处于终止状态。.Net SqlClient数据提供程序:消息0,级别20,状态0,行0在当前命令上发生严重错误。结果(如果有的话)应丢弃。

非常容易复制!当然,可能还有其他原因,但这是我遇到这种类型错误的一个特定实例...


0

我可以在使用异步连接的相当小的C#程序中重现此问题,但是我不确定100%为什么。如果其他人想尝试一下,这是我的repro程序-我怀疑有一系列事情必须完美结合才能实现:

  • 连接池已启用
  • 在连接池中使用模拟,不允许还原连接池中的模拟上下文
void Main()
{
    var impersonateMyself = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

    var testCommand = "SELECT TOP 1 * FROM sys.objects";
    var calls = Enumerable.Repeat(
        $@"{testCommand};",
        10
    );
    var impersonatedCalls = Enumerable.Repeat(
        $@"EXECUTE AS LOGIN = '{impersonateMyself} WITH NO REVERT';  {testCommand}; REVERT;",
        10
    );
    Dictionary<string, object> dict = new Dictionary<string, object>()
    {
    };

    // Scenario 1: Impersonated Calls, With connection pooling -- will randomly fail
    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());


    // Scenario 2: Normal calls, with connection pooling -- should succeed every time
    Parallel.ForEach(
        calls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        calls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());



// Scenario 3: Impersonated Calls, WITHOUT connection pooling -- should succeed every time
    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=200;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=200;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());
}

public class SqlSync
{
    private readonly string _connectionString;
    public int Timeout {get; set;}

    public SqlSync(string connString)
    {
        _connectionString = connString;
        Timeout = 30;
    }

    public T SyncSqlCall<T>(string commandText, CommandType type, Func<SqlDataReader, T> handleResult, Dictionary<string, object> parameters = null)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        using (SqlCommand cmd = new SqlCommand(commandText, conn))
        {
            cmd.CommandTimeout = Timeout;
            cmd.CommandType = CommandType.Text;

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in parameters)
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value ?? DBNull.Value);
            }

            conn.Open();

            using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                return handleResult(rdr);
        }
    }
}

public class SqlAsync
{
    private readonly string _connectionString;
    public int Timeout { get; set; }

    public SqlAsync(string connString)
    {
        _connectionString = connString;
        Timeout = 30;
    }

    public Task<T> AsyncSqlCall<T>(string sp, CommandType commandType, Func<SqlDataReader, Task<T>> handleResult, Dictionary<string, object> parameters = null)
    {
        return AsyncSqlCall<T>(sp, commandType, (reader, token) => handleResult(reader), CancellationToken.None, parameters);
    }

    public async Task<T> AsyncSqlCall<T>(string commandText, CommandType type, Func<SqlDataReader, CancellationToken, Task<T>> handleResult, CancellationToken cancellationToken, Dictionary<string, object> parameters = null)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        using (SqlCommand cmd = new SqlCommand(commandText, conn))
        {
            cmd.CommandTimeout = Timeout;
            cmd.CommandType = CommandType.Text;

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in parameters)
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value ?? DBNull.Value);
            }

            await conn.OpenAsync(cancellationToken);

//          if (conn.State != ConnectionState.Open)
//              await Task.Delay(TimeSpan.FromMilliseconds(10));
            using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection, cancellationToken))
                return await handleResult(rdr, cancellationToken);
        }
    }
}

public class A
{
    public string object_name { get; set; }
}

public static Func<SqlDataReader, Task<List<A>>> handleResultAsync = (SqlDataReader sdr) =>
{
    var result = new List<A>();
    while (sdr.Read())
    {
        result.Add(new A { object_name = sdr.GetFieldValue<string>(0) });
    }
    return Task.FromResult(result);
};

public static Func<SqlDataReader, List<A>> handleResultSync = (SqlDataReader sdr) =>
{
    var result = new List<A>();
    while (sdr.Read())
    {
        result.Add(new A { object_name = sdr.GetFieldValue<string>(0) });
    }
    return result;
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.