Pool di connessioni in fase di ripristino con errore: 18056, gravità: 20, stato: 46. Contatori perfmon non visualizzati


21

Stiamo utilizzando l'autenticazione SQL (per ridurre il numero di pool di connessioni) e le stringhe di connessione .NET 4.0 per connettersi a SQL Server Enterprise Edition 2012 SP1 su un Windows Enterprise Server 2008 R2:

Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
19 ott 2012 13:38:57
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) su Windows NT 6.1 (Build 7601: Service Pack 1)

Utilizziamo circa 50 server suddivisi in 8 gruppi diversi in diverse parti di un sito Web.

Il nostro sito Web utilizza questo SQL Server per registrare i dati di tracciamento delle visite. Negli ultimi giorni ha eliminato i seguenti messaggi relativi al ripristino dei pool di connessioni:

Il client non è stato in grado di riutilizzare una sessione con SPID 1327, che era stato ripristinato per il pool di connessioni. L'ID errore è 46. Questo errore potrebbe essere stato causato da un'operazione precedente non riuscita. Controllare i log degli errori per le operazioni non riuscite immediatamente prima di questo messaggio di errore.

Letture registro errori:

Errore: 18056, gravità: 20, stato: 46.
Il client non è stato in grado di riutilizzare una sessione con SPID 959, che era stato ripristinato per il pool di connessioni. L'ID errore è 46. Questo errore potrebbe essere stato causato da un'operazione precedente non riuscita. Controllare i log degli errori per le operazioni non riuscite immediatamente prima di questo messaggio di errore.
Accesso non riuscito per l'utente 'xxxx'. Motivo: impossibile aprire il database 'xxxxxxxx' configurato nell'oggetto login durante la riconvalida dell'accesso sulla connessione. [CLIENTE: 10.xx.xx.xxx]

Dopo alcuni approfondimenti, ho trovato questo documento sul blog CSS: How It: Errore 18056 - Il client non è stato in grado di riutilizzare una sessione con SPID ##, che era stata reimpostata per il pool di connessioni e questa da Aaron Bertrand: Risoluzione dei problemi Errore 18456 . So che il numero di errore è diverso ma l'ID di errore è lo stesso con un numero di messaggi identici).

L'ID errore 46 suggerisce che l'accesso non disponeva delle autorizzazioni. I nostri accessi predefiniti al database principale e il nome db sono specificati nella stringa di connessione.

Volevo controllare il numero di pool di stringhe di connessione, ecc. E ho controllato tutti i contatori di Perfmon per .Net Data Provider for SqlServer. Mi ha dato solo l'opzione defaultdomain9675per l'istanza, quindi ho selezionato che supponendo che fosse un nome ID generato dal sistema per la nostra rete Datacenter. Sfortunatamente tutti i contatori stanno leggendo zero. Su uno dei nostri altri server principali i pool di connessione si aggirano intorno alle 10, che è quello che mi aspettavo di vedere su un server sano con quel tipo di carico.

La mia domanda è 3 volte

  1. Qualcuno può suggerire perché il server Windows 2008 R2 non viene visualizzato .Net Data Provider for SqlServer?

  2. Qualcuno ha sperimentato questo dato che ovviamente credo che il login che non dispone delle autorizzazioni sia un'aringa rossa?

  3. Se diversi gruppi di server Web hanno la stessa sintassi della stringa di connessione ma con spazi bianchi leggermente diversi, ciò indurrebbe il server a utilizzare un altro pool di connessioni?

Le impostazioni di memoria minima e massima sono rispettivamente 20 GB e 58 GB. Il server è un server di database dedicato con 64 GB di RAM. Non penso che la memoria sia il problema in quanto la scatola sembra avere una buona aspettativa di vita della pagina. La chiusura automatica non è abilitata. Il server è sempre attivo: questo è un sito Web 24x7 con un utilizzo intenso.


3
Abbiamo lo stesso problema sui nostri server (applicazione .NET / Windows 2008 R2 / SQL Server 2008 R2 / accesso SQL) in modo intermittente; Non sono mai stato in grado di rintracciare il motivo per cui questo accade ... fondamentalmente abbiamo smesso di provare a questo punto. Abbiamo riscontrato questo problema su .NET 3.5 anche prima dell'aggiornamento a 4.0. Mi piacerebbe sapere se qualcuno ha risolto questo!
Jon Seigel,

1
@jonSeigel Ciao John, sono riuscito a determinare che il server in questione stia effettivamente utilizzando correttamente il pool di ocnnection utilizzando il seguente documento su eventi estesi. sqlserverpedia.com/blog/sql-server-bloggers/… sto attualmente cercando di adattare gli Xevents per trovare le informazioni necessarie per darmi un totale per il numero di pool di connessioni
DamagedGoods

Il server in questione utilizza il mirroring? Ho visto questo messaggio di errore sul computer principale quando i database sono sottoposti a failover sul secondario.
Max Vernon,

Risposte:


5

1 - non posso dirlo con certezza, dovrei andare a cercare un server per scavare in me stesso.

2 - sì, lo vedo periodicamente nel mio ambiente anche se non siamo ancora su SQL 2012 sui sistemi da cui vediamo questo. Potresti anche voler controllare http://blogs.msdn.com/b/psssql/archive/2013/02/13/breaking-down-18065.aspx sebbene lo Stato 46 sembra essere correlato ad avere un Database specifico = xxx in la stringa di connessione, esiste ancora quel db?

Il modo in cui è configurata la mia rete sospetto sia la chiusura automatica della rete delle sessioni TCC dopo 5 minuti di inattività che è il problema: né il database né il client stanno chiudendo la sessione, quindi il pool di connessioni pensa ancora che la connessione sia aperta e prova a utilizzare solo per scoprire che non è più veramente aperto. Non dici come è configurata la rete tra i tuoi server web e db, forse il tuo caso è simile.

Un'altra possibilità potrebbe essere il problema (vecchio, non sicuro se mai realmente risolto, vedi http://support.microsoft.com/kb/942861 ) sulle impostazioni di Offload Chimney TCP.

3 - La mia comprensione è che il pooling richiede esatte corrispondenze di stringhe, quindi spazi bianchi e un diverso ordine di parametri causerebbero pool diversi. (Se mi sbaglio, per favore fatemi sapere.)


4

La risposta del Wiki della comunità originariamente lasciata come commento dall'autore della domanda

Nel mio caso si è rivelato essere una tabella di registrazione in fuga che qualcuno aveva trasformato in verboso per risolvere un problema, ma si è dimenticato di spegnere. Ha finito per registrare fino a 1000 record al secondo.

Un altro lavoro stava tentando di eliminare i vecchi record dalla tabella. alla fine si è innervosito mentre si stava bloccando quando si tenta di eliminare, bloccando tutti quegli inserti che ha esaurito le risorse del pool di connessioni.

Non appena ho trovato il lavoro, ho schiaffeggiato la persona che ha abusato dei loro diritti su quel server intorno alla testa e ho fermato il lavoro, tutti i messaggi di errore per i pool di connessioni si sono interrotti.

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.