Il modo più semplice per spegnere mysql quando lo fa è semplicemente quello di eseguire
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Ecco perché:
Il file di servizio mysql (/etc/init.d/mysql
) si basa sulla presenza del file socket. Storicamente parlando, risalendo a MySQL 4.0, il file socket a volte scompare inspiegabilmente. Ciò ostacola il funzionamento di uno standard service mysql stop
.
Non è abbastanza da dire
mysqladmin -uroot -p -h127.0.0.1 shutdown
perché itinerario mysqld volontà di un utente che entra come root@127.0.0.1
a root@localhost
se il protocollo TCP / IP non è esplicitamente abilitato. Per impostazione predefinita, mysqld sceglierà il percorso minimo di resistenza e di connettersi root@127.0.0.1
alla root@localhost
tramite il file di socket. Tuttavia, se non esiste un file socket, root@localhost
non si connetterà mai.
Anche la documentazione MySQL su mysqladmin dice questo:
Se si esegue l'arresto di mysqladmin durante la connessione a un server locale utilizzando un file socket Unix, mysqladmin attende fino alla rimozione del file ID processo del server, per garantire che il server si sia arrestato correttamente.
Ecco perché è indispensabile abilitare TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Il 30 settembre 2011, ho scritto la mia versione di mysqld_multi
chiamata mysqlservice
(Vedi il mio post: Esecuzione di più istanze sullo stesso host ). Serve come motore virtuale per la connessione a mysqld da diverse porte. Devi solo portare il tuo my.cnf
con parametri personalizzati. In quello script, eseguo arresti di questo tipo:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Ma cos'è ${MYSQLD_STOP}
?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Si prega di notare che uso 127.0.0.1
e una porta esplicita. In questo modo, non sto facendo affidamento su un file socket.
Ho sempre usato mysqladmin --protocol=tcp shtudown
l'alternativa corretta agli arresti di mysql se si service mysql stop
blocca. Andare kill -9
avantimysqld
emysqld_safe
dovrebbe l'ultimo degli ultimi degli ultimi villaggi. (Sì, ho detto le ultime tre volte).
Molte volte, mysqld ha eliminato mysql.sock senza preavviso. Altre persone hanno avuto questo problema anche nel corso degli anni:
EPILOGO
Il segreto è proprio come ho affermato: connettiti a mysql usando mysqladmin via TCP / IP ( --protocol=tcp
) e risolvi il problema shutdown
. Questo deve funzionare perché il privilegio di spegnimento è attivomysql.user
esclusivamente per gli arresti autenticati. Ciò ha salvato il mio giorno di lavoro un paio di volte quando sono stato in grado di emettere un arresto remoto dal mio computer Windows quando spegnevo mysqld su un server Linux.
AGGIORNAMENTO 2013-03-06 22:48 EST
Se sei preoccupato per quello che sta succedendo durante l'arresto, c'è un modo per manipolare il tempo di spegnimento e il modo in cui i dati vengono scaricati su disco, specialmente se hai molti dati InnoDB nel pool di buffer
SUGGERIMENTO N. 1
Se hai molte pagine sporche, puoi abbassare innodb_max_dirty_pages_pct a 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Impostare questo circa 15-30 minuti prima dell'arresto. Ciò fornirà a mysqld la minor quantità possibile di pagine sporche da scrivere su disco.
SUGGERIMENTO # 2
Per impostazione predefinita, innodb_fast_shutdown è 1. Esistono tre valori per questa opzione
- 0: InnoDB esegue un arresto lento, un'eliminazione completa e un'unione del buffer di inserimento prima dell'arresto.
- 1: InnoDB salta queste operazioni allo spegnimento, un processo noto come arresto rapido.
- 2: InnoDB svuota i suoi log e si spegne a freddo, come se MySQL si fosse bloccato; nessuna transazione impegnata viene persa, ma l'operazione di ripristino in caso di arresto prolungato richiede l'avvio successivo.
La documentazione afferma inoltre che:
L'arresto lento può richiedere minuti o addirittura ore in casi estremi in cui sono ancora bufferate quantità sostanziali di dati. Utilizzare la tecnica di arresto lento prima di eseguire l'aggiornamento o il downgrade tra le versioni principali di MySQL, in modo che tutti i file di dati siano completamente preparati nel caso in cui il processo di aggiornamento aggiorni il formato del file.
Utilizzare innodb_fast_shutdown = 2 in situazioni di emergenza o di risoluzione dei problemi, per ottenere l'arresto assoluto più rapido se i dati sono a rischio di corruzione.
I valori predefiniti per innodb_max_dirty_pages_pct e innodb_fast_shutdown dovrebbero andare bene nella maggior parte dei casi.
tmpwatch
elimina, insieme a tutto il resto/tmp
che ha un tempo superiore alla soglia configurata.