2012-06-05 9 views
11

Gibt es eine Möglichkeit, die allgemeine Abfrage von MySQL über JDBC zu aktivieren? Die nächste Sache, die ich durch meine Suche gefunden habe, ist die Fähigkeit, langsame Abfragen über JDBC zu protokollieren (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Vielleicht sollte ich das tun und den langsamen Abfrage-Schwellenwert auf 0 ms setzen?Aktivieren des allgemeinen Abfrageprotokolls von MySQL mit JDBC

Ich möchte alle Abfragen über MySQL in einem für Menschen lesbaren Format protokollieren und möchte den Speicherort angeben, wo die Protokolldatei geschrieben werden soll. Ich weiß, dass ich einen Performance-Hit machen werde, aber meine Anwendung hat nur einen User und ist einfach genug, dass ich überrascht wäre, wenn der Performance-Hit auffällt. Ich möchte es trotzdem ausprobieren um es zu sehen.

Ich glaube, eine andere Option, die ich habe, binäre Logging einschalten und mysqlbinlog verwenden, um die Binärlogs in ein menschenlesbares Format zu konvertieren, aber es klingt wie das allgemeine Abfrageprotokoll würde ein einfacheres Mittel zu bekommen, was ich will.

Antwort

3

Ich fand einen Workaround. Ich aktiviere die allgemeine MySQL-Abfrageprotokollierung durch Java, indem ich die globalen MySQL-Systemvariablen zur Laufzeit mit den folgenden SQL-Abfragen modifiziere.

Ich empfehle die Verwendung von Schrägstrichen im Pfad general_log_file. Ich konnte keine umgekehrten Schrägstriche bekommen, selbst in einer Windows-Umgebung.

Ich deaktivieren allgemeine Abfrageprotokollierung zur Laufzeit mit der folgenden SQL-Abfrage.

SET GLOBAL general_log='OFF' 
3

Wenn Sie Hibernate verwenden und den gesamten Datenzugriff durchführen, können Sie die Protokollierung aktivieren, indem Sie die Eigenschaft hibernate.show_sql auf true setzen. Dies wird jedoch parametrisierte Anweisungen schreiben (z. B. SELECT foo.id FROM foo WHERE foo.bar = ?). Wenn Sie Parameterwerte benötigen oder kein Tool wie Hibernate verwenden, müssen Sie dieses Protokoll möglicherweise von MySQL schreiben lassen. Siehe die MySQL-Dokumentation auf der general query log.

FWIW, das MySQL Binärprotokoll ist ein Mittel zu einem anderen Ende; Sie zeichnet Änderungen an den Daten auf und wird für inkrementelle Sicherungen und/oder Replikationen verwendet. SELECT Anweisungen werden nicht im binären Protokoll aufgezeichnet.

EDIT: konnte ich MySQL bekommen das allgemeine Protokoll zu schreiben, indem die folgenden zwei Zeilen in my.cnf (wurde bereits eingestellt, nachdem keine der beiden Variablen bestätigt), und neu zu starten MySQL:


general_log = 1 
general_log_file=/tmp/mysql-general.log 
+0

Eric, ich habe nicht eine Seite der offiziellen Dokumentation gesehen von MySQL, das war immer verständlich, und ich benutze es seit 5 Jahren. Ich kann sehr genau darauf hinweisen, dass auf dieser Seite Unklarheiten bestehen. Können Sie eine Beispielabfrage zum Aktivieren des allgemeinen Abfrageprotokolls anzeigen? Ich weiß auch nicht, ob ich Winterschlaf mache. Wenn du mir sagen könntest, wie ich das überprüfen soll, könnte ich es dich wissen lassen. –

25

Sie können die Protokollierung in der JDBC-URL wie folgt aktivieren:

jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true 

Andere Protokollierung Backends zur Verfügung stehen (CommonsLogger, Slf4jLogger, JDK14Logger). Ich glaube, dass die direkte Log4J-Protokollierung aufgrund von Lizenzierungsproblemen zu einem späteren Zeitpunkt abgebrochen wurde, so dass es möglicherweise nicht mit Ihrer Version des JDBC-Treibers funktioniert.

Natürlich benötigen Sie die JAR der relevanten Protokollierungsbibliothek in Ihrem Klassenpfad und eine Konfigurationsdatei (log4j.properties). Ich würde die Root-Ebene zuerst auf TRACE setzen, um zu sehen, was passiert, und die Log Level und die Kategorie straffen, sobald man sieht, was protokolliert wird.

Weiterführende Literatur:

HTH

+0

Danke! Dies ist bei der Verwendung von Blackbox-/Closed-Source-Frameworks, die das Hinzufügen von Logging-Argumenten nicht problemlos unterstützen –

6

Add 'Logger' und 'profileSQL' zur jdbc url:

&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true 

Dann werden Sie die SQL-Anweisung unten erhalten:

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 

Der Standardlogger ist:

com.mysql.jdbc.log.StandardLogger 

Mysql jdbc Eigenschaftsliste: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Verwandte Themen