Як захопити запити, запущені на сервері MySQL?


14

Ми намагаємось виконати налагодження продуктивності сервера, і я хотів би зробити знімок запитів, що виконуються на нашому сервері MySQL протягом пари хвилин.

Я знайомий з MySQL SHOW FULL PROCESSLIST, однак я хотів би мати можливість запустити це за допомогою командного рядка, щоб я міг перекинути його у файл та опублікувати його.

Чи є спосіб вивести цей запит у файл і чи він запускається щосекунди?

Чи є кращий спосіб зафіксувати всі запущені запити?

Зауважте, що мене не цікавлять лише повільні запити (я знайомий з журналом повільних запитів).


Яку ОС ви працюєте? Це зробити надзвичайно просто в Linux, тому я думаю, що Windows?
Патрік

@Patrick Радий почути, що на Linux це легко! Вогонь далеко ...
hafichuk

1
Більшість запитів запускаються та закінчуються набагато менше секунди та ніколи не відображаються у вашому списку.
Джоел Коел

додатково довші запити з’являтимуться багато разів один раз для кожного циклу, але точно, якщо ви хочете, ви можете просто echo show full processlist | mysqlабо краще SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"в циклі в bash. Додайте пару рядків, і ви отримаєте таку ж функцію запиту, ніж innotopабо pt-kill
theist

Відповіді:


10

Я б використовував журнал повільних запитів. Він фіксує всі запити, не тільки ті, які повільно, якщо встановити long_query_time = 0.

Він також фіксує ВСІ запити, що не відповідає правилам TCP-нюхання, згаданим тут; вони не захоплюють запити, виконані через сокет. Ditto для перегляду ШОУ ПРОЦЕСЛІСТА; ви пропустите швидкодіючі запити.

Якщо ви хочете фіксувати запити за допомогою списку процесів або через трафік TCP, я б запропонував використати дайджест pt-query-запису Percona Toolkit. Він може опитувати список процесів для вас (і мати сенс з результатів, що дуже важко зробити, якщо ви збираєте купу зразків самостійно), і він може інтерпретувати протокол TCP MySQL, так що ви можете захопити деякі TCP трафік та проаналізуйте його. Звичайно, це також найкращий агрегатор запитів / профілер / репортер, який коли-небудь написаний, але ви не сказали, що хочете робити з запитами після їх захоплення.


13

Найбільш надійним способом було б використання "загального журналу запитів", який охопить усі запити: http://dev.mysql.com/doc/refman/5.1/uk/query-log.html

Ви не вказуєте версію сервера MySQL, але якщо у вас 5.1.12 або пізнішої версії, ви можете ввімкнути та відключити її із глобальною змінною через SQL; Детальну інформацію див. у документації.


Дякую @Daniel Ми це ввімкнули, однак у журналі немає інформації про часові позначки. Будь-яка ідея, як отримати позначку часу?
hafichuk

Вибачте, ні, нічого, крім вказівки на посібник.
Даніель Пітман

2
Повільний журнал запитів з long_query_time = 0 - кращий варіант; він все одно буде захоплювати всі запити.
Барон Шварц

+1 для барона: загальний журнал запитів не включає необхідні показники ефективності. Також є сценарії Perl, що входять до сервера MySQL, для аналізу журналу повільних запитів (які видаляють буквальні значення з предикатів). Але зауважте, що старіші версії MySQL не підтримують long_query_time менше 1 секунди - якщо це так для вас, то оновлення - в останніх версіях набагато більше підвищення продуктивності.
symcbean

5

Спробуйте цю команду як root (або використовувати sudo):

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

Знайдено http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/


4

Звичайно:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

Ура


Ах ... міскладмін. Ідеально, дякую @ HTTP500
hafichuk

1
Це фактично запускає команду listlist кожні 1 секунду. Деякі дуже швидкі запити все ще можуть уникнути захоплення; якщо навантаження складається з декількох великих запитів, вона буде працювати, якщо вона складається з багатьох невеликих запитів, вона може не робити.
LSerni

@Isemi, ОП просила "щосекунди або близько того".
HTTP500

4

Це може бути місце для проксі-сервера Mysql . Це в основному дозволяє захоплювати (і маніпулювати) запитами, що надсилаються. Основна установка для перехоплення досить проста. Потім просто змініть конфігурацію клієнта, щоб вказати на проксі, щоб ви могли захопити всі запити.


4

Термінал на основі Wireshark програма tshark може допомогти:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkдасть вам tshark на Amazon Linux і sudo apt-get install tsharkдасть вам tshark на Ubuntu 14+


3

Я використовував рішення Руї Педро Бернардіно. Чудово працює, за винятком того, що я змінив пару речей у першому рядку, як детально описано нижче ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

Я шукав і шукав, і, нарешті, приземлився в MONyog для моніторингу всіх запитів у режимі реального часу, які виконуються на сервері mysql. Єдине, що слід зазначити - це таблиця «Performance_schema» та «заяви_дигеста», щоб увімкнути та Performance_schema - доступний з MySQL 5.6.14 і вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.