MySQL 10 min read

MySQLのエラーログの場所 ― log_errorで確かめる、起動しないときの見方

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

この記事の出力は 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に外部から接続できない

MySQL をもっと深く知るための本

MySQL徹底入門 第5版 MySQL 8.4 LTS対応

翔泳社・2025年6月・MySQL 8.4 LTS 対応

MySQL 8.4 に対応した入門書。日本MySQLユーザ会のメンバーが執筆している。

Amazonで見る

MySQL運用・管理[実践]入門 〜安全かつ高速にデータを扱う内部構造・動作原理を学ぶ

技術評論社・2024年5月

内部構造と動作原理から、運用・管理の考え方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。