English Version

Глава 5. Альтернативные способы поиска проблемного запроса.

Я уже писала, что использование general query log ресурсоёмко. Часть проблемы снимается, если использовать новую возможность MySQL версии 5.1: online logging, которое позволяет включать и выключать general query log без остановки сервера.

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

Что делать, если вы не можете использовать general query log?

Один из вариантов - использовать журналирование средствами вашего приложения. Добавьте код, который будет писать запросы, которые посылает ваше приложение, в log file.

Этот подход имеет то преимущество, что вы сможете тонко настроить вывод: что и как писать. Будет хорошо, если вы будете записывать возвращаемое значение и сообщения об ошибках в тот же лог.

Приём №9: настройте ваше приложение таким образом, что оно будет записывать логи запросов самостоятельно.

Ещё один вариант - использовать прокси, который будет перехватывать запросы и записывать их в файл.

Один из предпочтительных вариантов – это MySQL Proxy, поскольку это скриптуемый прокси, предназначенный для работы с сервером MySQL. Он использует MySQL клиент-сервер протокол. Писать скрипты для MySQL Proxy можно на языке програмирования Lua.

Ниже приведён пример реализации general query log при помощи MySQL Proxy:

function read_query( packet )
        if packet:byte() == proxy.COM_QUERY then
                print(os.date("%d%m%g %T") .. "\t"
                .. proxy.connection.server.thread_id
                .."\tQuery\t" .. packet:sub(2))
        end
end

Приведённый скрипт записывает в стандартный вывод все полученные запросы.

Запустить его можно так:

$mysql-proxy --proxy-lua-script=`pwd`/general_log.lua

Вывод будет таким:

$mysql-proxy --proxy-lua-script=`pwd`/general_log.lua 
011109 15:00:24 12      Query   select @@version_comment limit 1
011109 15:00:27 12      Query   SELECT DATABASE()
011109 15:00:27 12      Query   show databases
011109 15:00:27 12      Query   show tables
011109 15:00:30 12      Query   select * from t1

Разумеется, так как MySQL Proxy использует полноценный язык программирования Lua, вы сможете настроить вывод таким образом, чтобы получить необходимую информацию об именно тех запросах которые вам интересны. Например, вы можете записать в таком "General Query Log" информацию о коде возврата и ошибках.

Больше информации здесь: http://dev.mysql.com/doc/refman/5.1/en/mysql-proxy.html и http://forge.mysql.com/wiki/MySQL_Proxy

Примеры скриптов можно найти здесь: http://forge.mysql.com/search.php?k=proxy

Приём №10: используйте MySQL Proxy или любой другой прокси.

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

Назад Содержание Вперёд



Автор 2009 Света Смирнова
COPYRIGHT © 2009 С.Смирнова и С.Ласунов
sveta_гав_js-client_точка_com