sql >> Database >  >> RDS >> Mysql

Maak een bash-script voor het bewaken van MySQL-query's

In dit artikel bespreken we hoe u een eenvoudig bash-script kunt configureren om uw MySQL-queryactiviteit te controleren om ervoor te zorgen dat lange query's niet op uw server blijven hangen. Dit script kan je ook een e-mail sturen wanneer het een langlopende vraag heeft gevonden.

In de meeste gevallen zou een MySQL-databasequery binnen een paar seconden moeten kunnen worden uitgevoerd. Als het om de een of andere reden langer duurt, bestaat de mogelijkheid dat een langlopende MySQL-query een back-up van die databasewachtrij maakt en uw server vertraagt , en mogelijk onstabiel worden.

Voor meer informatie over soorten MySQL-gebruiksproblemen kunt u lezen over overmatige MySQL-activiteit.

Dit script kan alleen worden ingesteld op een VPS- of dedicated serverhostingplan waartoe je root-toegang hebt.

Maak een MySQL-script voor querycontrole

  1. Afhankelijk van de complexiteit van uw database, hoeveel websites u beheert en hoeveel verkeer u ontvangt, kan de maximale hoeveelheid tijd die u wilt toestaan ​​dat een zoekopdracht wordt uitgevoerd, verschillen. Ik zou aanraden te beginnen met iets conservatiefs van ongeveer 120 seconden of 2 minuten, en als u zich aanmeldt bij uw server nadat u bent gewaarschuwd en het lijkt nog steeds stabiel te werken, kunt u het triggerniveau waarschijnlijk verhogen naar iets hogers.Begin met bewerken een nieuw bestand voor het bash MySQL-querywaarschuwingsscript, in dit geval gebruik ik de vim text-editor en maak een nieuw bestand aan met de naam MySQLMon in de homedirectory van mijn gebruiker met het volgende commando:vim /home/userna1/MySQLMon Dan moet je op i . drukken om Invoegen in te voeren modus zodra vim is geladen en voer de volgende code in:
    #!/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

    Deze code kan in het begin een beetje overweldigend lijken, maar opgesplitst is het eigenlijk vrij eenvoudig. Eerst declareren we een trigger variabele en stel dat in op 120 seconden. Dan stellen we een activeQcount in variabele om in principe alle zoekopdrachten vast te houden die langer zijn dan onze trigger waarde.

    We gebruiken dan een bash if verklaring om te controleren of onze activeQcount waarde is boven nul, wat aangeeft dat er zoekopdrachten zijn die langer duren dan onze ingestelde trigger waarde. Vervolgens beginnen we gewoon met echo'en tekst naar een plaatsaanduidingsbestand met de naam /tmp/MySQLMon , dan gaan we eindelijk katten dat tijdelijke bestand dat het net uitleest en dan pipen we het | naar de mail functie gevolgd door een onderwerp dat we willen gebruiken, het adres van de ontvanger, dan kunt u invoeren in — -r gevolgd door het e-mailadres waarvan u wilt dat het bericht komt.

  2. Als u een e-mailwaarschuwing ontvangt, ziet deze er ongeveer uit als dit voorbeeld:

    ======================================================================================
    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)
    =====================================================================================

Cron-taak instellen om MySQLMon-script uit te voeren

  1. Nu zou je je MySQL-querymonitoring bash-script moeten hebben ingesteld, daarna wil je een cron-taak maken om deze taak uit te voeren. Als je niet bekend bent met cron-taken, kun je lezen hoe je een cron-taak uitvoert. Je kunt de cPanel-vervolgkeuzelijst elke 5 minuten gebruiken, waardoor de uiteindelijke cron-taak er als volgt uitziet:*/5 * * * * bash /home/userna1/MySQLMon

U zou nu met succes een bash-script moeten hebben ingesteld om uw MySQL-query's te controleren om langlopende query's op te vangen en om u via e-mail te waarschuwen wanneer deze worden gedetecteerd. Je moet ook weten hoe je een cron-taak instelt om dat script met een vast interval uit te voeren, zodat het constant wordt uitgevoerd zonder verdere handmatige tussenkomst van jezelf.


  1. De eenvoudige handleiding voor het gebruik van subquery's in SQL Server

  2. MySqlCommand Command.Parameters.Add is verouderd

  3. Hoe kan ik een tabel vergrendelen bij lezen, met behulp van Entity Framework?

  4. codering van UTF8 komt niet overeen met locale en_US; de gekozen LC_CTYPE-instelling vereist codering LATIN1