18

JDBC を介して MySQL の一般的なクエリ ログを有効にする方法はありますか? 検索で見つけた最も近いものは、JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html) を介してスロー クエリをログに記録する機能です。多分私はそれをして、遅いクエリのしきい値を0ミリ秒に設定する必要がありますか?

MySQL を介してすべてのクエリを人間が読める形式でログに記録し、ログ ファイルを書き込む場所を指定したいと考えています。パフォーマンスが低下することはわかっていますが、私のアプリケーションはユーザーが 1 人しかいないため、パフォーマンスへの影響が顕著になると驚くほど単純です。とにかく試して見てみたいと思います。

私が持っている別のオプションは、バイナリログを有効にし、mysqlbinlog を使用してバイナリログを人間が読める形式に変換することだと思いますが、一般的なクエリログは、私が望むものを取得するためのより簡単な手段を提供するように思えます.

4

6 に答える 6

33

次のように、JDBC URL でロギングを有効にできます。

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

他のロギング バックエンドが利用可能です (CommonsLogger、Slf4jLogger、JDK14Logger)。ライセンスの問題により、ある時点で直接 Log4J ロギングが削除されたため、お使いのバージョンの JDBC ドライバーでは機能しない可能性があると思います。

当然、関連するログ ライブラリの JAR がクラスパスにあり、構成ファイル (log4j.properties) が必要です。最初にルート レベルを TRACE に設定して何が起こっているかを確認し、何がログに記録されているかを確認したら、ログ レベルとカテゴリで締めます。

参考文献:

HTH

于 2012-10-23T07:30:54.683 に答える
14

jdbc url に「logger」と「profileSQL」を追加します。

&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

于 2016-01-14T02:19:08.400 に答える
3

Hibernate を使用していて、それを介してすべてのデータ アクセスを実行する場合は、プロパティhibernate.show_sqlを true に設定してログを有効にすることができます。ただし、これはパラメーター化されたステートメント (例: SELECT foo.id FROM foo WHERE foo.bar = ?) を書き込みます。パラメータ値が必要な場合、または Hibernate などのツールを使用しない場合は、MySQL にこのログを書き込む必要がある場合があります。一般的なクエリ ログに関する MySQL ドキュメントを参照してください。

FWIW、MySQL バイナリ ログは別の目的のための手段です。データへの変更を記録し、増分バックアップやレプリケーションに使用されます。 SELECTステートメントはバイナリ ログに記録されません。

編集: 次の 2 行を my.cnf に追加して (どちらの変数もまだ設定されていないことを確認した後)、MySQL を再起動することで、MySQL に一般的なログを書き込むことができました。


general_log = 1
general_log_file=/tmp/mysql-general.log
于 2012-06-05T19:07:58.213 に答える
3

私は最終的に回避策を見つけました。次の SQL クエリを使用して実行時に MySQL グローバル システム変数を変更することにより、Java を介して MySQL の一般的なクエリ ログを有効にします。

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'
于 2012-07-24T22:52:49.917 に答える