Atsiradus MySQL veikimo problemoms, vienas iš pagrindinių triktis šalinančių veiksmų yra nustatyti ilgai veikiančias užklausas ir jas optimizuoti. Apžvelgsime MySQL funkciją, padedančią nustatyti ilgą laiką veikiančias užklausas – MySQL lėtų užklausų įrašus (“slow query log”).
MySQL lėtų užklausų įrašai susideda iš SQL užklausų, kurioms vykdyti reikia daugiau laiko nei nurodyta long_query_time
kintamajame. Šio kintamojo minimalios ir numatytosios reikšmės yra atitinkamai 0 ir 10. Jei užklausos vykdymas užtrunka ilgiau nei nustatyta, serveris padidina Slow_queries
kintamojo reikšmę – šio kintamojo reikšmė didėja neatsižvelgiant į tai ar lėtų užklausų įrašai yra įjungti, ar ne. Verta paminėti, kad mysqld įrašo užklausą į lėtų užklausų žurnalą tik tada, kai ji yra pilnai įvykdyta ir visi užraktai (“LOCK
“) nebeveikia, todėl įrašų tvarka gali skirtis nuo užklausų vykdymo tvarkos.
Norėdami įjungti lėtų užklausų įrašus MySQL ekosistemoje, atlikite šiuos veiksmus:
mysql -u root -p
;SET GLOBAL slow_query_log = 'ON';
Kai lėtų užklausų įrašai yra įjungti, pagal numatytuosius nustatymus yra įrašomos visos užklausos, kurių įvykdymas trunka ilgiau nei 10 sekundžių. Norėdami pakeisti intervalą įveskite šią komandą, kur x yra laikas sekundėmis:
SET GLOBAL long_query_time = x;
Jei lėtų užklausų įrašų failo pavadinimas nėra nurodytas, numatytasis pavadinimas yra host_name-slow.log
. Šis failas yra /var/lib/mysql
aplanke – serveris sukuria šį failą ten, nebent yra nurodyta kita direktorija: norėdami pakeisti įrašų vietą arba failo pavadinimą, panaudokite užklausą SET GLOBAL slow_query_log_file = '/direktorija/failopavadinimas';
Norėdami įsitikinti, kad lėtų užklausų įrašai veikia tinkamai, iš naujo nustatykite sesijos kintamuosius atsijungdami ir vėl prisijungdami prie MySQL ir įveskite šią komandą, kur x yra laikas sekundėmis:
SELECT SLEEP(x);
Lėtų užklausų įrašuose dabar turėtų atsirasti informacija apie užklausą.
Norėdami išjungti lėtų užklausų įrašus panaudokite SET GLOBAL slow_query_log = 'OFF';
užklausą.
Lėtų užklausų įrašai gali būti optimizuojami įjungiant tam tikrus kintamuosius arba naudojant tam tikras parinktis:
log_slow_admin_statements
kintamąjį. Administracinius teiginius sudaro ALTER TABLE
, ANALYZE TABLE
, CHECK TABLE
, CREATE INDEX
, DROP INDEX
, OPTIMIZE TABLE
ir REPAIR TABLE
užklausos;log_queries_not_using_indexes
kintamąjį. Verta paminėti, kad kai į lėtų užklausų įrašus įrašomos užklausos kurios nenaudoja indeksų lėtų užklausų žurnalas gali greitai išaugti – norėdami nustatyti šių užklausų limitą pakeiskite kintamojo log_throttle_queries_not_using_indexes
reikšmę į 1 (numatytoji reikšmė yra 0);log_throttle_queries_not_using_indexes
riboja užklausų įrašomų į failą per minutę skaičių. Numatytoji vertė 0 reiškia, kad nėra jokių apribojimų;min_examined_row_limit
kintamajame nebus fiksuojami lėtų užklausų įrašuose;log_slow_slave_statements
. Šis kintamasis veikia tik tada, jei naudojama teiginiais grįsta replikacija;Taip pat verta paminėti, kad serveris įrašo mažiau informacijos į lėtų užklausų įrašus jei naudojama --log-short-format
parinktis.
Kai įjungti lėtų užklausų įrašai serveris rašo reikšmes į direktoriją, nustatytą log_output
kintamajame – jei vieta nustatyta į NONE
į lėtų užklausų įrašus nebus rašomos jokios užklausos net ir tuo atveju, jei lėtų užklausų įrašai bus įjungti.
Failą /var/log/mysql/mysql-slow.log
gali pasiekti tik root
vartotojas naudodamasis sudo
privilegijomis – prieiga prie failo naudojant kitą vartotoją nėra galima.
Prieš lėtų užklausų įrašus rašomas simbolis #
ir juose yra:
Query_time
vertė reiškia užklausos vykdymo laiką sekundėmis;Lock_time
vertė nurodo laiką užraktams (“LOCK
“) gauti sekundėmis;Rows_sent
vertė yra įrašų, išsiųstų klientui, skaičius;Rows_examined
yra įrašų, prie kurių priėjo serveris, skaičius.MySQL užklausų įrašymas vengia slaptažodžių įrašymo į įrašus paprastu tekstu. MySQL vengia įrašyti slaptažodžius paprastu tekstu CREATE USER
, ALTER USER
ir GRANT
teiginiams su IDENTIFIED BY
priedėliais, SET PASSWORD
užklausai, SLAVE START
užklausai su PASSWORD
priedėliu, taip pat CREATE SERVER
ir ALTER SERVER
užklausoms su OPTIONS
priedėliu.
mysqldumpslow
mysqldumpslow
yra įrankis skirtas lėtų užklausų įrašų tyrimui ir panašių užklausų sugrupavimui. Žemiau pateikiami keli šio įrankio naudojimo pavyzdžiai:
mysqldumpslow
užklausa be jokių papildomų priedėlių parodys visų užklausų, vykdytų duomenų bazėje, rezultatus.
Pavyzdžiui, užklausa mysqldumpslow /var/log/mysql/mysql-slow.log
galėtų pateikti šiuos rezultatus (rezultatai yra pavyzdys):
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 1 Time=1.17s (1s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
SELECT * FROM table_1
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 15 Time=127.41s (127s) Lock=0.00s (0s) Rows=851752.0 (851752), root[root]@localhost
SELECT * FROM table_2
mysqldumpslow -r -t 10 /var/log/mysql/mysql-slow.log
parodys paskutines 10 užklausų naudojant atvirkštinę rūšiavimo tvarką.Yra daugybė užklausų kurias galima analizuoti naudojant šį įrankį – tereikia įgauti šiek tiek praktinių žinių.
mysqldump
palaiko įvairias parinktis:
-a | Skaičiai nebus verčiami į N, tekstas nebus verčiamas į S. |
-n | Skaičiai su minimaliu skaitmenų skaičiumi bus verčiami į N. |
-g | Rezultatuose bus rodomos tik tos užklausos, kurios atitinka specifinį užklausų modelį. |
-h | Galima nurodyti serverio pavadinimą įrašų failo pavadinime. |
-i | Turi būti nurodytas serverio instancijos pavadinimas. |
-l | Užrakinimo laikas (“lock time”) neturėtų būti atimamas iš bendro laiko per kurį buvo vykdoma užklausa. |
-r | Rūšiavimas turėtų būti vykdomas atgaline tvarka. |
-s | Reikia apibrėžti kaip rūšiuoti išvestį. Išvestis gali būti rūšiuojama pagal užklausos laiką (“t “), vidutinį užklausų laiką (“at “), užraktų (“LOCK”) laiką (“t “), vidutinį užraktų (“LOCK”) laiką (“al “), išsiųstus įrašus (“r “), vidutinį išsiųstų įrašų skaičių (“ar “) arba pagal skaičių (“c “). |
-t | Rodyti tik pirmas x užklausas. |
–debug | Rodyti derinimo (“debugging”) informaciją. |
–help | Rodyti pagalbos pranešimą ir atsijungti nuo sistemos. |
–verbose | Reikia įjungti režimą, kuris rodo daugiau informacijos apie tai, ką daro programa. |
mysqldumpslow
prieinamų parinkčių sąrašasLėtų užklausų įrašų funkcija MySQL leidžia programuotojams fiksuoti užklausas viršijančias nurodytą laiko intervalą. Tokiu būdu programuotojai gali daug lengviau rasti kliūtis kurios trukdo MySQL užklausoms ir pašalinti neefektyvias ar per daug laiko reikalaujančias užklausas.
Dive deep into ways to best index your data and learn how to mysql if…
Dive deep into ways to load big data sets into MySQL with BreachDirectory. From MySQL…
Can the SQL EXPLAIN statement be a DoS vector and how to mitigate this threat?…
What is Cross Site Scripting, how does it work, and how can developers prevent it?…
BreachDirectory explains the risks of compressed files with a password on them for your infrastructure…
There have been rumors about a data breach targeting Schneider Electric. Did a data breach…