Включение общего журнала запросов MySQL с помощью JDBC
Есть ли способ включить ведение общего запроса MySQL через JDBC? Самое близкое, что я нашел в моем поиске, - это возможность записывать медленные запросы через JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Может быть, я должен это сделать и установить порог медленного запроса на 0 мс?
Я хотел бы записать все запросы через MySQL в удобном для чтения формате и хотел бы указать место, где должен записываться файл журнала. Я знаю, что у меня получится удар производительности, но у моего приложения только один пользователь и достаточно прост, и я был бы удивлен, если бы удар производительности был заметным. В любом случае, я хотел бы попробовать.
Я считаю, что еще один вариант - включить двоичное ведение журнала и использовать mysqlbinlog для преобразования двоичных журналов в удобочитаемый формат, но похоже, что общий журнал запросов обеспечит более простой способ получить то, что я хочу.
Ответы
Ответ 1
В итоге я нашел обходное решение. Я разрешаю MySQL вести общий запрос через Java, изменяя глобальные системные переменные MySQL во время выполнения со следующими SQL-запросами.
SET GLOBAL log_output="FILE"
SET GLOBAL general_log_file="Path/File"
SET GLOBAL general_log='ON'
Я рекомендую использовать косые черты в пути general_log_file. Я не мог получить обратную косую черту для работы даже в среде Windows.
Я отключу обычное ведение журнала во время выполнения со следующим SQL-запросом.
SET GLOBAL general_log='OFF'
Ответ 2
Вы можете включить ведение журнала в URL-адрес JDBC следующим образом:
jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true
Доступны другие бэкэнды ведения журнала (CommonsLogger, Slf4jLogger, JDK14Logger). Я считаю, что прямое журналирование Log4J в какой-то момент было отключено из-за проблем с лицензированием, поэтому может не работать с вашей версией драйвера JDBC.
Естественно, вам понадобится JAR библиотеки журналов ведения журнала в вашем пути к классам и файл конфигурации (log4j.properties). Я сначала установил уровень корня TRACE, чтобы увидеть, что происходит и затягивает его по уровню и категории журнала, как только вы увидите, что регистрируется.
Дальнейшее чтение:
НТН
Ответ 3
Добавьте 'logger' и 'profileSQL' в URL-адрес jdbc:
&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true
Затем вы получите инструкцию SQL ниже:
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 message: SET sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 13 resultset: 17 message: select 1
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 13 resultset: 17
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 15 resultset: 18 message: select @@session.tx_read_only
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 15 resultset: 18
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 14 resultset: 0 message: update sequence set seq=seq+incr where name='demo' and seq=4602
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 14 resultset: 0
Регистратор по умолчанию:
com.mysql.jdbc.log.StandardLogger
Список свойств Mysql jdbc: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
Ответ 4
Если вы используете Hibernate и выполняете весь доступ к данным через него, вы можете включить ведение журнала, установив для свойства hibernate.show_sql
значение true. Это приведет к записи параметризованных утверждений (например, SELECT foo.id FROM foo WHERE foo.bar = ?
). Если вам нужны значения параметров или вы не используете такой инструмент, как Hibernate, вам может потребоваться, чтобы MySQL записывал этот журнал. См. Документацию по MySQL в общем журнале запросов.
FWIW, бинарный журнал MySQL является средством для другого конца; он записывает изменения в данные и используется для инкрементных резервных копий и/или репликации. Операторы SELECT
не записываются в двоичный журнал.
EDIT:
Я смог заставить MySQL написать общий журнал, добавив следующие строки в my.cnf(после того, как ни одна из них не была установлена) и перезагрузка MySQL:
general_log = 1
general_log_file=/tmp/mysql-general.log