В тази статия ще обсъдим как можете да конфигурирате прост bash скрипт, за да проверите активността на вашите заявки за MySQL, за да гарантирате, че дългите заявки не висят на вашия сървър. Този скрипт също ще може да ви изпрати известие по имейл, когато срещне продължителна заявка.
В повечето случаи заявка за база данни на MySQL би трябвало да може да се изпълни в рамките на няколко секунди, ако по някаква причина отнема повече време от това, може да има възможност продължителна MySQL заявка да архивира тази опашка от база данни и да доведе до забавяне на вашия сървър , и вероятно да стане нестабилен.
За повече информация относно видовете проблеми с използването на MySQL можете да прочетете за прекомерната активност на MySQL.
Този скрипт може да бъде настроен само на VPS или хостинг план за специален сървър, до който имате root достъп.
Създайте MySQL скрипт за наблюдение на заявки
- В зависимост от сложността на вашата база данни, колко уебсайта управлявате и колко трафик получавате, максималният период от време, през който искате да позволите да се изпълнява заявка, може да бъде различен. Бих препоръчал да започнете с нещо консервативно за около 120 секунди или 2 минути и ако влизате в сървъра си, след като сте били предупредени и изглежда, че все още работи стабилно, вероятно бихте могли да увеличите нивото на задействане до нещо по-високо. Започнете да редактирате нов файл за bash MySQL скрипт за предупреждение за заявка, в този случай ще използвам vim текстов редактор и създаване на нов файл, наречен MySQLMon в домашната директория на моя потребител със следната команда:
vim /home/userna1/MySQLMon
След това ще искате да натиснете i за да въведете Вмъкване режим, след като vim се зареди и въведете следния код:
#!/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
Този код може да изглежда малко зашеметяващ в началото, но разбитият е наистина доста прост. Първо декларираме сзадействане променлива и я настроите на 120 секунди. След това задаваме activeQcount променлива, за да задържи всички заявки, които са по-дълги от задействането стойност.След това използваме bashif изявление, за да проверите дали нашият activeQcount стойността е над нулата, което показва, че има заявки, работещи по-дълго от зададеното от нас задействане стойност. След това просто започваме ехо текст в заместващ файл, наречен /tmp/MySQLMon , след което накрая ниекати този файл-заместител, който просто го чете и след това го изпращаме | допоща функция, последвана от тема, която бихме искали да използваме, адрес на получателя, след което можете да въведете в — -r последвано от имейл адреса, от който искате да идва съобщението.
- Когато получите сигнал по имейл, той ще изглежда много като този пример:
======================================================================================
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 задача за изпълнение на MySQLMon скрипт
- Сега трябва да имате настройка на bash скрипта за наблюдение на MySQL заявки, след това ще искате да създадете задание за cron, за да изпълните тази задача. Ако не сте запознати с заданията на cron, можете да прочетете как да стартирате задача за cron. Можете да използвате падащото меню cPanel на всеки 5 минути, което би трябвало да направи окончателната работа на cron да изглежда така:
*/5 * * * * bash /home/userna1/MySQLMon
Вече трябва да сте настроили успешно bash скрипт, който да наблюдава вашите MySQL заявки, за да улавя всички дълго изпълнявани такива и да ви предупреждава по имейл, когато улови такива. Трябва също така да знаете как да настроите задание на cron, за да стартирате този скрипт на определен интервал, така че да работи постоянно без допълнителна ръчна намеса от ваша страна.