lunedì 29 agosto 2011

Automatizzato di dati di sincronizzazione dei dati con SQL Confronta e TeamCity


Per un po 'di tempo, ho continuato a rimandare un compito di configurare un processo di sincronizzazione di un particolare dei dati aziendali. Questi dati vengono popolati in una singola tabella in un ambiente di produzione su base giornaliera, ma anche bisogno di essere sincronizzati fino negli ambienti di test e sviluppo di tanto in tanto. Senza entrare troppo nel dettaglio circa la natura dei dati, si compone di circa 700.000 record che il cambiamento sia attraverso aggiornamenti o inserimenti. Normalmente non mi piace prendere i dati di produzione giù in altro ambiente ( ci sono modi semplicemente meglio ), ma la natura di questi dati chiamato per mantenere gli ambienti in modo da sincronizzare gli sviluppatori potrebbero fare il loro lavoro.
Ero stato seduto su questo requisito per un po 'come non ero assaporando quello che potrebbe diventare un tempo, compito laborioso. Questo era un tavolo con oltre 40 colonne compresi un sacco di chiavi esterne (una di loro auto-referenziale), e un campo calcolato in modo, oltre ad essere attenti a non creare eventuali problemi di integrità referenziale, ne avevo bisogno per accadere velocemente in modo da non svolgere il caos con un ambiente di produzione. Nella mia mente, che stava a significare scrivendo manualmente una qualche forma di ETL direttamente in T-SQL o tramite SSIS o anche scendere un percorso SQL replica. E 'stato forse anche un SQL MERGE compito, ma questi particolari ambienti erano ancora bloccati su SQL 05 in modo che era fuori strada.
Un rapido avvertimento: io non sono un DBA, gli sviluppatori sono una che lavora con i database. Ci possono essere stati altri angoli di venire in questo da, ma la soluzione sono arrivato è veloce, semplice e facile da monitorare. Il fatto che sia finito per essere un lavoro di 15 minuti sul mio week-end e non mi dispiace rinunciare a un po 'del mio prezioso Domenica su questo particolare compito è stato un risultato molto bello!

Dati SQL Confronta e la linea di comando

Red Gate SQL Data Compare è piuttosto abile nel sincronizzazione dei database in ambienti attraverso un'interfaccia utente amichevole. Inserire l'origine e la destinazione server e database, eseguire il confronto, guardate le differenze, eseguire la sincronizzazione.Semplice.
Cosa è, però, è anche possibile strumento tutto questo attraverso la riga di comando. E 'simile a questa:
SQLDataCompare.exe / s1: SourceServer / db1: SourceDB / s2: TargetServer 
/ db2: TargetDB / Include: tavolo: \ [MyTable \] / Include: identico / v / sync
Questo è per lo più abbastanza auto-esplicativo, è il quattro interruttori alla fine che sono quelli interessanti: solo confrontare la tabella dal titolo "MyTable" (le parentesi quadre sono fuggiti dal carattere precedente), includono tabelle identiche nel risultato del confronto in modo che il processo non restituisce un errore quando tutto le partite, mi dia un output dettagliato ed effettivamente sincronizzare le differenze, non semplicemente confrontare.
Perché c'è una bella interfaccia a riga di comando possiamo facilmente orchestrare questo da TeamCity. L'ambiente in questione era già in esecuzione di SQL Confronta suite di come è usato per Banca dati automatizzata con TeamCity e Red Gate . Rivedere il progetto che ho creato, è solo un progetto TeamCity normale senza impostazioni VCS (non stiamo ricevendo nulla da controllo del codice sorgente), una riga di comando costruire passo, un paio di parametri di costruire e un trigger. In realtà, il comando è un po 'più complicato perché l'ho estratto in un modello e utilizzato variabili di ambiente per i nomi dei server:
Costruire configurazione mostra la sintassi della riga di comando
La ragione per cui ho fatto questo è così che io possa riutilizzare la formazione tra le due produzione di prova e prova-to-sviluppo sincronizzazioni dei dati. Questo rende la manutenzione veramente facile, se voglio cambiare i parametri della riga di comando in seguito. Ecco quali sono i parametri costruire assomigliano per la produzione di test di sincronizzazione:
Le variabili d'ambiente utilizzato nel comando
Il test a sincronizzare lo sviluppo è identico (ho semplicemente copiato la produzione a prova di costruire), ad eccezione, ovviamente, l'impostazione dei due suddetti parametri in base ai nomi rispettivo server. Io innescare la produzione a test di sincronizzazione veramente bene e fuori orario di lavoro poi completato con successo, innescare una prova a costruire lo sviluppo. In questo modo la finestra dove il server di produzione è stato toccato nel ridotto al minimo.
Un'ultima cosa: assicurarsi che l'account è TeamCity connessione a server con sSQL ha avuto il principio del privilegio minimo attivamente applicata. Mettere il cappello sulla sicurezza e chiedono "Che cosa conto assolutamente, positivamente devono essere in grado di fare?" E poi non lasciarlo fare nulla oltre questo. Per esempio, ha solo bisogno di leggere, dalla produzione, ma deve essere in grado di selezionare, inserire e aggiornare in ambienti di test e sviluppo (sto assumendo nessun record ridondanti vengono inseriti direttamente in questi ambienti e che le eliminazioni non sarà necessario ).
Una volta che la costruzione viene eseguito correttamente, il registro simile a questa:
[10:39:14]: evitare il controllo dei cambiamenti - non ci sono radici VCS definito
[10:39:14]: Cancellare directory temporanea: 
            C: \ TeamCity \ buildAgent \ temp \ buildTmp
