Изучаем запросы от скрипта или приложения к БД Mysql
Изучаем запросы от скрипта или приложения к БД Mysql¶
Иногда возникают ситуации, когда нам необходимо в режиме реального времени отследить полный текст запросов от скриптов сайта, или приложения, к базе данных MySQL. К примеру, такое иногда требуется, когда в strace мы видим, при приложение долго залипает на каких-то запросах к БД Mysql. При этом копировать запрос из выхлопа strace и облагораживать его, убирая экранированные символы, для того, чтобы выполнить запрос в консоли Mysql вручную нам не охота.
В таком случае нам на выручку спешит утилита mysql-proxy. Сама по себе она предназначена для проксирование запросов к БД Mysql, но с небольшим дополнением в виде lua-скрипта данное приложение может логировать проблемные, или все, запросы, что проходят через прокси.
Ставим mysql-proxy¶
yum install mysql-proxy
Скачиваем скрипт для логирования запросов¶
Хорошие скрипты можно найти тут:
- https://github.com/patrickallaert/MySQL-Proxy-scripts-for-devs
- http://ronaldbradford.com/mysql-dba/mysql-proxy/log.lua
Есть и другие, но для наших целей нам хватит этих. Скачиваем нужный нам скрипт, сохраняем куда-то.
Запускаем 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.