세션이 종료 상태이므로 실행을 계속할 수 없습니다. 클러스터형 인덱스를 작성하는 동안


11

클러스터형 인덱스를 만들려고 할 때 다음 오류가 발생합니다.

그 진술서는 만료되었습니다.
메시지 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

Windows NT 6.3 (빌드 9600 :)에서 Microsoft SQL Server 2012 (SP3) (KB3072779)-11.0.6020.0 (X64) Standard Edition (64 비트)을 사용하고 있습니다.

나는 달렸다

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

문제가 없었습니다

이 오류가 발생하여 데이터베이스가 손상된 것을 두려워합니다. 문제를 해결하고이 인덱스를 테이블에 올리려면 어떻게해야합니까?


동일한 테이블에 클러스터되지 않은 인덱스를 추가하려고 할 때 동일한 오류가 발생합니다. 비 클러스터링을 먼저 추가하려고했습니다. 이 오류가 발생했습니다. 그래서 인덱스가 손상되었다고 생각하고 모든 인덱스를 삭제하고 다시 만들려고했습니다. 그때 내가 처음 게시 한 오류 메시지가 나타납니다. Idera SQL Integrity 검사가이 테이블의 인덱스에서 손상을 발견했음을 추가 할 수 있습니다. 이제 문제는 어떻게 고쳐야 하는가입니다.
user2904235

제약 조건 위반 또는 이와 유사한 것이 발견되면 작업이 실패 할 수 있습니까? 이것 봐 주시기 바랍니다 : http://stackoverflow.com/questions/34518205/c-sharp-cmd-executescalar-cannot-continue-the-execution-because-the-session
빅터 바라하스

답변:


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

Always On 가용성 그룹에 대해 구성된 데이터베이스에서 가용성 그룹이 SYNCHRONOUS 모드에 있고 보조가 오프라인 상태이거나 일시 중단 된 경우에도이 동작이 발생할 수 있습니다. 이는 응용 프로그램 서버에서 발생하는 부작용입니다. 감사,


2

내가 무의식적으로 찾은 것 : 인덱싱 된 뷰에서 인덱스를 비활성화 / 다시 작성하는 경우 클러스터를 구축하기 전에 하나 이상의 비 클러스터형 인덱스를 다시 작성하거나 REBUILD ALL을 사용하면 동일한 오류가 발생합니다.


2

AG 데이터베이스 중 하나를 사용하여 Always On AG 리스너를 사용하여 실행중인 쿼리가 있고 장애 조치가있는 경우 항상이 오류가 발생합니다.

.Net SqlClient 데이터 공급자 : 메시지 596, 수준 21, 상태 1, 줄 0 세션이 종료 상태이므로 실행을 계속할 수 없습니다. .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.