Come automatizzare le migrazioni del database MySQL con Skeema

Skeema è uno strumento CLI open source che consente di sincronizzare gli schemi del database MySQL su più host. Funziona con semplici file SQL contenenti istruzioni CREATE TABLE.

Le migrazioni di database sono una delle sfide più comuni nel processo di sviluppo del software. Come si esegue la versione del proprio schema e si applicano le modifiche a tutti i propri ambienti?

Skeema aiuta ad alleviare questo punto dolente permettendoti di gestire il tuo schema come un normale SQL. Non c'è una sintassi speciale o un formato di file di configurazione da imparare. Quando spingi il tuo schema su un host, Skeema estrarrà le definizioni delle tabelle su quell'host e le differenzierà rispetto ai tuoi file locali. Quindi calcolerà le istruzioni CREATE, ALTER e DROP per fare in modo che l'host remoto corrisponda ai tuoi file SQL.

Dovrai utilizzare le tabelle InnoDB per ottenere il massimo da Skeema. Può funzionare con le tabelle MyISAM ma non tutte le funzionalità sono supportate e potresti riscontrare problemi.

Per iniziare

Skeema è disponibile per Linux e Mac. Sono offerti pacchetti DEB e RPM, oltre a binari standalone precompilati. Scarica il download appropriato per il tuo sistema e installa il pacchetto o estrai il file binario in una directory che si trova nel tuo percorso.

Pubblicità

La prima fase nell'utilizzo di Skeema è ottenere lo schema esistente del database. Se hai già una raccolta di file SQL con istruzioni CREATE TABLE, puoi usarli così come sono. Altrimenti, esegui il comando skeema init per ottenere l'SQL che rappresenta un database live.

La CLI di Skeema accetta gli stessi argomenti del normale comando mysql. Usa i flag -h, -u e -p per specificare il tuo host MySQL, nome utente e password. L'utente MySQL dovrebbe avere accesso amministrativo ai tuoi schemi; in caso contrario, Skeema potrebbe non essere in grado di esaminarli o applicare tutte le modifiche. Skeema depositerà i tuoi file SQL in una nuova directory all'interno della tua directory di lavoro; aggiungi il flag -d per scegliere come chiamarlo.

skeema init -h esempio.com -u root -p -d my-sql

Skeema per impostazione predefinita esporta l'SQL per tutti gli schemi sull'host. Ogni schema otterrà la propria sottodirectory all'interno della cartella my-sql. Utilizzare il flag –schema per indicare uno schema specifico da esportare. Verrà posizionato direttamente in my-sql, senza nidificazione di sottodirectory.

Schemi di sincronizzazione

Una volta che hai il tuo SQL, sei pronto per sincronizzarlo con un altro host. Usa il comando push skeema per differenziare il tuo SQL locale da un altro server MySQL. Skeema applicherà automaticamente tutte le modifiche rilevate.

cd mio-sql skeema push -h esempio.com -u root -p -d mio-sql

Prova a modificare una delle istruzioni CREATE TABLE nel tuo SQL. Aggiungi una nuova colonna o modifica il tipo di una esistente. Quando esegui il push di skeema, Skeema genererà un'istruzione ALTER TABLE che aggiorna la tabella remota in modo che corrisponda.

Le operazioni potenzialmente distruttive come l'eliminazione di una tabella o la modifica del tipo di dati di una colonna sono disabilitate per impostazione predefinita. Ciò consente di evitare la perdita di dati involontaria se si esegue Skeema accidentalmente o si specifica un server errato. Le operazioni distruttive vengono attivate aggiungendo il flag –allow-unsafe ai comandi push di skeema.

Uso di più ambienti

Un uso comune di Skeema è mantenere sincronizzati più ambienti. Se disponi di server locali, di sviluppo e di produzione, Skeema ti consente di nominarli in modo da poter eseguire push e pull senza problemi tra di essi.

Pubblicità

Modifica il file .skeema nella directory dello schema per abilitare questa funzionalità. Questa è una struttura di configurazione simile a INI in cui ogni sezione definisce un nuovo ambiente denominato. Avrai un unico ambiente di produzione, aggiunto da skeema init, per cominciare.