[10:39:14]: Checkout directory: C: \ TeamCity \ buildAgent \ work \ db35110eeed7e0e5
[10:39:14]: fonti Repository trasferiti
[10:39:14]: fonti Aggiornamento: checkout lato server ...
[10:39:14]: artefatti Publishing interno (1s)
[10:39:16]: [artefatti Publishing interno] build.start.properties Invio 
            di file
[10:39:14]: Dal: "C: \ Program Files \ Red Gate \ Dati SQL Compare 9 
            \ SQLDataCompare.exe "/ s1: MyProductionServer / db1: MyTable 
            / s2: MyTestServer / db2: tavolo: MyTable / Include: \ [MyTable \] 
            / Include: identico / v / sync
[10:39:14]: nella directory: C: \ TeamCity \ buildAgent \ work \ db35110eeed7e0e5
[10:39:15]: Red Gate SQL Data Compare Utilità da riga di comando V9.1.0.365
[10:39:15]: ========================================== =====================
[10:39:15]: Copyright c Red Gate Software Ltd 1999-2011
[10:39:15]: Numero di serie: XXX-XXX-XXXXXX-XXXX
[10:39:15]: Confronto MyProductionServer.MyTable database con dati 
            MyTestServer.MyTable ...
[10:39:15]: database Registrazione
[10:39:17]: Mapping
[10:39:17]: banche dati a confronto
[10:40:53]: Generazione di script SQL
[10:40:54]: Sincronizzazione dei database
[10:41:15]: Finito
[10:41:15]: Informazioni di riepilogo
[10:41:15]: ========================================== =====================
[10:41:15]: DB1 = MyProductionServer.MyTable
[10:41:15]: DB2 = MyTestServer.MyTable 
[10:41:15]: Object Name Records tipo DB1 DB2
[10:41:15]: ------------------------------------------ ---------------------
[10:41:15]: Table [dbo] [MyTable] 683119 == ==.  
[10:41:15]:. Table [dbo] [MyTable] 7379 <> <>  
[10:41:15]:. Table [dbo] [MyTable] 3217>>      
[10:41:15]: ------------------------------------------ ---------------------
[10:41:15]: OK
[10:41:15]: Processo terminato con codice 0
[10:41:15]: Pubblicazione manufatti interni
[10:41:15]: [artefatti Publishing interno] build.finish.properties Invio 
            di file
[10:41:15]: Build finito
Facciamo una scomposizione un po ': ci sono un totale di 693.715 righe del sorgente, la stragrande maggioranza dei quali sono identici al target diverso dal 7379 che hanno alcune differenze e il 3217 che non esistono nel bersaglio a tutti. Tutto questo viene eseguito in un totale di 2 minuti e 1 secondo, ma lo script di sincronizzazione reale, che è la scrittura per l'ambiente di destinazione, richiede solo 21 secondi. Nizza.

Trucchi

C'erano due piccoli trucchi sightly deragliare in tutto questo: in primo luogo, Red Gate ha avuto un po 'di vigilanza con le versioni precedenti di versione 9 di dati SQL Compare e sono riusciti a rompere il corridore riga di comando . C'è una patch disponibili in quel link che porta fino alla versione 9.1.0.365 che funziona bene.
L'altra era che TeamCity inizialmente il fallimento della costruzione con un messaggio come questo:
[11:09:21]: banche dati a confronto
[11:09:26]: Eccezione non gestita: System.InvalidOperationException: Visualizzazione di una finestra di dialogo modale o si formano quando l'applicazione non è in esecuzione in modalità UserInteractive non è un'operazione valida. Specificare il ServiceNotification o DefaultDesktopOnly stile per visualizzare una notifica da un'applicazione di servizio.
Sembra che vi era una finestra di dialogo seduto sulla macchina TeamCity in attesa di qualche azione (a memoria, era uno di quei "Possiamo anonimamente raccogliere feedback" scatole). Sarebbe bello essere in grado di istruire dati SQL Compare per l'esecuzione automatica, ma non riuscivo a vedere nulla nella guida dei comandi che indicava questo. In ogni caso, accedere al server, chiudere la finestra e questa è la fine di questo.

Riassunto

Questa è una implementazione piuttosto semplice, ma che sta facendo qualcosa di ben più complesso sotto le coperte. Forse potrebbe essere stata orchestrata da SQL Server con altri mezzi, ma mi piace il modo intuitivo dati SQL Compare gestisce e mi piace molto essere in grado di vedere nel mio TeamCity costruire lista compresa l'uscita descrivere ciò che è stato colpito. E, naturalmente, posso ottenere tutte le notifiche TeamCity solito se qualcosa va storto.
Ma meglio di tutti, è letteralmente un lavoro di 15 minuti per l'installazione e fa esattamente quello che mi serve. Questo è un risultato davvero molto bella.




Nessun commento:

Posta un commento