MySQL On air. Мониторим SQL запросы

от автора

Разбираясь как работает та или иная CMS приходится использовать различные инструменты, облегчающие работу.
Наиболее интересная тема — это работа с баз(ой|ами) данных. Естественно для изучения запросов и результатов запросов нужно использовать что-то универсальное. Что-то, что будет работать стабильно как с известным движком, так и с самописной системой.
Предположим у вас оказалась система управления контентом и вам необходимо посмотреть как реализовано добавление новых пользователей или смена паролей.

Большинство инструментов, позволяющих мониторить работу с БД являются платными [раз, два]. Я хотел что-то более легкое и удобное, поэтому выбрал mysql-proxy. Хотя возможности утилиты гораздо шире чем мне требуется, я опишу лишь основное. Работает как под Windows, так и под Unix системами.

Скачать можно тут: dev.mysql.com/downloads/mysql-proxy/
Первым делом нужно определиться с выбором дистрибутива. На данный момент новейшей версией является «MySQL Proxy 0.8.3 alpha», в качестве ОС у меня стоит Windows 7, поэтому все тесты будут на ней.

После нажатия на кнопку «Download» вас попросят авторизироваться либо зарегистрировать, но снизу есть ссылка для скачивания без лишних действий. (В репозиториях Ubuntu и Debian есть готовые пакеты, так что: sudo apt-get install mysql-proxy)
image

Хочу заметить, что при размере в 7.9Мб в дистрибутив входит Lua с поддержкой основых модулей.

После скачивания архива его нужно распаковать в удобную для вас директорию, возьмем для примера 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

ссылка на оригинал статьи http://habrahabr.ru/post/177057/


Комментарии

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

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