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と実行時間、処理時間、影響行数、エラーなどを確認する画面です。
メニューから次の順に開きます。
- Windowを開く
- Show Viewを選ぶ
- 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=FILE、general_log_file、サーバー側の書き込み権限を確認します。調査後はSET GLOBAL general_log = 'OFF'を実行し、停止状態まで確認してください。