Как я могу просматривать живые запросы MySQL?
Как я могу отслеживать запросы MySQL на моем сервере Linux, как они происходят?
например, я хотел бы настроить какой-то слушатель, а затем запросить веб-страницу и просмотреть все запросы, выполняемые движком, или просто просмотреть все запросы, выполняемые на рабочем сервере. Как я могу это сделать?
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.
шаги по созданию файла журнала (некоторое дублирование других сообщений, все здесь для простоты):
изменить расположение файла в:
C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.iniдобавить " log=development.журнал" в нижней части файла. (Примечание сохранение этого файла потребовало от меня запуска моего текстового редактора в качестве администратора).
используйте 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создать / запустить консольное приложение, которое будет выводить информацию журнала в режиме реального времени:
источник доступен для скачивания здесь
источник:
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