I denne artikel vil vi diskutere, hvordan du kan konfigurere et simpelt bash-script til at kontrollere din MySQL-forespørgselsaktivitet for at sikre, at lange forespørgsler ikke hænger på din server. Dette script vil også være i stand til at sende dig en e-mail, når det er stødt på en lang kørende forespørgsel.
I de fleste tilfælde burde en MySQL-databaseforespørgsel være i stand til at udføres inden for et par sekunder, hvis det af en eller anden grund tager længere tid end det, kan der være mulighed for, at en langvarig MySQL-forespørgsel sikkerhedskopierer databasekøen og fører til, at din server bliver langsommere , og muligvis blive ustabil.
For mere information om typer af MySQL-brugsproblemer kan du læse om overdreven MySQL-aktivitet.
Dette script kan kun konfigureres på en VPS eller dedikeret server-hostingplan, som du har root-adgang til.
Opret MySQL-forespørgselsovervågningsscript
- Afhængigt af kompleksiteten af din database, hvor mange websteder du kører, og hvor meget trafik du får, kan den maksimale tid, du gerne vil tillade en forespørgsel at køre, være anderledes. Jeg vil anbefale at starte med noget konservativt omkring 120 sekunder eller 2 minutter, og hvis du logger ind på din server efter at være blevet advaret, og det ser ud til at det stadig kører stabilt, kan du sandsynligvis øge triggerniveauet til noget højere. Start redigeringen en ny fil til bash MySQL query alert scriptet, i dette tilfælde vil jeg bruge vim tekst-editor og lave en ny fil kaldet MySQLMon i min brugers hjemmemappe med følgende kommando:
vim /home/userna1/MySQLMon
Så vil du gerne trykke i for at indtaste Indsæt tilstand, når vim er indlæst, og indtast følgende kode:
#!/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
Denne kode kan se lidt overvældende ud i starten, men opdelt er den egentlig ret simpel. Først erklærer vi en trigger variabel og indstil den til 120 sekunder. Så sætter vi et activeQcount variabel til stort set at indeholde forespørgsler, der er længere end vores trigger værdi.Vi bruger så en bash if erklæring for at kontrollere, om vores activeQcount værdien er over nul, hvilket viser, at der er forespørgsler, der kører længere end vores indstillede trigger værdi. Dernæst begynder vi simpelthen at ekkoe tekst ind i en pladsholderfil kaldet /tmp/MySQLMon , så katter vi endelig den pladsholderfil, som bare læser den op, og så sender vi den | til mailen funktion efterfulgt af et emne, vi gerne vil bruge, modtagerens adresse, så kan du indtaste — -r efterfulgt af den e-mailadresse, du gerne vil have beskeden fra.
- Når du modtager en e-mail-advarsel, vil den ligne dette eksempel:
======================================================================================
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)
=====================================================================================
Konfigurer cron-job til at køre MySQLMon-script
- Nu skulle du have din MySQL-forespørgselsovervågningsbash-script-opsætning, og derefter vil du oprette et cron-job for at køre denne opgave. Hvis du ikke kender til cron-job, kan du læse om, hvordan du kører et cron-job. Du kan bruge rullemenuen cPanel hvert 5. minut, hvilket skulle få det sidste cron-job til at se sådan ud:
*/5 * * * * bash /home/userna1/MySQLMon
Du skulle nu have opsat et bash-script til at overvåge dine MySQL-forespørgsler for at fange eventuelle langvarige, og for at advare dig via e-mail, når det fanger nogen. Du bør også vide, hvordan du opsætter et cron-job til at køre det script på et bestemt interval, så det konstant kører uden yderligere manuel indgriben fra dig selv.