sql >> Databasteknik >  >> RDS >> Mysql

Skapa MySQL-frågeövervakningsbash-skript

I den här artikeln kommer vi att diskutera hur du kan konfigurera ett enkelt bash-skript för att kontrollera din MySQL-frågeaktivitet för att säkerställa att långa frågor inte hänger på din server. Det här skriptet kommer också att kunna skicka ett meddelande via e-post när det har stött på en lång pågående fråga.

I de flesta fall bör en MySQL-databasfråga kunna köras inom några sekunder, om det av någon anledning tar längre tid än så kan det finnas en möjlighet att en långvarig MySQL-fråga säkerhetskopierar den databaskön och leder till att din server saktar ner , och eventuellt bli instabil.

För mer information om typer av MySQL-användningsproblem kan du läsa om överdriven MySQL-aktivitet.

Det här skriptet kan endast ställas in på en VPS- eller dedikerad server-värdplan som du har root-åtkomst till.

Skapa MySQL-frågeövervakningsskript

  1. Beroende på komplexiteten i din databas, hur många webbplatser du kör och hur mycket trafik du får, kan den maximala tid som du vill tillåta att en fråga körs vara annorlunda. Jag skulle rekommendera att börja med något konservativt runt 120 sekunder eller 2 minuter, och om du loggar in på din server efter att ha blivit varnad och den fortfarande verkar vara stabil, kan du förmodligen öka utlösningsnivån till något högre. Börja redigera en ny fil för bash MySQL-frågevarningsskriptet, i det här fallet kommer jag att använda vim text-editor och skapa en ny fil som heter MySQLMon i min användares hemkatalog med följande kommando:vim /home/userna1/MySQLMon Då vill du trycka på i för att ange Infoga läge när vim har laddats upp och skriv in följande kod:
    #!/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

    Den här koden kan se lite överväldigande ut till en början, men nedbruten är den egentligen ganska enkel. Först deklarerar vi en trigger variabel och ställ in den på 120 sekunder. Sedan ställer vi in ​​ett activeQcount variabel för att i princip hålla alla frågor som är längre än vår utlösare värde.

    Vi använder sedan en bash if uttalande för att kontrollera om vårt activeQcount värdet är över noll, vilket visar att det finns frågor som kör längre än vår inställda trigger värde. Därefter börjar vi helt enkelt eko text till en platshållarfil som heter /tmp/MySQLMon , så äntligen katter vi platshållarfilen som bara läser upp den och sedan skickar vi den | till e-posten funktion följt av ett ämne vi vill använda, mottagarens adress, sedan kan du ange — -r följt av e-postadressen du vill att meddelandet ska komma från.

  2. När du får ett e-postmeddelande kommer det att se ut ungefär som det här exemplet:

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

Konfigurera cron-jobb för att köra MySQLMon-skript

  1. Nu bör du ha din MySQL-frågaövervakande bash-skriptinställning, sedan vill du skapa ett cron-jobb för att köra den här uppgiften. Om du inte känner till cron-jobb kan du läsa om hur du kör ett cron-jobb. Du kan använda rullgardinsmenyn cPanel var 5:e minut, vilket bör få det sista cron-jobbet att se ut så här:*/5 * * * * bash /home/userna1/MySQLMon

Du bör nu ha framgångsrikt konfigurerat ett bash-skript för att övervaka dina MySQL-frågor för att fånga upp långa pågående, och för att varna dig via e-post när det fångar några. Du bör också veta hur du ställer in ett cron-jobb för att köra det skriptet på ett visst intervall så att det ständigt körs utan ytterligare manuell inblandning från dig själv.


  1. SQLite datum och tid funktioner

  2. SQL Server XML-fråga med flera namnområden

  3. MariaDB LOCALTIMESTAMP() Förklarad

  4. SQL Server 2008 - Hur returnerar jag en användardefinierad tabelltyp från en tabellvärderad funktion?