Verifica se 2 tabelle (su server diversi) hanno gli stessi dati esatti


10

Quindi sembra che la società che ospita i nostri server SQL abbia avuto qualche problema con la replica dal server di produzione al server di backup ... Credo che alcune tabelle si stiano replicando correttamente. La replica viene eseguita quotidianamente (dopo le ore).

C'è un modo per confrontare 2 delle stesse tabelle, 1 dal backup contro 1 dal server di produzione per vedere se la replica delle notti scorse ha funzionato?

L'unico modo che ho trovato è stato quello di eseguire la seguente query su entrambi i server e vedere se il risultato corrispondeva che "potrebbe" significare che su 2 tabelle contengono le stesse informazioni.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

usando il codice sopra, sembra che la tabella si sia replicata correttamente poiché i valori di checksum sono gli stessi ma non sono sicuro di quanto sia affidabile questo metodo.

Qualcuno conosce un metodo migliore per verificarlo o se questo è un buon modo?

Sto eseguendo SQL Server 2008 su un computer Windows Server 2008.

Grazie.

Risposte:


11

Credo che tu stia cercando lo strumento tablediff che ti consente di fare esattamente questo: confrontare due tabelle replicate per le differenze. Potresti trovare utile questo articolo per iniziare.

Ecco una GUI per tablediff


Splendido, grazie. Ho qualche lettura da fare su questo. Inoltre, grazie per il link alla GUI, dovrebbe rendere le cose molto più semplici, davvero apprezzarlo!
Juan Velez,


4

Quanto sono grandi i dati e quanto velocemente sono i collegamenti tra i database e tra loro (e voi)? Esistono diverse idee:

Se i dati sono abbastanza piccoli da essere pratici, esegui SELECT * FROM <table> ORDER BY <pk>su ciascun DB, salva i risultati in un file delimitato da tabulazioni o virgole (non spazio allineato in quanto esplode in modo massiccio le dimensioni del file risultante) e confronta l'output risultante con il tuo tipo di diff preferito utilità come winmerge. In questo modo stai confrontando assolutamente tutti i dati.

Se i database possono vedersi (molto probabilmente in quanto sono in grado di funzionare come partner di replica) e il collegamento tra loro è larghezza di banda sufficiente e latenza abbastanza bassa, è possibile utilizzare la funzionalità del server collegato (vedere http://msdn.microsoft .com / it-it / library / ms190479.aspx e relativa documentazione) e confrontare confrontare i contenuti delle tabelle in un paio di istruzioni SQL (elencando le righe <table>che non hanno righe identiche in <linked_server>.<db>..<table>e viceversa) proprio come confronteresti il ​​contenuto di due tabelle locali. Questa è un'opzione relativamente lenta potenzialmente, ma potrebbe essere un controllo abbastanza potente da automatizzare.

Se hai bisogno di usare i checksum perché vuoi ridurre notevolmente la quantità di dati che devono essere trasferiti, usa HASHBYTESpiuttosto che la CHECKSUMfamiglia di funzioni in quanto puoi usare hash di qualità migliore in modo che tu sia più sicuro che risultino uguali. Questo è più impegnativo per la CPU, ma per grandi quantità di dati sarete collegati in I / O non in CPU, quindi avrete molti cicli inutilizzati (e per piccole quantità semplicemente non importa).

Come via di mezzo tra il confronto di tutti i dati carattere per carattere e il confronto di un singolo checksum che copre tutti i dati, è possibile esportare SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>da ciascun database e confrontare tali risultati per vedere se sono identici (o SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>per ridurre la quantità di dati che scorre, ma avere il PK nell'output significa che puoi identificare le righe che differiscono, se ce ne sono, con meno ulteriori query). Ovviamente quest'ultima opzione è inutile se i dati nella riga media sono più piccoli dell'hash risultante, nel qual caso l' opzione "confronta tutto " sarà più efficiente.


2

Mentre tablediff confronta solo le tabelle nei database live, ci sono molti strumenti di terze parti che possono confrontare un backup del database con un database live.

È inoltre possibile eseguire il seguente script per visualizzare i dati esistenti in una tabella e non presenti in un'altra, ma è possibile farlo solo su 2 database live:

SELEZIONA * DA MyTest.dbo.testtable DOVE NON ESISTE (SELEZIONA * DA MyTest2.dbo.TestTable DOVE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


Grazie per le informazioni! Lo esaminerò. Quella sceneggiatura sarà utile!
Juan Velez,

qualcosa che ho usato frequentemente è except: select id, name from Table1 except select id, name from Table2ti darà tutto nella Tabella 1 ma non nella Tabella 2
Adamo
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.