MySQL Proxy для анализа запросов

Mysql-proxy работает как под Windows, так и под Unix системами. Если вам нужно отследить запросы к базе данных, то прокси отлично подойдет, хотя его возможности намного шире. 

Скачать можно тут: dev.mysql.com/downloads/mysql-proxy/

После скачивания архива его нужно распаковать в удобную для вас директорию, возьмем для примера C:\mysql-proxy
Для запуска приложения нужно определиться с параметрами.

В данном контексте многое зависит от того, что у вас установлено. В качестве LAMP я использую Winginx, прочитать об этой связке можно тут: winginx.ru/
По умолчанию MySQL работает на 3306 порту, его мы трогать не будем.
Нам нужно изменить порт для подключения php к базе. Для этого необходимо поправить php.ini
Найдем строку «mysql.default_port» и установим порт (по умолчанию 4040). Для более универсальной работы измените и «mysqli.default_port» на 4040

image

Подготовительная часть пройдена, перейдем к делу.

Вариант 1. Мониторинг запросов.

Для простого мониторинга необходимо использовать Lua скрипт. Как я уже говорил Lua идет в комплекте, так что ничего нового устанавливать не надо.
Создадим простой скрипт view.lua в директории C:\mysql-proxy\ с содержимым:

function read_query(packet)
   if string.byte(packet) == proxy.COM_QUERY then
    print(string.sub(packet, 2))
   end
end

Теперь можно проверить, результат.
Для удобства создадим в директории C:\mysql-proxy файл view.bat c содержимым:

C:\mysql-proxy\bin\mysql-proxy.exe --proxy-lua-script=C:\mysql-proxy\view.lua --log-file="C:\mysql-proxy\mysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306

—proxy-backend-addresses — адрес MySQL сервера на который будем проскить запрос.

Запустив вэб-сервер и выполнив какие либо запросы к базе можете увидеть такое:
image

Запросы отображаются, хорошо.

Вариант 2. Мониторинг запросов и запись в файл.

Для записи запросов в файл будем использовать штатные возможности Lua.
Создадим файл view-write.lua в директории C:\mysql-proxy\ с содержимым:

function read_query(packet)
   if string.byte(packet) == proxy.COM_QUERY then
    local file = io.open("C:\\mysql-proxy\\sql-log.txt", "a")
    file:write(string.sub(packet, 2) .. "\n")
    file:close()
    print(string.sub(packet, 2))
   end
end

и bat файл — «view-write.bat»

C:\mysql-proxy\bin\mysql-proxy.exe --proxy-lua-script="C:\mysql-proxy\view-write.lua" --log-file="C:\mysql-proxy\mysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306

Результат после выполнения запросов (по адресу «C:\mysql-proxy\sql-log.txt»)
image

Помимо отображения самих запросов, нам может понадобиться вывод результатов этих запросов.

Вариант 3. Запросы и результат

По той-же схеме создаём скрипт «view-result.lua»:

function read_query( packet )
        if packet:byte() == proxy.COM_QUERY then
                print("Query: " .. string.sub(packet, 2))
                local file = io.open("C:\\mysql-proxy\\sql-log.txt", "a")
                file:write("Query: " .. string.sub(packet, 2) .. "\n")
                file:close()
                proxy.queries:append(2, string.char(proxy.COM_QUERY) .. string.sub(packet, 2), {resultset_is_needed = true} )
                proxy.queries:append(1, packet, {resultset_is_needed = true})
                return proxy.PROXY_SEND_QUERY
        end
end
function read_query_result(inj)
        if inj.id == 1 then
                for row in inj.resultset.rows do
                        local i = 1
                        local fields = {}
                        while row[i] do
                            if row[i] == row then break end
                            local file = io.open("C:\\mysql-proxy\\sql-log.txt", "a")
                            file:write("Response field: " .. inj.resultset.fields[i].name .. " => " .. row[i] .. "\n")
                            file:close()
                            print("Response field: " .. inj.resultset.fields[i].name .. " => " .. row[i])
                            i = i + 1
                        end
                end
                return proxy.PROXY_IGNORE_RESULT
        end
end

И view-result.bat

C:\mysql-proxy\bin\mysql-proxy.exe --proxy-lua-script="C:\mysql-proxy\view-result.lua" --log-file="C:\mysql-proxy\mysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306

В результате получаем полное логирование запросов и ответов в читаемом виде
image

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *