MySQLに接続しようとして、こんなエラーに出くわしたことはないでしょうか。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
mysql -u root -p を叩いても同じエラーが返ってくる——そんな状況で何から調べればよいか、迷っている方は多いはずです。ERROR 2002 が示しているのは、「クライアントが参照しようとしたUNIXソケットファイルが存在しない、またはパスが食い違っている」という事実です。原因は大きく2つに絞られます。
・mysqldプロセスが停止している——起動していないのでソケットファイルが生成されない
・ソケットファイルのパスが食い違っている——mysqldは動いているが、クライアントが探すパスとサーバーが実際に使うパスが一致していない
この記事では、この2つの原因を3ステップで切り分けてピンポイントで対処する手順を解説します。ERROR 1045(パスワード認証失敗)やERROR 2003(TCP/IP接続失敗)とは別の障害事象ですので、それらを期待している方はご注意ください。
動作確認環境:Rocky Linux 9.4 / RHEL 9.4(MySQL 8.0・8.4)、Ubuntu 24.04 LTS(MySQL 8.0)
この記事のポイント
・ERROR 2002はソケットファイルが未生成またはパス不一致を示す
・まずsystemctlでmysqldが起動しているか確認する
・my.cnfのsocket設定とfindコマンドで実際のパスと突き合わせる
・journalctlのエラーログで権限不足・未初期化・InnoDB障害を特定する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
ERROR 2002とは——ソケット接続失敗の2大原因
MySQLクライアント(mysqlコマンド)は、同じホスト上の接続ではデフォルトでTCP/IPではなくUNIXドメインソケット経由でサーバーに接続しようとします。そのソケットファイル(通常 /var/lib/mysql/mysql.sock)が見つからないか、クライアントが参照するパスとサーバーが使うパスがずれているときに ERROR 2002 が返ります。よく混同される近隣エラーと明確に区別しておきます。
| エラー番号 | 意味 | よくある原因 |
|---|---|---|
| ERROR 2002 | UNIXソケットに接続できない | mysqld停止 / ソケットパス不一致 |
| ERROR 2003 | TCP/IPでMySQLサーバーに接続できない | mysqld停止 / ファイアウォール / bind-addressの設定 |
| ERROR 1045 | ユーザー認証失敗(Access denied) | パスワード誤り / 権限不足 |
ステップ1:systemctlでmysqldの起動状態を確認する
最初に確認するのは「mysqldが起動しているか」です。起動していなければソケットファイルは生成されず、必ず ERROR 2002 になります。1. systemctl statusで状態を見る
# Rocky Linux / RHEL(MySQL公式パッケージ) systemctl status mysqld # Ubuntu(Debian系) systemctl status mysql # MariaDBの場合 systemctl status mariadb
* mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled) Active: active (running) since Thu 2026-08-20 08:00:12 JST; 1h 30min ago Main PID: 1582 (mysqld) Status: "Server is operational"
Active: failed または Active: inactive (dead) と表示されます。* mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled) Active: failed (Result: exit-code) since Thu 2026-08-20 09:15:32 JST; 3min ago Process: 12345 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE) Main PID: 12345 (code=exited, status=1/FAILURE)
2. mysqldが停止している場合の次の手順
Active: failed または inactive であれば、「なぜ起動できないのか」をステップ3で調べます。一時的な問題(設定ファイル編集後の再起動忘れなど)なら、まず systemctl start mysqld を試してください。叩いた直後に再度 systemctl status mysqld を確認し、active (running) になっているかをチェックします。3. mysqldが起動している場合の次の手順
Active: active (running) と出ているのに ERROR 2002 が返る場合は、ソケットファイルのパスが食い違っています。ステップ2へ進みます。なお、mysqldが起動しているなら ss -lntp | grep 3306 でTCPポートの状態も確認できます(Linux ポート確認の全コマンド)。ただし ERROR 2002 はUNIXソケットの問題であり、TCPポートを調べるのはあくまで補足確認です。ステップ2:ソケットファイルの場所を特定してパス不一致を見抜く
mysqldが起動しているのに ERROR 2002 が出るのは、クライアントが参照するソケットパスとサーバーが実際に使っているパスが異なるからです。1. my.cnfのsocket設定を確認する
# Rocky Linux / RHELの設定ファイルを確認 grep -i socket /etc/my.cnf /etc/my.cnf.d/*.cnf 2>/dev/null # Ubuntuの設定ファイルを確認 grep -i socket /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf 2>/dev/null
/etc/my.cnf:[mysqld] /etc/my.cnf:socket=/var/lib/mysql/mysql.sock /etc/my.cnf:[client] /etc/my.cnf:socket=/var/lib/mysql/mysql.sock
[mysqld] セクションの socket= がサーバー側のソケットパスです。[client] セクションが未定義の場合はコンパイル時のデフォルト値(MySQL系は /var/lib/mysql/mysql.sock、MariaDB系は /tmp/mysql.sock の場合がある)が使われます。2. 実際のソケットファイルを探す
# ソケットファイルの実在パスを探す find /var/lib/mysql /tmp /var/run /var/run/mysqld -name "*.sock" 2>/dev/null
/var/lib/mysql/mysql.sock
socket= と一致していれば問題ありません。一致していない場合は、my.cnf の [client] セクションに正しいパスを追記します。# /etc/my.cnf の [client] セクションに socket パスを明示する例 [client] socket=/var/lib/mysql/mysql.sock
mysql -u root -p --socket=/var/lib/mysql/mysql.sock
3. ソケットファイルが見つからない場合
find コマンドの結果が何も返ってこない場合は、mysqldが停止しているか、起動に失敗して途中でプロセスが終了した状態です。ステップ3でジャーナルログを確認して根本原因を特定します。
MySQLの起動障害調査は、Linuxサーバーの運用スキルの典型的な場面です。systemctlやjournalctlを使いこなして問題を自力で解決できるエンジニアへの最短ルートを、現役サーバー管理者が直接指導します。
ステップ3:journalctlでMySQLの起動失敗ログを読む
systemctl start mysqld を実行してもすぐに落ちてしまう場合は、journalctlでエラーの詳細を読みます。1. journalctlでmysqldのログを確認する
# 直近のmysqldログを確認(RHELではサービス名はmysqld) journalctl -xeu mysqld --no-pager | tail -60 # Ubuntuの場合 journalctl -xeu mysql --no-pager | tail -60 # MariaDBの場合 journalctl -xeu mariadb --no-pager | tail -60
2. よく出るエラーパターンと意味
パターンA:ディレクトリ権限エラー(error 13 = Permission denied)[ERROR] [MY-012592] [InnoDB] Operating system error number 13 in a file operation. [ERROR] [MY-012595] [InnoDB] Operating system error number 13 means 'Permission denied'. [ERROR] [MY-012270] [InnoDB] Failed to open file './ibdata1', returned OS error 71.
/var/lib/mysql ディレクトリの所有者が mysql ユーザー以外になっているときに発生します。誤って chown root /var/lib/mysql を実行した場合などが典型です。パターンB:データディレクトリ未初期化
[ERROR] [MY-011011] [Server] Failed to find valid data directory. [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
mysqld --initialize を実行せずにサービスを起動しようとした場合に出ます。新規インストール直後に確認するパターンです。パターンC:InnoDB障害(クラッシュリカバリが必要)
[ERROR] [MY-013183] [InnoDB] Assertion failure: ... [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
パターンD:ディスク容量不足(errno 28 = No space left on device)
[ERROR] [MY-000035] [Server] Disk is full writing '/var/lib/mysql/binlog.000123' (OS errno 28 - No space left on device). Waiting for someone to free space...
df -h /var/lib/mysql で使用率を確認し、不要なファイルを削除するか領域を拡張します。起動失敗のトラブルシューティング——原因別の対処手順
ジャーナルログで原因を特定できたら、該当するケースの手順で対処します。1. ディレクトリ権限を修復する(パターンA対応)
# /var/lib/mysql の所有者をmysqlに戻す chown -R mysql:mysql /var/lib/mysql # パーミッションも念のため確認・修正する chmod 750 /var/lib/mysql # mysqlを起動して確認 systemctl start mysqld systemctl status mysqld
2. データディレクトリを初期化する(パターンB対応)
初期化を実行すると既存のデータベースが全て消えます。新規インストール直後の場合のみ実行してください。既存データがある場合は必ずバックアップを確認してから作業します。# データディレクトリを初期化する(rootの一時パスワードが生成される) mysqld --initialize --user=mysql # 生成された一時パスワードを確認する grep 'temporary password' /var/log/mysqld.log # サービスを起動してパスワードを変更する systemctl start mysqld mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード'; で変更します。3. InnoDB障害からクラッシュリカバリする(パターンC対応)
まずinnodb_force_recovery=1 で起動を試みます。起動できたらデータをダンプして、クリーンな状態に再構築します。# /etc/my.cnf の [mysqld] セクションに追記して起動を試みる [mysqld] innodb_force_recovery = 1 # サービスを起動する systemctl start mysqld # 起動できたら全データベースをダンプする mysqldump -u root -p --all-databases > /tmp/all_databases.sql # ダンプ取得後、innodb_force_recoveryの行を削除してから再構築する
4. ディスク空き容量を確保する(パターンD対応)
# /var/lib/mysql の容量を確認する df -h /var/lib/mysql # バイナリログを削除する(レプリケーション未使用の場合) mysql -u root -p -e "PURGE BINARY LOGS BEFORE NOW();" # 容量確保後にmysqlを起動する systemctl start mysqld
本記事のまとめ
ERROR 2002 の切り分けフローを一覧にまとめます。| 確認内容 | コマンド | 結果と次のアクション |
|---|---|---|
| mysqldの起動状態 | systemctl status mysqld |
failed/inactive → journalctlで原因確認 |
| my.cnfのsocket設定 | grep -i socket /etc/my.cnf |
パス確認。[client]未設定ならデフォルト値 |
| ソケットファイルの実在 | find /var/lib/mysql /tmp -name "*.sock" |
見つからない → mysqld停止 or 起動失敗 |
| 起動失敗の根本原因 | journalctl -xeu mysqld --no-pager |
Permission denied/未初期化/InnoDB障害を判別 |
| ディレクトリ権限修復 | chown -R mysql:mysql /var/lib/mysql |
Permission denied(error 13)の対処 |
| データディレクトリ初期化 | mysqld --initialize --user=mysql |
新規インストール後のみ実行 |
なお、TCP/IP接続での失敗(ERROR 2003)やパスワード認証失敗(ERROR 1045)は本記事のスコープ外で、それぞれ別の切り分けが必要です。
MySQLの起動障害を自力で解決できたら、次はLinuxサーバー全体の運用スキルを体系的に固めませんか?
journalctlを読んでInnoDB障害に対処するような現場力も含め、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MySQLの文字コードをutf8mb4へ移行する手順|照合順序の選定と既存テーブルの変換
- この記事の属するカテゴリ:MySQLへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます