ไม่สามารถดำเนินการต่อได้เนื่องจากเซสชันอยู่ในสถานะ kill ในขณะที่สร้างดัชนีคลัสเตอร์


11

ฉันได้รับข้อผิดพลาดต่อไปนี้ขณะที่พยายามสร้างดัชนีคลัสเตอร์

คำสั่งถูกยกเลิก
ข่าวสารเกี่ยวกับ 596 ระดับ 21 สถานะ 1 บรรทัด 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) Standard Edition (64- บิต) ใน Windows NT 6.3 (รุ่น 9600:)

ฉันวิ่งแล้ว

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

และพบว่าไม่มีปัญหา

ฉันกลัวว่าฐานข้อมูลของฉันเสียหายเนื่องจากฉันได้รับข้อผิดพลาดนี้ ฉันจะแก้ไขปัญหาของฉันและนำดัชนีนี้ไปวางบนตารางได้อย่างไร


ฉันจะได้รับข้อผิดพลาดเดียวกันเมื่อฉันไปเพิ่มดัชนีที่ไม่ใช่คลัสเตอร์ในตารางเดียวกัน ฉันลองเพิ่มไม่ใช่คลัสเตอร์แรก ฉันได้รับข้อผิดพลาดนี้ ดังนั้นฉันคิดว่าฉันอาจมีความเสียหายของดัชนีและพยายามวางดัชนีทั้งหมดและสร้างใหม่ นั่นคือเมื่อฉันได้รับข้อความแสดงข้อผิดพลาดที่ฉันโพสต์ไว้ ฉันอาจเพิ่มว่าการตรวจสอบความสมบูรณ์ของ Idera SQL ตรวจพบความเสียหายในดัชนีสำหรับตารางนี้ ตอนนี้คำถามคือฉันจะแก้ไขได้อย่างไร
user2904235

เป็นไปได้ไหมที่การปฏิบัติการของคุณล้มเหลวเมื่อพบว่ามีการละเมิดข้อ จำกัด หรืออะไรทำนองนั้น โปรดดูที่นี่: http://stackoverflow.com/questions/34518205/c-sharp-cmd-executescalar-cannot-continue-the-execution-because-the-session
Victor Barajas

คำตอบ:


4

เพียงแค่ตัวชี้อีกครั้ง: 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 ในภายหลังมากกว่าที่ระบุไว้ข้างต้นจะช่วยแก้ไขปัญหา


3

สิ่งนี้อาจเกิดจากความเสียหายของดัชนี

วิธีที่ดีที่สุดในการจัดการนี้คือ Drop the Old Index ที่เสียหาย

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

และนอกเหนือจากเรียกใช้แบบสอบถามในคำถามควรทำงานได้ดีถ้าระเบียนทั้งหมดไม่ซ้ำกัน ในคอลัมน์ที่กำหนด


3

ในฐานข้อมูลที่กำหนดค่าสำหรับกลุ่มความพร้อมใช้ตลอดเวลาคุณอาจพบพฤติกรรมนี้หากกลุ่มความพร้อมใช้งานอยู่ในโหมดซิงโครนัสและบุคคลที่สองได้ออฟไลน์หรือถูกระงับ นี่เป็นผลข้างเคียงที่เกิดขึ้นจากแอปพลิเคชันเซิร์ฟเวอร์ ขอบคุณ


2

สิ่งที่ฉันค้นพบโดยไม่เจตนา: เมื่อคุณปิดใช้งาน / สร้างดัชนีใหม่ในมุมมองที่จัดทำดัชนีคุณจะได้รับข้อผิดพลาดเดียวกันนี้ถ้าคุณพยายามสร้างดัชนีที่ไม่ใช่คลัสเตอร์อีกหนึ่งรายการก่อนสร้างคลัสเตอร์หรือใช้ REBUILD ALL


2

ฉันได้รับข้อผิดพลาดนี้เสมอเมื่อฉันมีคิวรีที่กำลังรันอยู่โดยใช้ Always On AG Listener โดยใช้หนึ่งในฐานข้อมูล AG และมี failover:

ผู้ให้บริการข้อมูล Net SqlClient: ข่าวสารเกี่ยวกับ 596 ระดับ 21 สถานะ 1 บรรทัด 0 ไม่สามารถดำเนินการต่อได้เนื่องจากเซสชันอยู่ในสถานะ kill .Net ผู้ให้บริการข้อมูล SqlClient: ข่าวสารเกี่ยวกับ 0, ระดับ 20, สถานะ 0, บรรทัด 0 มีข้อผิดพลาดที่รุนแรงเกิดขึ้นกับคำสั่งปัจจุบัน ควรยกเลิกผลลัพธ์หากมี

ง่ายมากที่จะทำซ้ำ! แน่นอนอาจมีเหตุผลอื่น แต่นี่เป็นตัวอย่างหนึ่งที่ฉันได้รับข้อผิดพลาดประเภทนี้ ...


0

ฉันสามารถทำซ้ำปัญหานี้ในโปรแกรม 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;
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.