Как я могу просмотреть живые запросы MySQL?

Как я могу отслеживать запросы MySQL на моем сервере Linux, когда они происходят?

Например, я хотел бы настроить своего рода слушателя, затем запросить веб-страницу и просмотреть все запросы, выполненные движком, или просто просмотреть все запросы, выполняемые на рабочем сервере. Как я могу это сделать?

14 ответов

Решение

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

Вероятно, лучший способ получить историю, не изменяя каждое приложение, использующее сервер, - это использовать триггеры. Вы можете настроить триггеры так, чтобы каждый выполняемый запрос приводил к тому, что запрос вставлялся в некую таблицу истории, а затем создавал отдельную страницу для доступа к этой информации.

Имейте в виду, что это, вероятно, значительно замедлит все на сервере, с добавлением дополнительного INSERT в верхней части каждого запроса.


Редактировать: другой альтернативой является общий журнал запросов, но его запись в плоский файл исключит множество возможностей для гибкости отображения, особенно в режиме реального времени. Если вам нужен простой, простой в реализации способ увидеть, что происходит, включите GQL и затем запустите tail -f на лог-файл будет добиваться цели.

Вы можете легко записать каждый запрос в файл журнала:

mysql> SHOW VARIABLES LIKE "general_log%";

+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+

mysql> SET GLOBAL general_log = 'ON';

Делайте ваши запросы (на любой БД). Grep или иным образом изучить /var/run/mysqld/mysqld.log

Тогда не забудьте

mysql> SET GLOBAL general_log = 'OFF';

или производительность упадет, и ваш диск заполнится!

Хотя ответ уже принят, я хотел бы представить, что может быть даже самым простым вариантом:

$ mysqladmin -u bob -p -i 1 processlist

Это будет печатать текущие запросы на вашем экране каждую секунду.

  • -u Пользователь MySQL, вы хотите выполнить команду как
  • -p Запрашивать пароль (чтобы вам не приходилось сохранять его в файл или чтобы команда отображалась в истории команд)
  • i Интервал в секундах.
  • Использовать --verbose флаг, чтобы показать полный список процессов, отображая весь запрос для каждого процесса. (Спасибо, nmat)

Возможный недостаток: быстрые запросы могут не отображаться, если они выполняются между заданным вами интервалом. IE: мой интервал установлен в одну секунду, и если есть запрос, который принимает .02 секунд до запуска и запускается между интервалами, вы не увидите его.

Используйте эту опцию предпочтительно, когда вы хотите быстро проверить выполнение запросов без необходимости настройки прослушивателя или чего-либо еще.

Запустите этот удобный запрос SQL, чтобы увидеть запущенные запросы MySQL. Он может быть запущен из любой среды, которая вам нравится, когда угодно, без каких-либо изменений кода или накладных расходов. Это может потребовать некоторой конфигурации разрешений MySQL, но для меня это просто работает без какой-либо специальной настройки.

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep';

Единственный улов заключается в том, что вы часто пропускаете запросы, которые выполняются очень быстро, поэтому это наиболее полезно для более длительных запросов или когда на сервере MySQL есть запросы, для которых выполняется резервное копирование - по моему опыту, это именно то время, когда я хочу просмотреть " живые "запросы.

Вы также можете добавить условия, чтобы сделать его более конкретным только для любого SQL-запроса.

Например, показывает все запросы, запущенные в течение 5 секунд или более:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;

Например, Показать все запущенные ОБНОВЛЕНИЯ:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';

Для получения полной информации см.: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html

strace

Самый быстрый способ увидеть живые запросы MySQL/MariaDB - использовать отладчик. В Linux вы можете использовать strace, например:

sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1

Так как есть много экранированных символов, вы можете отформатировать вывод strace с помощью конвейера (просто добавьте | между этими двумя однострочниками) выше в следующую команду:

grep --line-buffered -o '".\+[^"]"' | grep --line-buffered -o '[^"]*[^"]' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"

Таким образом, вы должны видеть довольно чистые запросы SQL без времени, не касаясь файлов конфигурации.

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

dtrace

