2013-11-12 3 views
2

У нас есть медленный убийца запросов MySQL, который убивает идентификаторы процессов после определенного количества секунд, и это работает нормально. Однако мы хотели бы, чтобы в наших уведомлениях также был показан полный запрос, который был настолько медленным.Лучший способ получить полный запрос mysql для конкретного идентификатора процесса?

Проблема заключается в том, что в то время как mysqladmin -v processlist|grep process_id должен работать, он обрезает запросы, которые имеют в них новые строки т.д .:

SELECT * FROM table WHERE x=y { 
    ... stuff 
}; 

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

Выполнение запроса в information_schema, по-моему, решило бы это, но команда не хочет этого делать из-за запросов на производительность, связанных с этой базой данных связаны. Так есть ли лучший способ приблизиться к этому, тогда grepping mysqladmin?

+0

Вы используете скрипт bash для этого? –

+0

Привет, как это получилось? –

ответ

1

Я бы посоветовал активировать медленный журнал. Он отображает утверждение, которое занимает много времени, сколько времени и с дополнительными деталями. Если это не в STORED PROCEDURE.

Сначала вам нужно активировать медленный журнал, если он не был уже установлен.

Чтобы включить медленный журнал запросов, запустите mysqld с помощью опции --log-slow-queries[=file_name] или измените значения в вашем файле конфигурации и перезапустите службу, см. Ниже.

Если медленный файл журнала запроса включен, но не указано имя, имя по умолчанию host_name-slow.log и сервер создает файл в тот же каталог, где он создает файл PID. Если задано имя, сервер создает файл в каталоге данных, если не указывается абсолютное имя пути , чтобы указать другой каталог.

Вы можете установить выход (где данные могут быть считаны) в FILE или TABLE

Изменить my.ini файл и изменить/добавить их

log-output = TABLE 
slow-query-log=1 
long_query_time = 10 
log-queries-not-using-indexes 

Это будет регистрировать любой запрос это занимает более 10 секунд. Плюс любой запрос, который не использует индекс.

Если вы идете с log-output=table, то вы можете просто выполнить

select * from mysql.slow_log 

Если вы идете с log-output=file, то вы должны открыть физический файл в папке MySql.

+0

Неплохая идея, могу ли я запросить запрос id процесса из mysql.slow_log? Похоже, я могу, но не уверен, какие строки относятся к тому, что мне нужно ... это правильно? sql_text = запрос процесса, insert_id = идентификатор процесса (что такое server_id?)? Спасибо – user578086

+0

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

+0

Server_id. Я считаю, что это имеет значение только в том случае, если у вас есть несколько настроек сервера или ведомой репликации. –

Смежные вопросы