Подтвердить что ты не робот

Включение общего журнала запросов MySQL с помощью JDBC

Есть ли способ включить ведение общего запроса MySQL через JDBC? Самое близкое, что я нашел в моем поиске, - это возможность записывать медленные запросы через JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Может быть, я должен это сделать и установить порог медленного запроса на 0 мс?

Я хотел бы записать все запросы через MySQL в удобном для чтения формате и хотел бы указать место, где должен записываться файл журнала. Я знаю, что у меня получится удар производительности, но у моего приложения только один пользователь и достаточно прост, и я был бы удивлен, если бы удар производительности был заметным. В любом случае, я хотел бы попробовать.

Я считаю, что еще один вариант - включить двоичное ведение журнала и использовать mysqlbinlog для преобразования двоичных журналов в удобочитаемый формат, но похоже, что общий журнал запросов обеспечит более простой способ получить то, что я хочу.

4b9b3361

Ответ 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