सत्र को जारी नहीं रखा जा सकता क्योंकि सत्र हत्या की स्थिति में है। क्लस्टर इंडेक्स बनाते समय


11

क्लस्टर किए गए अनुक्रमणिका बनाने का प्रयास करते समय मुझे निम्न त्रुटि मिलती है

बयान समाप्त कर दिया गया है।
Msg 596, स्तर 21, राज्य 1, लाइन 0
निष्पादन जारी नहीं रख सकता क्योंकि सत्र हत्या की स्थिति में है।

Msg 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 (बिल्ड 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
विक्टर बाराजास

जवाबों:


4

बस एक पॉइंटर री: SQL सर्वर 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 INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

और प्रश्नों में क्वेरी को चलाने की तुलना में, यह ठीक काम करना चाहिए यदि सभी रिकॉर्ड अद्वितीय हैं। दिए गए कॉलम में।


3

हमेशा ऑन उपलब्धता समूहों के लिए कॉन्फ़िगर किए गए डेटाबेस में, यदि आप उपलब्धता समूह SYNCHRONOUS मोड में हैं और सेकंडरी ऑफ़लाइन हो गए हैं या निलंबित हैं, तो आप इस व्यवहार का सामना भी कर सकते हैं। यह एप्लिकेशन सर्वर द्वारा अनुभव किया जाने वाला साइड-इफेक्ट है। धन्यवाद,


2

कुछ ऐसा जो मैंने अनजाने में पाया है: जब आप अनुक्रमणित दृश्य पर अनुक्रमणिका को अक्षम / पुन: निर्माण कर रहे हैं, तो आपको यह त्रुटि तब मिलेगी जब आप क्लस्टर किए गए या REBUILD ALL बनाने से पहले गैर-संकुल अनुक्रमणिका के एक से अधिक अयस्क पुन: निर्माण करने का प्रयास करेंगे।


2

मुझे हमेशा यह त्रुटि मिलती है जब मेरे पास एक रनिंग क्वेरी होती है, ऑलवेज ऑन एजी लिसनर का उपयोग करके, एजी डेटाबेस में से एक का उपयोग करके और एक विफलता है:

.Net SqlClient Data Provider: Msg 596, Level 21, State 1, Line 0, निष्पादन को जारी नहीं रख सकता क्योंकि सत्र हत्या की स्थिति में है। .Net SqlClient Data प्रदाता: Msg 0, Level 20, State 0, Line 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;
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.