Используйте зонды MySQL для просмотра запросов MySQL в реальном времени, не касаясь сервера. Пример скрипта:

#!/usr/sbin/dtrace -q
pid$target::*mysql_parse*:entry /* This probe is fired when the execution enters mysql_parse */
{
     printf("Query: %s\n", copyinstr(arg1));
}

Сохранить приведенный выше скрипт в файл (например, watch.d) и запустите:

pfexec dtrace -s watch.d -p $(pgrep -x mysqld)

Узнайте больше: Начало работы с DTracing MySQL

Гиббс MySQL Spyglass

Смотрите этот ответ.

бревна

Вот шаги, полезные для разработки предложений.

Добавьте эти строки в свой ~/.my.cnf или глобальный my.cnf:

[mysqld]
general_log=1
general_log_file=/tmp/mysqld.log

Дорожки: /var/log/mysqld.log или же /usr/local/var/log/mysqld.log может также работать в зависимости от ваших прав доступа к файлам.

затем перезапустите MySQL/MariaDB (префикс с sudo если необходимо):

killall -HUP mysqld

Затем проверьте ваши журналы:

tail -f /tmp/mysqld.log

После окончания поменяй general_log в 0 (чтобы вы могли использовать его в будущем), затем удалите файл и перезапустите сервер SQL снова: killall -HUP mysqld,

Я нахожусь в особой ситуации, когда у меня нет разрешений на включение входа в систему, и у меня не будет разрешений на просмотр журналов, если они были включены. Я не мог добавить триггер, но у меня были разрешения на вызов show processlist. Итак, я приложил все усилия и придумал это:

Создайте bash-скрипт с именем "showsqlprocesslist":

#!/bin/bash

while [ 1 -le 1 ]
do
         mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL";
done

Выполните скрипт:

./showsqlprocesslist > showsqlprocesslist.out &

Хвост вывод:

tail -f showsqlprocesslist.out

Бинго Банго. Несмотря на то, что он не ограничен, он занимал только 2-4% процессорного времени на коробках, на которых я его запускал. Я надеюсь, что это может кому-то помочь.

Из командной строки вы можете запустить:

watch --interval=[your-interval-in-seconds] "mysqladmin -u root -p[your-root-pw] processlist | grep [your-db-name]"

Замените значения [x] вашими значениями.

Или даже лучше:

 mysqladmin -u root -p -i 1 processlist;

Это самая простая установка на машине с Linux Ubuntu, с которой я когда-либо сталкивался. Сумасшедший, чтобы увидеть все запросы в прямом эфире.

Найдите и откройте свой конфигурационный файл MySQL, обычно в Ubuntu /etc/mysql/my.cnf. Найдите раздел "Ведение журнала и репликация".

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.

log = /var/log/mysql/mysql.log

Просто раскомментируйте переменную "log", чтобы включить ведение журнала. Перезапустите MySQL с помощью этой команды:

sudo /etc/init.d/mysql restart

Теперь мы готовы начать мониторинг запросов по мере их поступления. Откройте новый терминал и выполните эту команду, чтобы прокрутить файл журнала, скорректировав путь, если необходимо.

tail -f /var/log/mysql/mysql.log

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

ОТ http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/

Проверьте Mtop.

Я пытался сделать то же самое и собрал воедино решение из разных постов, а также создал небольшое консольное приложение для вывода текста запроса в реальном времени, когда он записывается в файл журнала. Это было важно в моем случае, так как я использую Entity Framework с MySQL, и мне нужно иметь возможность проверять сгенерированный SQL.

