Mysql
 sql >> Database >  >> RDS >> Mysql

Crea script bash per il monitoraggio delle query MySQL

In questo articolo discuteremo di come configurare un semplice script bash per controllare l'attività delle query MySQL per assicurarti che le query lunghe non siano sospese sul tuo server. Questo script sarà anche in grado di inviarti un avviso tramite e-mail quando ha riscontrato una query di lunga durata.

Nella maggior parte dei casi una query del database MySQL dovrebbe essere in grado di essere eseguita in pochi secondi, se per qualche motivo impiega più tempo, potrebbe esserci la possibilità che una query MySQL di lunga durata esegua il backup della coda del database e provochi un rallentamento del server , e possibilmente diventare instabile.

Per ulteriori informazioni sui tipi di problemi di utilizzo di MySQL puoi leggere l'eccessiva attività di MySQL.

Questo script può essere configurato solo su un piano di hosting VPS o server dedicato a cui hai accesso come root.

Crea uno script di monitoraggio delle query MySQL

  1. A seconda della complessità del tuo database, del numero di siti web che gestisci e della quantità di traffico che ricevi, il tempo massimo per il quale vorresti consentire l'esecuzione di una query potrebbe essere diverso. Consiglierei di iniziare con qualcosa di conservativo di circa 120 secondi o 2 minuti, e se accedi al tuo server dopo essere stato avvisato e sembra essere ancora stabile, probabilmente potresti aumentare il livello di trigger a qualcosa di più alto. Inizia a modificare un nuovo file per lo script di avviso di query MySQL bash, in questo caso userò il vim editor di testo e creare un nuovo file chiamato MySQLMon nella home directory del mio utente con il seguente comando:vim /home/userna1/MySQLMon Quindi vorrai premere i per inserire Inserisci mode una volta caricato vim e inserire il codice seguente:
    #!/bin/bash trigger=120 activeQcount=`mysql -e "show full processlist;" |
    egrep -v "leechprotect|root|Time" | awk -v T=$trigger '{ if ( $6 > T ) print $0}' |
    wc -l` if [ $activeQcount -gt 0 ] then echo
    "=====================================================================================" >
    /tmp/MySQLMon echo "= MySQLMon has found a new query running for longer than 120 seconds (2 mins)"
    >> /tmp/MySQLMon echo
    "=====================================================================================" >>
    /tmp/MySQLMon date >> /tmp/MySQLMon echo "" >> /tmp/MySQLMon mysql -e "show full processlist;"
    >> /tmp/MySQLMon echo
    "=====================================================================================">>
    /tmp/MySQLMon cat /tmp/MySQLMon | awk -v T=$trigger '{ if ( $6 > T ) print $0}' |
    mail -s"Caught query running longer than $trigger seconds" [email protected] -- -r
    "[email protected]" fi

    Questo codice può sembrare un po' opprimente all'inizio, ma scomposto è davvero abbastanza semplice. Per prima cosa stiamo dichiarando un trigger variabile e impostandola su 120 secondi. Quindi stiamo impostando un activeQcount per contenere sostanzialmente tutte le query più lunghe del nostro trigger valore.

    Usiamo quindi un bash se dichiarazione per verificare se il nostro activeQcount il valore è superiore a zero, a indicare che ci sono query in esecuzione più a lungo del nostro trigger impostato valore. Quindi iniziamo semplicemente a fare eco testo in un file segnaposto chiamato /tmp/MySQLMon , poi finalmente gatto quel file segnaposto che lo legge e poi lo convogliamo | alla posta funzione seguita da un oggetto che vorremmo utilizzare, l'indirizzo del destinatario, quindi puoi inserire — -r seguito dall'indirizzo email da cui vorresti che provenisse il messaggio.

  2. Quando ricevi un avviso e-mail, sarà molto simile a questo esempio:

    ======================================================================================
    MySQLMon has found a new query running for longer than 120 seconds (2 mins)
    =====================================================================================
    Tue Dec 4 15:07:42 EST 2012 40901 userna1_phpb1 localhost userna1_phpb1 Query 342
    Sending data
    INSERT INTO users (userID, name, base64_decode)
    =====================================================================================

Imposta il lavoro cron per eseguire lo script MySQLMon

  1. Ora dovresti avere la configurazione dello script bash per il monitoraggio delle query MySQL, quindi dovrai creare un lavoro cron per eseguire questa attività. Se non hai familiarità con i lavori cron, puoi leggere come eseguire un lavoro cron. Puoi utilizzare il menu a discesa cPanel ogni 5 minuti, il che dovrebbe rendere il lavoro cron finale simile a:*/5 * * * * bash /home/userna1/MySQLMon

Ora dovresti aver impostato con successo uno script bash per monitorare le tue query MySQL per intercettare quelle di lunga durata e per avvisarti via e-mail quando ne rileva una. Dovresti anche sapere come configurare un processo cron per eseguire quello script a un intervallo prestabilito in modo che venga eseguito costantemente senza ulteriore intervento manuale da parte tua.