※この記事にはアフィリエイト広告(プロモーション)が含まれます。
この記事の出力は MySQL 8.4.11(Ubuntu 26.04)で採りました。
まず見る(結論)
mysql> SELECT @@log_error;
+--------------------------+
| @@log_error |
+--------------------------+
| /var/log/mysql/error.log |
+--------------------------+
sudo tail -50 /var/log/mysql/error.log # ファイルは mysql:adm の 640。一般ユーザーは sudo が要る
sudo journalctl -u mysql -n 50 # 起動しないとき(ログファイルを開く前に落ちた場合も出る)
接続できない状態では @@log_error を引けないので、設定ファイルの log_error の行を探します。
grep -rn 'log_error\|log-error' /etc/mysql/ /etc/my.cnf /etc/my.cnf.d/ 2>/dev/null
設定が無いときの書き先
mysqld --verbose --help で見たコンパイル時の既定は log-error stderr でした。設定ファイルで log_error を指定していなければ、ファイルではなく標準エラーに出ます。Ubuntu のパッケージは /etc/mysql/mysql.conf.d/mysqld.cnf に log_error = /var/log/mysql/error.log を書いているので、ファイルに出ます。
- Docker など、設定ファイルに
log_errorが無い環境ではdocker logs(podman ならpodman logs)で読む - RHEL 系など別のパッケージで入れた場合も、場所はパッケージの設定ファイル次第
- 設定ファイルを読む順番は
mysqld --verbose --help | grep -A1 'Default options'で分かる(Ubuntu は/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf)
関係する変数
mysql> SHOW VARIABLES LIKE 'log_error%';
+----------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------+----------------------------------------+
| log_error | /var/log/mysql/error.log |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_suppression_list | |
| log_error_verbosity | 2 |
+----------------------------+----------------------------------------+
log_error_verbosity は 1=エラーだけ、2=エラーと警告、3=Note までです。既定は 2 です。
SQL でエラーログを読む
SELECT LOGGED, PRIO, ERROR_CODE, SUBSYSTEM, LEFT(DATA, 80)
FROM performance_schema.error_log
ORDER BY LOGGED DESC LIMIT 5;
サーバーに入れればファイルを開かなくても読めます。PRIO が System / Error / Warning / Note、ERROR_CODE は MY-010931 のような形式です。マニュアルでは、メモリ上に一定量だけ持つ表とされています。さかのぼって調べるならファイルを見ます。
ログイン失敗は既定では載らない
ERROR 1045 Access denied で弾かれた接続は、log_error_verbosity が 2 のときエラーログに1行も残りませんでした。3 にすると次の行が出ます。
2026-11-08T07:44:24.585522Z 56 [Note] [MY-010926] [Server] Access denied for user 'nosuchuser'@'localhost' (using password: YES)
不正なログインを追うなら SET GLOBAL log_error_verbosity = 3; にします(再起動で戻るので、残すなら設定ファイルにも書く)。Note が増えてログが大きくなる点に注意します。ERROR 1045 の原因の切り分けは mysql -u root -p の記事に書きました。
起動しないとき
設定ファイルに綴りを間違えた行(innodb_bufer_pool_size = 256M)を足して systemctl restart mysql しました。
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xeu mysql.service" for details.
systemctl と journalctl に出たのは Main process exited, code=exited, status=1/FAILURE までで、理由はエラーログにありました。
[ERROR] [MY-000067] [Server] unknown variable 'innodb_bufer_pool_size=256M'.
[ERROR] [MY-010119] [Server] Aborting
エラーログの書き込み先を存在しないディレクトリ(/var/log/nosuchdir/error.log)に変えて起動した場合は逆でした。エラーログには何も増えず、journalctl に理由が出ました。
mysqld[3643]: ... [ERROR] [MY-010187] [Server] Could not open file '/var/log/nosuchdir/error.log' for error logging: No such file or directory
mysqld[3643]: ... [ERROR] [MY-010119] [Server] Aborting
起動しないときは、エラーログの末尾 → journalctl の順に見ます。どちらも [ERROR] の行が理由で、その直後の Aborting は結果です。起動していないので mysql コマンドは ERROR 2002 Can't connect to local MySQL server through socket になります。
ログを回す
Ubuntu では /etc/logrotate.d/mysql-server が毎日回し、7世代残します(error.log.1.gz …)。手で回すときは、ファイルを移動してから FLUSH ERROR LOGS か mysqladmin flush-logs を実行します。新しい error.log(0 バイト)が作られ、以降はそちらに書かれました。
エラーログのほかに、遅い SQL は スロークエリログ、デッドロックの詳細は SHOW ENGINE INNODB STATUS で見ます。
関連: MySQLのバージョン確認 / MySQLの「Too many connections」 / MySQLに外部から接続できない