データベース

DBeaverで実行したSQLを確認する方法|MySQL general logとの違いも解説

DBeaverで実行したSQLをQuery Managerで確認する方法と、MySQLのgeneral query logを有効にしてターミナル監視する方法を解説します。ログ保存先、FILE・TABLE出力、権限エラー、Docker、停止方法、slow query logとの違いまで整理します。

この記事の目次
  1. DBeaverのQuery Managerで実行履歴を確認する
  2. Query Managerのログをファイルへ保存する
  3. MySQLのgeneral query logとは
  4. general logの現在設定を確認する
  5. general logをファイルへ出力する
  6. 設定に必要な権限
  7. ターミナルでログをリアルタイム監視する
  8. macOS・Linux
  9. Windows PowerShell
  10. Docker Compose
  11. DBeaverでテストSQLを実行して確認する
  12. general logをTABLEへ出力してSQLで確認する
  13. 確認後にgeneral logを停止する
  14. general log・slow query log・error logの違い
  15. general query log
  16. slow query log
  17. error log
  18. ログが出ないときの確認項目
  19. general_logがOFF
  20. log_outputがNONEまたはTABLE
  21. 監視しているパスが違う
  22. MySQLがファイルへ書き込めない
  23. 別のMySQLサーバーへ接続している
  24. 本番環境での注意点
  25. よくある質問
  26. DBeaverの履歴を見るだけでもgeneral_logが必要ですか?
  27. general logをONにしたのにファイルへ出ません
  28. MySQLを再起動すると設定は戻りますか?
  29. 実行したSQLがすべて記録されますか?
  30. まとめ

DBeaverで自分が実行したSQLだけを確認したいなら、最初にDBeaverのQuery Managerを使います。

PHPや別のアプリケーションを含め、MySQLサーバーが受信したSQLを確認したい場合は、MySQLのgeneral query logを短時間だけ有効にします。

確認したいこと 使う機能
DBeaverで実行したSQL・時間・エラー DBeaver Query Manager
MySQLが全クライアントから受信したSQL MySQL general query log
実行に時間がかかるSQL MySQL slow query log
MySQLの起動・停止・サーバー障害 MySQL error log

general logは調査に便利ですが、すべての接続とSQLを大量に記録するため、本番で常時有効にする機能ではありません。必要な時間だけONにし、確認後は必ずOFFへ戻します。

DBeaverのQuery Managerで実行履歴を確認する

DBeaverのQuery Managerは、DBeaverから実行されたSQLと実行時間、処理時間、影響行数、エラーなどを確認する画面です。

メニューから次の順に開きます。

  1. Windowを開く
  2. Show Viewを選ぶ
  3. Query Managerを選ぶ

Transaction Logボタン横のメニューからQuery Managerを開ける構成もあります。

Query Managerでは、ユーザーが実行したクエリ、スクリプト、DBeaver内部のメタデータ取得、トランザクションなどを表示・非表示にできます。SQLが多い場合は、接続、期間、カタログ、スキーマなどで絞り込みます。

Query Managerのログをファイルへ保存する

Query Managerの設定から、次の項目を確認します。

  • Save log to file(s):ファイル保存を有効にする
  • Log files folder:保存先フォルダ
  • Days to store log:保持日数
  • Max number of records to show:画面に表示する最大件数

設定変更はDBeaver再起動後に反映される項目があります。また、履歴の永続化や詳細フィルターはDBeaverのエディションによって違いがあります。

自分がDBeaverで実行したSQLを調べるだけなら、MySQLサーバー側のgeneral logを有効にする必要はありません。

MySQLのgeneral query logとは

general query logは、MySQLサーバーへのクライアント接続・切断と、サーバーが受信したSQL文を記録します。

DBeaverだけでなく、次のような接続元も対象です。

  • PHP、WordPress、LaravelなどのWebアプリケーション
  • MySQLコマンドラインクライアント
  • DBeaver、MySQL WorkbenchなどのGUI
  • バッチ処理やテスト

「PHPからどのSQLが送られたか」「意図しないSQLが繰り返されていないか」をサーバー側で確認したいときに役立ちます。