Specifica i dettagli della connessione di ogni server in modo da poter eseguire push e pull per mantenere tutto sincronizzato. Le chiavi nella parte superiore del file, al di fuori di ogni sezione, sono impostazioni globali applicate a tutti gli ambienti.

default-character-set=utf8mb4 default-collation=utf8mb4_general_ci generator=skeema:1.5.2-community schema=example-db [produzione] sapore=mysql:8.0 host=esempio.com porta=3306 password=esempio utente=mysql [locale] sapore=mysql:8.0 host=localhost porta=3306 password=esempio utente=mysql

Ora puoi sincronizzare facilmente le modifiche tra gli ambienti:

skeema pull local skeema push production

Questa sequenza di comandi aggiorna prima i file SQL su disco in modo che corrispondano allo schema del server locale. Le modifiche vengono quindi applicate all'ambiente di produzione live. In alternativa, puoi modificare manualmente l'SQL su disco e quindi eseguire il push sia in locale che in produzione.

Questo approccio rende le migrazioni del database semplici, ripetibili e meno soggette a errori. Potresti incorporare Skeema in una pipeline CI per implementare le modifiche al database in produzione come parte del tuo normale flusso di distribuzione.

Dry Runs and Lints

< p>A volte potresti voler controllare le modifiche necessarie a un ambiente senza applicarle effettivamente. In questo caso, usa skeema diff per confrontare un ambiente denominato con i tuoi file SQL su disco. Skeema ti mostrerà le differenze in modo da poter anticipare gli effetti di un push di Skeema.

Pubblicità

Skeema ha anche uno strumento di raccolta dei residui integrato. Esegui skeema lint per analizzare i tuoi file SQL e trovare possibili problemi. Sono supportate diverse regole configurabili. Questi ti aiutano a garantire che il tuo SQL sia coerente, supportato e compatibile con le moderne best practice di MySQL. I risultati di lint vengono mostrati anche durante i comandi skeema push e skeema pull.

Altre opzioni

I comandi Skeema hanno diversi flag condivisi che ti consentono di personalizzare le operazioni. Ecco alcuni dei più significativi:

  • ignora-tabella– Specificare un elenco di nomi di tabelle da escludere dalla sincronizzazione. Queste tabelle non verranno inviate a un host remoto o estratte da esso. Il flag supporta la sintassi delle espressioni regolari.
  • ignore-trigger – ignore-table ma applicato ai trigger.
  • temp-schema – Il nome dello schema temporaneo da creare sull'host del database. Questo database viene utilizzato da Skeema come base di partenza per modifiche intermedie durante le operazioni push/pull. Viene eliminato automaticamente al termine dell'operazione.
  • spazio di lavoro – Controlla dove viene creato lo schema temporaneo. L'impostazione predefinita prevede l'utilizzo dell'host remoto, ma la finestra mobile è supportata come valore alternativo. Questo creerà un nuovo contenitore MySQL Docker sul tuo computer locale per ogni operazione Skeema. Funzionerà solo se hai installato Docker.
  • opzioni di connessione– Un elenco separato da virgole di opzioni MySQL da impostare sulla connessione al database remoto, come sql_mode='ALLOW_INVALID_DATES',innodb_lock_wait_timeout=1.

Queste opzioni ti danno un maggiore controllo su Skeema’ s operazioni. Ti consentono di configurare la connessione al database in modo che corrisponda esattamente alla configurazione MySQL della tua applicazione.

Conclusione

Skeema elimina il problema delle migrazioni del database fornendo automazione e compatibilità con le pipeline di distribuzione CI/CD. Incorpora un linter SQL integrato, uno strumento diff e un meccanismo di sincronizzazione.

Una versione premium aggiunge funzionalità extra inclusa la capacità di lavorare con viste e trigger. Skeema Premium è un'offerta commerciale costruita sulla base del nucleo open source Skeema Community. Viene venduto a $ 99 al mese e supporta anche i sistemi Windows.

L'adozione di Skeema semplifica la condivisione delle modifiche allo schema del database con il tuo team, mantenendo tutti i tuoi ambienti sincronizzati. È una scelta più sicura rispetto alla condivisione manuale di istruzioni ALTER TABLE che potrebbero essere collocate in modo errato e non creare una rappresentazione canonica dello schema corrente.


Posted

in

by

Tags: