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.
mysqldumpslowmysqldumpslow 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.
5 Covert skins can now be exchanged for knives or gloves using the CS2 trade…
This blog will walk you through ways to overcome database corruption which can be the…
How to protect your identity and data amidst many OnlyFans leaks? Learn here.
This blog will walk you through ways to analyse database systems using SQL. Tune in.
What are the best movies on Netflix is a question asked by many movie aficionados.…
Here’s how to master the handling of NULL values without using the COALESCE SQL clause.