Skip to content

Изучаем запросы от скрипта или приложения к БД Mysql

Изучаем запросы от скрипта или приложения к БД Mysql

Иногда возникают ситуации, когда нам необходимо в режиме реального времени отследить полный текст запросов от скриптов сайта, или приложения, к базе данных MySQL. К примеру, такое иногда требуется, когда в strace мы видим, при приложение долго залипает на каких-то запросах к БД Mysql. При этом копировать запрос из выхлопа strace и облагораживать его, убирая экранированные символы, для того, чтобы выполнить запрос в консоли Mysql вручную нам не охота.

В таком случае нам на выручку спешит утилита mysql-proxy. Сама по себе она предназначена для проксирование запросов к БД Mysql, но с небольшим дополнением в виде lua-скрипта данное приложение может логировать проблемные, или все, запросы, что проходят через прокси.

Ставим mysql-proxy

yum install mysql-proxy

Скачиваем скрипт для логирования запросов

Хорошие скрипты можно найти тут:

Есть и другие, но для наших целей нам хватит этих. Скачиваем нужный нам скрипт, сохраняем куда-то.

Запускаем mysql-proxy с скриптом логирования запросов

К примеру, путь к скрипту, что будет осуществлять логирование, имеет вид /path/to/our/script.lua

В таком случае запуск mysql-proxy будет выглядеть так

 mysql-proxy --proxy-lua-script=/path/to/our/script.lua
 ```

Конкретно данная команда запускает mysql-proxy на localhost:4040(дефолтный порт, если не указать другой).
При этом взаимодействует mysql-proxy по умолчанию с mysql, запущенным на localhost:3306(дефолтный порт mysql).

Если у вас mysql запущен на другом порту, или mysql-proxy нужно запустить на другом порту(к примеру, у вас уже запущен другой процесс mysql-proxy на 4040), запускаем c дополнительными параметрами

```bash
mysql-proxy proxy-backend-addresses=127.0.0.1:3307 log-level=debug proxy-address=127.0.0.1:3306 proxy-lua-script=/path/to/our/script.lua plugins=proxy
где

  • proxy-backend-addresses=127.0.0.1:3307 – указываем mysql-proxy, что запросы он должен проксировать к базе данных Mysql, запущенной на не стандартном порту 127.0.0.1:3307
  • proxy-address=127.0.0.1:3306 – указываем mysql-proxy, что слушать он будет 127.0.0.1:3306 (стандартный порт 3306)

Такой вариант хорош, когда у вас нет возможность поменять порт подключения скрипта/приложения к Mysql. Вы просто изменяете на время в my.cnf номер порта, что слушает ваша база данных Mysql, к примеру

port = 3307

и перезапускаете Mysql. А mysql-proxy запускает на порту 3306, на который стучится исследуемое приложение. Когда нужные запросы будут сохранены в логи, необходимо будет просто остановить mysql-proxy, и вернуть оригинальный порт Mysql, удалив данную директиву(или закомментировав её) из my.cnf и ещё раз перезапустив Mysql.