Неможливо продовжити виконання, оскільки сеанс знаходиться в стані вбивства. під час побудови кластерного індексу


11

Я отримую таку помилку під час спроби створити кластерний індекс

Заява скасована.
Msg 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) Стандартне видання (64-бітне) для Windows NT 6.3 (Build 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-berely-thesesese
Віктор Барахас

Відповіді:


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- update

Встановлення пізнього МС, ніж зазначені вище, вирішує проблему.


3

Це може бути викликано пошкодженням індексу,

Найкращий спосіб управління цим - це скинути старий індекс, який є пошкодженим.

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

І ніж Виконати запит у запитаннях, він повинен спрацьовувати нормально, якщо всі записи унікальні. у наведених стовпцях.


3

У базі даних, налаштованій для груп "Завжди в групі доступності", ви також можете зіткнутися з такою поведінкою, якщо група доступності перебуває в режимі СИНХРОННОГО, а вторинники перейшли в офлайн або призупинено. Це побічний ефект, який відчувають сервери додатків. Дякую,


2

Щось мимоволі виявив: Коли ви вимикаєте / відновлюєте індекси на індексованому представленні, ви отримаєте цю саму помилку, якщо спробуєте відновити на одній руді більше некластеризованих індексів перед побудовою кластера або використовувати REBUILD ALL.


2

Я завжди отримую цю помилку, коли у мене запущений запит, використовуючи Aliste On AG Listener, використовую одну з баз даних AG, і є відмовлення:

.Net Постачальник даних SqlClient: Msg 596, рівень 21, стан 1, рядок 0 Неможливо продовжити виконання, оскільки сеанс знаходиться в стані знищення. .Net Постачальник даних SqlClient: Msg 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;
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.