2014-10-24 19 views
7

Non sono un esperto di MySQL.C'è un buon modo per rilevare che MySQL è "pronto?"

Ho uno script che installa MySQL, inizia mysqld e quindi utilizza mysql per eseguire l'inizializzazione.

Attualmente, al fine di avere questo lavoro, io entro in un ciclo che (scusa per il pseudocodice miscelazione più lingue): (!)

mysqld_safe /* ... */ & /* ampersand to start in background so we can continue */ 
while(fileDoesNotExist("/tmp/mysql.sock")) { 
    sleepFor100ms(); 
} 
mysql -u root /* and so forth */ initialize.sql 

Questo sembra funzionare, ma ha molteplici problemi:

  • polling odori divertente,
  • non sono abbastanza su MySQL intelligente per sapere se guardare quel percorso hard-coded /tmp/mysql.sock è intelligente a tutti.

eppure è molto più facile che cercare di (ad esempio) consumano e analizzare lo stdout (o è stderr?) Di mysqld_safe per capire se il server è stato avviato.

La mia domanda ristretta è se c'è un modo per emettere un inizio blocco di mysqld: posso rilasciare qualsiasi comando che blocchi fino a quando il database non è stato avviato, quindi esce (e stacca, forse lasciando un file PID) e ha un compagno stop command? (O forse mi permette di leggere il file PID ed emettere il mio SIGTERM?)

La mia domanda più ampia è, sono sulla buona strada, o c'è qualcosa di totalmente diverso e più facile (essere "più semplice" per me dovrebbe essere leggero, non mi interessa l'installazione di una serie di strumenti come Puppet o DbMaintain/Liquibase o altro) per risolvere il problema che ho articolato? Cioè, a partire da un file .gz contenente MySQL, installare un dominio utente MySQL e inizializzare un database?

+0

Non c'è bisogno di essere o non essere un esperto per fare una domanda qui. – tadman

+0

Grazie per l'accoglienza.Ho solo pensato che sarebbe stato utile per il contesto, quindi la gente non avrebbe parlato in testa. :) –

+0

Sarebbe [il polling per vedere se esiste un file] (http://stackoverflow.com/questions/2379829/while-loop-to-test-if-a-file-exists-in-bash) essere un passo avanti la giusta direzione? – tadman

risposta

5

Controlla lo script della shell di init per mysqld. Fanno il polling, in una funzione chiamata wait_for_pid().

Questa funzione verifica l'esistenza del file pid e, se non esiste ancora, dorme per 1 secondo intero, quindi riprova. C'è un timeout predefinito di 900 secondi, a quel punto si arresta e si conclude che non si avvia (e genera un messaggio totalmente inutile "Il server esce senza aggiornare il file PID").

Non è necessario indovinare dove si trova il file pid. Se stai iniziando a mysqld_safe, dovresti dirlo allo dove dovrebbe creare il file pid, usando l'opzione --pid-file.

Una parte difficile è che il file pid non viene creato fino a quando mysqld non si inizializza. Questo può richiedere un po 'di tempo se è necessario eseguire il ripristino di emergenza utilizzando i file di registro InnoDB ei file di registro sono grandi. Quindi potrebbe accadere che 900 secondi di timeout non siano abbastanza lunghi e si verifichi un errore spuria, anche se mysqld inizia con successo un momento dopo il timeout.

È inoltre possibile leggere il registro degli errori o l'output della console di mysqld. Dovrebbe alla fine emettere una riga che dice "pronto per le connessioni".

Per leggere fino ad ottenere questa linea, e quindi terminare la lettura, è possibile utilizzare:

tail -f | sed -e '/ready for connections/q' 
+0

Grazie. Immagino che la mia strada fosse più vicina di quanto pensassi, ma apprezzo il consiglio sul file PID. Due cose che preferisco su questa soluzione: (1) anche se scelgo di "indovinare" la posizione (mysqld_safe sembra scegliere un percorso predefinito che deriva dalla directory di installazione), significa che se ho più installazioni, ho vinto ' t errore uno per un altro, (2) come hai detto, posso specificare esplicitamente il percorso per chiarezza o robustezza. Grazie! –

+0

Sì, il file PID ha una posizione predefinita nella directory dei dati. Quel default può essere sovrascritto anche in uno o più file my.cnf. Quindi indovinare è difficile. Meglio specificare la posizione, che sovrascriverà qualsiasi impostazione in my.cnf o l'impostazione predefinita predefinita. –

+0

Per il mio caso d'uso, sto facendo l'installazione, quindi alcuni dei pericoli che citi sono meno importanti per me, e posso decidere che la semplicità di DRY sia migliore; nel mio caso, mi interessa solo * una volta * dove si trova il file PID, e questo è durante il mio script di installazione quando sto inizializzando il database. Quindi, fintanto che * my * esecuzione di mysqld_safe lo colloca in una posizione prevedibile, saprò quale file PID rilevare (piuttosto che ripeterlo sulla riga di comando e nel ciclo di polling), in modo da rendere lo script piccolo il più possibile –

Problemi correlati