Risultati SSMS e server registrati


8

Contesto :

Stiamo cercando di creare un cablaggio di prova "è primario" per uno dei nostri team di supporto. Non sapendo quali server in qualsiasi momento saranno i principali a cui è stato incaricato di eseguire TSQL su un gruppo di server registrato. Il gruppo di server registrato è costituito da tutti i server nell'AG. L'obiettivo è eseguire TSQL solo sul server primario corrente:

Cablaggio di prova corrente :

IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS 
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id 
    WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END

Problema :

Se il primo server che risponde alla query multi-server non restituisce alcun risultato, SSMS assumerà che il set di risultati corretto non sia impostato, anche se in seguito altri server torneranno con un set di risultati. Quindi, in questo scenario, non vengono restituiti risultati ... questo non è corretto e non è la funzionalità prevista.

Qualcuno può pensare a un modo, con SSMS (questo è lo strumento più familiare al team CS), per forzare l'esecuzione solo sull'attuale server primario?


Hai mai pensato di collegarli al listener di AG, eseguendo così la query in quel modo? Garantirà sempre colpire il primario.
Nic

Sfortunatamente, questo non è possibile. Abbiamo un sacco di inquilini con ascoltatori nominati in modo identico. In questo caso non funzionerà.
Harry,

Risposte:


10

Mi sono mai imbattuto in questo ** prima e, se ricordo bene, per garantire sempre di ottenere risultati con query multi-server devi forzare un set di risultati vuoto quando altrimenti non verrebbero restituite righe. Significato, hai bisogno di un ELSEramo su quello IFe dentro di ELSEte faresti qualcosa del tipo:

SELECT CONVERT(DATETIME, NULL) AS [Col1name],
       CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
       ...{additional fields}...
WHERE  1 = 0;

Ciò produce un set di risultati vuoto con nomi e tipi di dati corretti.

OPPURE, e non ho provato questo in passato (ci ho pensato solo mentre lo stavo scrivendo), ma potresti essere in grado di cavartela semplicemente facendo una pausa in quel ELSEramo in modo che il server primario / previsto possa sempre restituire il suo set di risultati per primo (che è il vero problema qui: il primo server a rispondere definisce la struttura a cui devono aderire tutte le altre risposte). Quindi il seguente potrebbe funzionare come l'unica cosa in ELSE:

WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)

Ma non ricordo se avere altri server non restituisce alcun risultato causando la visualizzazione di un messaggio di errore nella scheda "Messaggi". In tal caso, il set di risultati vuoto è sicuramente la strada da percorrere. Ma se funziona, allora potrebbe funzionare meglio in un modello generale (come il tuo caso sembra essere) in quanto non richiederebbe la regolazione del set di risultati forzato, vuoto ogni volta che viene utilizzato.

AGGIORNARE:

L'OP ha verificato che:

  • l' WAITFOR DELAYha realmente il loro lavoro, e
  • le repliche hanno segnalato il messaggio di errore, ma non presentavano un problema per l'utilizzo del PO

** La situazione in cui mi sono imbattuto era simile, ma non aveva nulla a che fare con i gruppi di disponibilità o con i risultati desiderati da un solo server. La nostra situazione era che avevamo 18 server con lo stesso schema di dati diversi e che dovevamo svolgere varie attività di manutenzione, aggregazioni tra tutti i 18 nodi. Esistono alcune procedure memorizzate che, per qualsiasi motivo, di tanto in tanto non restituiscono alcun set di risultati e qualunque sia la ragione, non può essere risolto all'interno della procedura memorizzata. Quindi, a seconda del nodo restituito per primo, il più delle volte tutto andava bene, ma ogni tanto il nodo che a volte restituiva nessun set di risultati veniva restituito per primo. Quindi, ho dovuto fare qualcosa come scaricare i risultati in una tabella temporanea e se @@ROWCOUNTquello INSERT...EXECfosse 0, avrei selezionato il set di risultati forzato e vuoto.


2
Non ci avrei mai pensato !! L'attesa del ritardo funziona come un campione! Sicuramente salva dalla creazione del risultato vuoto impostato. Fai l'uomo @srutzky Grazie
Harry,

@Harry Prego, e grazie :-). Ho appena aggiornato la mia risposta per essere un po 'più chiaro riguardo ai vantaggi WAITFOR DELAYdell'approccio e che hai confermato che ha funzionato, quindi grazie per quello!
Solomon Rutzky,

1
Questa è la cosa più bella che ho visto questa settimana.
Brent Ozar,

Sicuramente genera un errore nelle repliche, tuttavia in questo caso va benissimo.
Harry,

@Harry Grazie ancora per aver fornito quel feedback. L'ho aggiunto alla mia risposta, insieme a una spiegazione in fondo alla situazione che ho riscontrato.
Solomon Rutzky,

0

Ho sempre usato una tabella temporanea per restituire risultati per ottenere risposte coerenti da tutti i server di un gruppo. Le query multi server sono una delle mie cose preferite su SSMS.

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.