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
Подготовительная часть пройдена, перейдем к делу.
Вариант 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 сервера на который будем проскить запрос.
Запустив вэб-сервер и выполнив какие либо запросы к базе можете увидеть такое:
Запросы отображаются, хорошо.
Вариант 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»)
Помимо отображения самих запросов, нам может понадобиться вывод результатов этих запросов.
Вариант 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
В результате получаем полное логирование запросов и ответов в читаемом виде