受信順に記録されるため、実際の完了順とは異なる場合があります。また、構文解析できないSQLやパスワードを含む可能性がある操作には、ログ上の制約とセキュリティ上の注意があります。

general logの現在設定を確認する

DBeaverのSQL EditorまたはMySQLクライアントで、最初に現在値を確認します。

SHOW VARIABLES
WHERE Variable_name IN (
  'general_log',
  'general_log_file',
  'log_output',
  'datadir'
);

または個別に確認できます。

SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'general_log_file';
SHOW VARIABLES LIKE 'log_output';
SHOW VARIABLES LIKE 'datadir';
変数 意味
general_log general logがONかOFFか
general_log_file FILE出力時のログファイル
log_output FILE、TABLE、両方、またはNONE
datadir MySQLのデータディレクトリ

MySQLのシステム変数自体については、MySQLシステム変数の確認・変更方法も参照してください。

general logをファイルへ出力する

general logを有効にする前に、出力先をFILEへ設定します。

SET GLOBAL log_output = 'FILE';

既定のgeneral_log_fileが利用できるなら、そのまま有効にします。

SET GLOBAL general_log = 'ON';

ログファイル名を変える場合は、general logがOFFの状態で指定してからONにします。

SET GLOBAL general_log = 'OFF';
SET GLOBAL general_log_file = '/var/lib/mysql/mysql-general.log';
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log = 'ON';

絶対パスを指定する場合、MySQLサーバープロセスがそのディレクトリへ書き込める必要があります。macOSのDBeaverから接続していても、MySQLがDockerやリモートLinuxで動いていれば、指定するのはMySQLサーバー側のパスです。

MAMPなどの環境はバージョンや構成でログパスが異なります。固定のサンプルパスをコピーせず、SHOW VARIABLESで実値を確認してください。

設定に必要な権限

global system variableの変更には、MySQLのバージョンと権限構成に応じてSYSTEM_VARIABLES_ADMINなどの管理権限が必要です。

権限がない場合は次のようなエラーになります。

ERROR 1227 (42000): Access denied; you need ... privilege(s)

共有サーバーやマネージドDBではgeneral logを利用者が変更できないことがあります。管理者が提供するログ、監視サービス、Performance Schemaなど、環境に用意された方法を使います。

ターミナルでログをリアルタイム監視する

macOS・Linux

tail -F /var/lib/mysql/mysql-general.log

最後の50行から確認する場合は次のようにします。

tail -n 50 -F /var/lib/mysql/mysql-general.log

終了するときはCtrl + Cを押します。ログファイルを読むユーザーにも権限が必要です。

Windows PowerShell

Get-Content "C:\path\to\mysql-general.log" -Wait -Tail 50

パスはSHOW VARIABLES LIKE 'general_log_file'の結果に合わせます。

Docker Compose

MySQLコンテナ内のファイルへ出力している場合は、サービス名を確認してコンテナ内でtailします。

docker compose exec db tail -n 50 -F /var/lib/mysql/mysql-general.log

dbはComposeのサービス名の例です。実際のサービス名とgeneral_log_fileへ置き換えてください。

DBeaverでテストSQLを実行して確認する

ログ監視を開始した状態で、DBeaverから識別しやすいSQLを実行します。

SELECT 'devsakaso-general-log-test' AS marker;

ログへSQLと接続情報が表示されれば、FILE出力は動作しています。

アプリケーションからのSQLを確認する場合は、対象画面を一度だけ操作します。アクセスが多い環境では大量のSQLが流れるため、接続ユーザー名、スキーマ、識別できる値などを手掛かりに絞り込みます。

general logをTABLEへ出力してSQLで確認する

ファイルへ直接アクセスできないローカル検証では、ログ出力先をTABLEへ設定する方法があります。

SET GLOBAL general_log = 'OFF';
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';

DBeaverからmysql.general_logを検索します。

SELECT
  event_time,
  user_host,
  thread_id,
  server_id,
  command_type,
  argument
FROM mysql.general_log
ORDER BY event_time DESC
LIMIT 100;

FILEとTABLEの両方へ出力する場合は、カンマ区切りで指定します。

SET GLOBAL log_output = 'FILE,TABLE';

