Назад | Перейти на главную страницу

Как фиксировать запросы, выполняемые на сервере MySQL?

Мы пытаемся выполнить некоторую отладку производительности сервера, и я хотел бы сделать снимок запросов, выполняемых на нашем сервере MySQL в течение пары минут.

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

Есть ли способ вывести этот запрос в файл и запускать его примерно каждую секунду?

Есть ли лучший способ захватить все выполняемые запросы?

Обратите внимание, что меня не интересуют только медленные запросы (я знаком с журналом медленных запросов).

Самый надежный способ - использовать «общий журнал запросов», который будет фиксировать все запросы: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Вы не указываете версию сервера MySQL, но если у вас 5.1.12 или новее, вы можете включить или отключить ее с помощью глобальной переменной через SQL; подробности см. в документации.

Я бы использовал журнал медленных запросов. Он захватывает все запросы, а не только медленные, если вы установите long_query_time = 0.

Он также захватывает ВСЕ запросы, что не соответствует упомянутым здесь методам прослушивания TCP; они не будут захватывать запросы, выполняемые через сокет. То же самое для просмотра SHOW PROCESSLIST; вы пропустите быстро выполняющиеся запросы.

Если вы хотите захватывать запросы через список процессов или через TCP-трафик, я бы предложил использовать pt-query-digest Percona Toolkit. Он может опрашивать список процессов для вас (и анализировать результаты, что очень сложно сделать, если вы сами собираете кучу его образцов), и он может интерпретировать протокол TCP MySQL, так что вы можете получить немного TCP трафик и анализируйте его. Конечно, это также лучший агрегатор / профилировщик / репортер запросов из когда-либо созданных, но вы не сказали, что вы хотите делать с запросами после их захвата.

Попробуйте эту команду как 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/

Конечно:

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

Ура

Это может быть место для Прокси MySQL. Это в основном позволяет вам захватывать (и управлять) отправляемыми запросами. Базовая настройка для перехвата довольно проста. Затем просто измените конфигурацию клиента, чтобы он указывал на прокси, чтобы вы могли захватывать все запросы.

Терминальная программа Wireshark цирк может помочь:

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

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

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

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.=" $_";
  }
}'

Захватите сеансы mysql tcp с помощью tcpdump, как запросы, так и ответы. Вы можете проанализировать дамп, например, с помощью инструментов maatkit:

http://www.maatkit.org/doc/mk-tcp-model.html

http://www.maatkit.org/doc/mk-query-digest.html

Я искал и искал, и наконец я приземлился в MONyog для мониторинга всех запросов в реальном времени, которые выполняются на сервере mysql. Единственное, что следует отметить, - это включить таблицы «Performance_schema» и «statement_digest», а Performance_schema доступна с MySQL 5.6.14 и выше.