web-dev-qa-db-ja.com

セッションが強制終了状態のため、実行を続行できません。クラスター化インデックスの構築中

クラスタ化インデックスを作成しようとすると、次のエラーが発生します

ステートメントは終了されました。
メッセージ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

Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)Standard Edition(64-bit)on Windows NT 6.3(Build 9600:)を使用しています。

私は走った

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

そしてそれは問題を見つけませんでした

このエラーが発生したため、データベースが破損していると思います。どうすれば問題を修正し、このインデックスをテーブルに追加できますか?

11
user2904235

単なるポインタre:SQL Server 2017(このエラーが発生した場所)と2016のいくつかのバージョンは、他の時間を節約する可能性があります。

SQL Server 2017 CU8(2016 SP1 CU9および2016 SP2 CU1も同様)以前は、DML操作によって統計の自動更新が行われると、増分統計を含むパーティション分割テーブルでこのエラーが発生するという問題がありました。

最小限のKBページはこちら:

https://support.Microsoft.com/en-us/help/4163478/fix-access-violation-when-incremental-statistics-automatically-updated

上記のものより後のCUをインストールすると、問題が修正されます。

4
cbailiss

これはインデックスの破損が原因である可能性があります。

これを管理する最良の方法は、破損している古いインデックスを削除することです。

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

そして、問題のクエリを実行するよりも、すべてのレコードが一意であれば問題なく機能するはずです。指定された列。

3
MarmiK

Always On可用性グループ用に構成されたデータベースでは、可用性グループがSYNCHRONOUSモードであり、セカンダリがオフラインになっているか一時停止されている場合にも、この動作が発生する可能性があります。これは、アプリケーションサーバーで発生する副作用です。おかげで、

3
Kangeles

知らないうちに見つかったもの:インデックス付きビューでインデックスを無効化/再構築しているときに、クラスター化を構築する前に1つ以上の非クラスター化インデックスを再構築しようとしたり、REBUILD ALLを使用したりすると、この同じエラーが発生します。

2
PseudoToad

Always On AGリスナーを使用し、AGデータベースの1つを使用してクエリを実行していて、フェイルオーバーが発生すると、常にこのエラーが発生します。

。Net SqlClientデータプロバイダー:メッセージ596、レベル21、状態1、行0セッションが強制終了状態のため、実行を続行できません。Net SqlClientデータプロバイダー:メッセージ0、レベル20、状態0、行0現在のコマンドで重大なエラーが発生しました。結果があれば破棄してください。

再現がとても簡単!もちろん、他の理由があるかもしれませんが、これは私がこのタイプのエラーを受け取っている特定のインスタンスです...

2
HansLindgren

非同期接続を使用するかなり小さなC#プログラムでこの問題を再現できますが、100%の理由がわかりません。他の人が試してみたい場合の私の再現プログラムは次のとおりです。これを実現するには、完全に整列する必要がある一連のことがあると思います。

  • 接続プーリングが有効
  • 接続プールで偽装を使用し、接続プールでその偽装コンテキストを元に戻すことを禁止する
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;
};
0
John Zabroski