Impossibile continuare l'esecuzione perché la sessione è nello stato di interruzione. durante la creazione di un indice cluster


11

Ottengo il seguente errore mentre provo a creare un indice cluster

La dichiarazione è stata chiusa.
Messaggio 596, livello 21, stato 1, riga 0
Impossibile continuare l'esecuzione perché la sessione è nello stato di interruzione.

Messaggio 0, livello 20, stato 0, riga 0
Si è verificato un errore grave nel comando corrente. I risultati, se presenti, devono essere eliminati.

L'indice è:

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

Sto usando Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Standard Edition (64-bit) su Windows NT 6.3 (Build 9600:)

Ho corso

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

e non ha riscontrato problemi

Temo che il mio database sia corrotto da quando ricevo questo errore. Come posso correggere il mio problema e mettere questo indice sul tavolo?


Ottengo lo stesso errore quando vado ad aggiungere un indice non cluster sulla stessa tabella. Ho provato ad aggiungere prima il non cluster. Ho ricevuto questo errore. Quindi ho pensato che avrei potuto corrompere gli indici e ho provato a eliminare tutti gli indici e ricrearli. Questo è quando ho ricevuto il messaggio di errore che avevo pubblicato inizialmente. Potrei aggiungere che il controllo di integrità di Idera SQL ha trovato corruzione sugli indici per questa tabella. Ora la domanda è: come risolverlo.
user2904235

Sarebbe possibile che l'operazione fallisca quando scopre che esiste una violazione del vincolo o qualcosa del genere? Dai un'occhiata a questo: http://stackoverflow.com/questions/34518205/c-sharp-cmd-executescalar-cannot-continue-the-execution-because-the-session
Victor Barajas

Risposte:


4

Solo un puntatore a proposito di: SQL Server 2017 (dove stavo colpendo questo errore) e alcune versioni del 2016 per risparmiare potenzialmente un po 'di tempo:

Prima di SQL Server 2017 CU8 (anche 2016 SP1 CU9 e 2016 SP2 CU1), c'era un problema in cui le tabelle partizionate con statistiche incrementali generavano questo errore se l'operazione DML causava un aggiornamento automatico delle statistiche.

La pagina KB minima è qui:

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

L'installazione di una CU successiva rispetto a quelle sopra elencate risolve il problema.


3

Ciò può essere causato dalla corruzione dell'indice,

Il modo migliore per gestire questo è Drop the Old Index che è corrotto.

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

E rispetto a Esegui la query nelle domande, dovrebbe funzionare correttamente se tutti i record sono univoci. nelle colonne indicate.


3

In un database configurato per i gruppi di disponibilità Always On, è possibile riscontrare questo comportamento anche se il gruppo di disponibilità è in modalità SINCRONA e i secondari sono andati offline o sono sospesi. Questo è un effetto collaterale riscontrato dai server delle applicazioni. Grazie,


2

Qualcosa che ho trovato inconsapevolmente: quando disabiliti / ricostruisci gli indici in una vista indicizzata, otterrai questo stesso errore se provi a ricostruire uno o più degli indici non cluster prima di costruire il cluster o utilizzare REBUILD ALL.


2

Ricevo sempre questo errore quando ho una query in esecuzione, usando un listener Always On AG, usando uno dei database AG e c'è un failover:

.Net SqlClient Provider di dati: Messaggio 596, livello 21, stato 1, riga 0 Impossibile continuare l'esecuzione perché la sessione è nello stato di interruzione. .Net SqlClient Data Provider: Messaggio 0, Livello 20, Stato 0, Linea 0 Si è verificato un errore grave nel comando corrente. I risultati, se presenti, devono essere eliminati.

Molto facile da riprodurre! Certo, potrebbero esserci altri motivi, ma questa è l'unica istanza in cui ricevo questo tipo di errore ...


0

Posso riprodurre questo problema in un programma C # abbastanza piccolo che utilizza connessioni asincrone, ma non sono sicuro al 100% del perché. Ecco il mio programma di riproduzione nel caso in cui altri vogliano provarlo - ho il sospetto che ci siano una serie di cose che devono essere perfettamente allineate perché ciò accada:

  • Pool di connessioni abilitato
  • Utilizzo della rappresentazione nel pool di connessioni, impedendo di ripristinare quel contesto di rappresentazione nel pool di connessioni
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;
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.