Шаги для создания файла журнала (некоторое дублирование других постов, все здесь для простоты):

  1. Отредактируйте файл, расположенный по адресу:

    C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini
    

    Добавьте "log=development.log" в конец файла. (Примечание: сохранение этого файла потребовало от меня запуска моего текстового редактора в качестве администратора).

  2. Используйте MySql Workbench, чтобы открыть командную строку, введите пароль.

    Запустите следующее, чтобы включить общее ведение журнала, в котором будут записываться все выполненные запросы:

    SET GLOBAL general_log = 'ON';
    
    To turn off:
    
    SET GLOBAL general_log = 'OFF';
    

    Это приведет к тому, что запущенные запросы будут записаны в текстовый файл в следующем месте.

    C:\ProgramData\MySQL\MySQL Server 5.5\data\development.log
    
  3. Создайте / Запустите консольное приложение, которое будет выводить информацию журнала в реальном времени:

    Источник доступен для скачивания здесь

    Источник:

    using System;
    using System.Configuration;
    using System.IO;
    using System.Threading;
    
    namespace LiveLogs.ConsoleApp
    {
      class Program
      {
        static void Main(string[] args)
        {
            // Console sizing can cause exceptions if you are using a 
            // small monitor. Change as required.
    
            Console.SetWindowSize(152, 58);
            Console.BufferHeight = 1500;
    
            string filePath = ConfigurationManager.AppSettings["MonitoredTextFilePath"];
    
            Console.Title = string.Format("Live Logs {0}", filePath);
    
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    
            // Move to the end of the stream so we do not read in existing
            // log text, only watch for new text.
    
            fileStream.Position = fileStream.Length;
    
            StreamReader streamReader;
    
            // Commented lines are for duplicating the log output as it's written to 
            // allow verification via a diff that the contents are the same and all 
            // is being output.
    
            // var fsWrite = new FileStream(@"C:\DuplicateFile.txt", FileMode.Create);
            // var sw = new StreamWriter(fsWrite);
    
            int rowNum = 0;
    
            while (true)
            {
                streamReader = new StreamReader(fileStream);
    
                string line;
                string rowStr;
    
                while (streamReader.Peek() != -1)
                {
                    rowNum++;
    
                    line = streamReader.ReadLine();
                    rowStr = rowNum.ToString();
    
                    string output = String.Format("{0} {1}:\t{2}", rowStr.PadLeft(6, '0'), DateTime.Now.ToLongTimeString(), line);
    
                    Console.WriteLine(output);
    
                    // sw.WriteLine(output);
                }
    
                // sw.Flush();
    
                Thread.Sleep(500);
            }
        }
      }
    }
    

Спустя почти 10 лет после того, как вы задали свой вопрос, в мире мониторинга БД многое изменилось. В настоящее время доступно несколько хороших инструментов, предназначенных исключительно для мониторинга РСУБД. Я лично пользуюсь и рекомендую Navicat Monitor.

Он включает в себя Query Analyzer, который отслеживает ваши запросы в режиме реального времени и показывает сводную информацию обо всех выполняющихся запросах. Информация включает в себя самые популярные запросы с накопленным счетчиком времени выполнения, медленные запросы и взаимоблокировки. Вот скриншот:

Navicat Query Analyzer

Новейшая версия - 1.7 - включает в себя режим компактной панели. Он может показать сводную информацию буквально для сотен экземпляров на одном экране!

Компактная панель приборов

Гиббс MySQL Spyglass

AgilData недавно выпустила Gibbs MySQL Scalability Advisor (бесплатный инструмент самообслуживания), который позволяет пользователям захватывать живой поток запросов для загрузки в Gibbs. Spyglass (который является открытым исходным кодом) будет наблюдать за взаимодействием между вашими MySQL Server и клиентскими приложениями. Никакой реконфигурации или перезапуска сервера базы данных MySQL не требуется (клиент или приложение).

GitHub: https://github.com/AgilData/gibbs-mysql-spyglass/

Узнайте больше: захват пакетов MySQL с помощью Rust

Установить команду:

curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash

В дополнение к предыдущим ответам, описывающим, как включить общее ведение журнала, мне пришлось изменить одну дополнительную переменную в моей стандартной установке MySql 5.6, прежде чем в журнал был записан какой-либо SQL:

SET GLOBAL log_output = 'FILE';

Значением по умолчанию было "НЕТ".

Если вы хотите иметь мониторинг и статистику, тогда есть хороший инструмент с открытым исходным кодом Percona Monitoring and Management.

Но это серверная система, и запускать ее не так уж и просто.

Он также имеет живую демонстрационную систему для тестирования.

Другие вопросы по тегам