Không thể tiếp tục thực hiện vì phiên ở trạng thái kill. trong khi xây dựng chỉ số cụm


11

Tôi nhận được lỗi sau trong khi cố gắng tạo một chỉ mục cụm

Các tuyên bố này đã bị chấm dứt.
Msg 596, Cấp 21, Trạng thái 1, Dòng 0
Không thể tiếp tục thực hiện vì phiên ở trạng thái tiêu diệt.

Msg 0, Level 20, State 0, Line 0 Đã
xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Các kết quả, nếu có, cần được loại bỏ.

Chỉ số là:

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

Tôi đang sử dụng Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Phiên bản tiêu chuẩn (64-bit) trên Windows NT 6.3 (Build 9600 :)

tôi chạy

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

và nó không tìm thấy vấn đề gì

Tôi sợ rằng cơ sở dữ liệu của tôi bị hỏng vì tôi gặp lỗi này. Làm thế nào để tôi sửa vấn đề của mình và đưa chỉ số này lên bàn?


Tôi nhận được cùng một lỗi khi tôi thêm một chỉ mục không được nhóm trên cùng một bảng. Tôi đã thử thêm cụm không đầu tiên. Tôi đã nhận được lỗi này. Vì vậy, tôi nghĩ rằng tôi có thể có chỉ số tham nhũng và cố gắng bỏ tất cả các chỉ mục và tạo lại chúng. Đó là khi tôi nhận được thông báo lỗi ban đầu tôi đã đăng. Tôi có thể thêm rằng kiểm tra tính toàn vẹn SQL của Idera đã tìm thấy tham nhũng trên các chỉ mục cho bảng này. Bây giờ câu hỏi là, làm thế nào để tôi sửa nó.
dùng2904235

Có thể hoạt động của bạn thất bại khi phát hiện ra rằng vi phạm ràng buộc ràng buộc hay một cái gì đó tương tự? Xin hãy xem cái này: http://stackoverflow.com/questions/34518205/c-sharp-cmd-executescalar-cannot-continue-the-execut-because-the-session
Victor Barajas

Câu trả lời:


4

Chỉ cần một con trỏ lại: SQL Server 2017 (nơi tôi đã gặp lỗi này) và một số phiên bản của năm 2016 để có khả năng tiết kiệm thời gian cho người khác:

Trước SQL Server 2017 CU8 (cũng là 2016 SP1 CU9 và 2016 SP2 CU1), đã xảy ra sự cố khi các bảng được phân đoạn có chỉ số tăng sẽ tạo ra lỗi này nếu hoạt động DML gây ra cập nhật thống kê tự động.

Trang KB tối thiểu có tại đây:

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

Cài đặt CU sau này hơn những gì được liệt kê ở trên sẽ khắc phục sự cố.


3

Điều này có thể được gây ra bởi Corruption of Index,

Cách tốt nhất để quản lý việc này là Thả chỉ số cũ bị hỏng.

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

Và hơn là Chạy truy vấn trong các câu hỏi, nó sẽ hoạt động tốt nếu tất cả các bản ghi là duy nhất. trong các cột đã cho.


3

Trong cơ sở dữ liệu được định cấu hình cho Nhóm Luôn sẵn sàng, bạn cũng có thể gặp phải hành vi này nếu Nhóm sẵn có ở chế độ SYNCHRONOUS và các phần phụ đã ngoại tuyến hoặc bị treo. Đây là một tác dụng phụ có kinh nghiệm của các máy chủ ứng dụng. Cảm ơn,


2

Một cái gì đó tôi vô tình tìm thấy: Khi bạn vô hiệu hóa / xây dựng lại các chỉ mục trên chế độ xem được lập chỉ mục, bạn sẽ gặp lỗi tương tự nếu bạn cố gắng xây dựng lại một quặng nhiều hơn các chỉ mục không được phân cụm trước khi xây dựng cụm hoặc sử dụng REBUILD ALL.


2

Tôi luôn gặp lỗi này khi có truy vấn đang chạy, sử dụng Trình nghe luôn bật AG, sử dụng một trong các cơ sở dữ liệu AG và có một chuyển đổi dự phòng:

Nhà cung cấp dữ liệu .Net SqlClient: Msg 596, Cấp 21, Trạng thái 1, Dòng 0 Không thể tiếp tục thực hiện vì phiên ở trạng thái hủy. .Net SqlClient Nhà cung cấp dữ liệu: Msg 0, Cấp 20, Trạng thái 0, Dòng 0 Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Các kết quả, nếu có, cần được loại bỏ.

Rất dễ sinh sản! Tất nhiên, có thể có những lý do khác nhưng đây là một trường hợp cụ thể mà tôi gặp phải loại lỗi này ...


0

Tôi có thể tái tạo vấn đề này trong một chương trình C # khá nhỏ sử dụng Kết nối không đồng bộ, nhưng tôi không chắc chắn 100% tại sao. Đây là chương trình repro của tôi trong trường hợp người khác muốn thử - tôi nghi ngờ có một loạt điều phải xếp hàng hoàn hảo để điều này xảy ra:

  • Kết nối tổng hợp được kích hoạt
  • Sử dụng mạo danh trong nhóm kết nối, không cho phép hoàn nguyên bối cảnh mạo danh đó trong nhóm kết nối
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;
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.