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



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



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

2937   11  

11 ответов:

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

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

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


Edit: другой альтернативой является Общий Журнал Запросов, но его запись в плоский файл удалит много возможностей для гибкости отображения, особенно в режиме реального времени. Если вы просто хотите простой, простой в реализации способ увидеть, что происходит, хотя, позволяя GQL, а затем с помощью running 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

Я нахожусь в особой ситуации, когда у меня нет разрешений на включение входа в систему и не было бы разрешений на просмотр журналов, если бы они были включены. Я не мог добавить триггер, но у меня были разрешения на вызов 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% CPU на коробках, на которых я его запускал. Надеюсь, это кому-то поможет.

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

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

#
# * 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/

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

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;

проверить mtop.

strace

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

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

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

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

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

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

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

Руст

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

GitHub: AgilData / gibbs-mysql-spyglass

подробнее: захват пакетов MySQL с помощью Rust

установить команды: curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash

журналы

вот шаги, полезные для развития предлагает.

добавить эти строки в свой ~/.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 by (префикс с sudo при необходимости):

killall -HUP mysqld

затем проверьте журналы:

tail -f /tmp/mysqld.log

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

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

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

  1. изменить расположение файла в:

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

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

  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);
            }
        }
      }
    }
    

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

SET GLOBAL log_output = 'FILE';

значение по умолчанию - "нет".

Comments

    Ничего не найдено.