TABLE出力もデータ量と負荷が増えます。確認後はOFFへ戻してください。

確認後にgeneral logを停止する

調査が終わったら、同じ接続でgeneral logを無効にします。

SET GLOBAL general_log = 'OFF';

停止を確認します。

SHOW VARIABLES LIKE 'general_log';

SET GLOBALによる変更は、通常はMySQLサーバー再起動後に初期設定へ戻ります。調査用途では、その一時性が安全です。

恒久設定はMySQL設定ファイルや永続化機能で行えますが、general logの常時ONはログ肥大化・性能・機密情報のリスクがあります。目的と保存・ローテーション設計がない状態で永続化しないでください。

general log・slow query log・error logの違い

general query log

クライアント接続と、MySQLが受信したSQLを広く記録します。「どのSQLが送られたか」の短時間調査向けです。

slow query log

long_query_timeを超えたSQLなど、遅いクエリの調査に使います。パフォーマンス改善が目的なら、全SQLを記録するgeneral logよりslow query logが適しています。

ロック待ちやデッドロックの基本は、MySQLのロックとデッドロックで解説しています。

error log

MySQLサーバーの起動・停止、警告、エラー、異常終了などの診断情報を記録します。SQL実行履歴を確認するログではありません。

ログが出ないときの確認項目

general_logがOFF

SHOW VARIABLES LIKE 'general_log';

値がOFFならログは記録されません。

log_outputがNONEまたはTABLE

FILEを監視しているのにlog_outputがTABLEなら、ファイルへSQLは追記されません。

SHOW VARIABLES LIKE 'log_output';

監視しているパスが違う

推測したMAMPやDockerのパスではなく、MySQLから返る値を確認します。

SHOW VARIABLES LIKE 'general_log_file';

MySQLがファイルへ書き込めない

存在しないディレクトリ、権限のない場所、セキュリティ設定で許可されない場所を指定すると失敗します。MySQLのerror logも確認してください。

別のMySQLサーバーへ接続している

DBeaverの接続先と、ターミナルで見ているMySQLが同じか確認します。Dockerのホスト側とコンテナ側、ローカルとリモート、開発と本番を取り違えないようにします。

本番環境での注意点

general logには、SQL本文、テーブル名、検索値、接続ユーザーなどが含まれます。アプリケーションによっては個人情報やトークン相当の値がSQLへ入る可能性もあります。

本番で使用する場合は、次を事前に決めます。

  • 有効にする開始・終了時刻
  • 対象サーバーと担当者
  • ログの保存先とアクセス権
  • ディスク使用量の監視
  • 停止確認とログ削除・保管方法

SQLの種類やテーブル操作を整理したい場合は、SQLステートメントの基礎も参照してください。

よくある質問

DBeaverの履歴を見るだけでもgeneral_logが必要ですか?

必要ありません。DBeaverから実行したSQLはQuery Managerで確認します。PHPや別クライアントがMySQLへ送ったSQLをサーバー側で確認したい場合にgeneral logを使います。

general logをONにしたのにファイルへ出ません

log_outputにFILEが含まれるか、general_log_fileの実値、MySQLサーバープロセスの書き込み権限を確認します。log_output=NONEでは、general logをONにしてもSQLは出力されません。

MySQLを再起動すると設定は戻りますか?

通常のSET GLOBALによる変更は再起動後に初期設定へ戻ります。短時間の調査ではこの方法を使い、終了後は再起動を待たず明示的にOFFへ戻してください。

実行したSQLがすべて記録されますか?

general logはMySQLが受信したSQLを広く記録しますが、パスワードを含む文の書き換えや、解析できない文の扱いなど例外があります。機密情報を得る目的でログ設定を弱めないでください。

まとめ

DBeaverで自分が実行したSQLはQuery Managerで確認できます。MySQLへ届いた全クライアントのSQLを調べる必要がある場合だけ、general query logを短時間有効にします。

ファイル出力ではgeneral_logだけでなく、log_output=FILEgeneral_log_file、サーバー側の書き込み権限を確認します。調査後はSET GLOBAL general_log = 'OFF'を実行し、停止状態まで確認してください。