Can't connect to local MySQL server through socket エラー解消方法

初めに

初めまして。アルバイトのアズマインと申します。先日HomebrewでインストールしたMariaDB環境でデータベースにログインしようとしたら以下のエラーが出るようになり、数時間格闘した末、やっと解消できたので、皆様の力になると思い共有することにしました。もしかすると、この記事で紹介された手法で皆さんが遭遇しているエラーが解決しないかも知れません。ただ、解決への経緯とエラーを解消するための思考が参考になると思うので、メモ帳感覚で読んでいただければ幸いです。

解決までの経緯

$mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (61)
  1. エラーに遭遇した時まず初めに試すべきことはグーグル検索です。ただ、上記のエラーについて調べて出てきたほとんどの記事はDB環境を完全にリセット(つまり/usr/local/var/mysql配下のフォルダー・ファイルを削除)することを推奨していましたので、生成するのに苦労したデータが残っていた私からするとあまり参考にならかったです。環境を保持しながらエラーを解消しようと試みました。

  2. MariaDB環境が正常に動かない場合、まずMaria DB環境を再始動することをお勧めします。

普段なら、念の為、バックアップをとりますが、今回はそもそもmysqlでログインできないため、先に進むことにしました。下記のコマンドを使ってHomebrewでMariaDBを立ち上げました。

$brew services restart mariadb

$brew services list | grep mariadbでmariadbが正常に動いているかを確認してから再度ログインを試してました。

$mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (61)

なかなか動いてくれません。OSレベルのプロセス一覧を確認できるps aux | grep mariadbコマンドでMariaDBの生存確認したところ、プロセスが死んでいたことがわかりました。Hombrewのサービス起動とMariaDBの起動になんらかの理由で乖離が生じたからかもしれません。

  1. MacOS以外のUnix系システムでは一般的にmysql.server startコマンドで起動することをネットで調べてわかったので、このコマンドで再度立ち上げようと思います。
$mysql.server start

Starting MariaDB
.210309 13:40:59 mysqld_safe Logging to '/usr/local/var/mysql/Tamims-MacBook-Pro.local.err'.
210309 13:40:59 mysqld_safe Starting mariadbd daemon with databases from /usr/local/var/mysql
/usr/local/bin/mysql.server: line 264: kill: (26788) - No such process
 ERROR!

今度は正常に起動できていないことを示すメッセージを確認できましたので、一歩前進したと見なしてよいでしょう。 重要なのは2行目のLogging to 〇〇というメッセージです。上記のファイルにエラーの詳細が書かれたらしいので見てみましょう。

  1. ログファイルの確認

下記のコマンドで確認しました:

$vi /usr/local/var/mysql/Tamims-MacBook-Pro.local.err

前々からロギングされた情報ありましたが、直近のエラーメッセージの詳細を確認するために、一番下までスクロールしてみました。ただ、どこからどこまでが今回のエラーの詳細なのか全く検討がつかなかったので、「区切りスペースを入れて再実行」という万策を試してみました。この作戦では、最後のログメッセージの後に手動で"———————————"などのわかりやすい文字を挿入することによって、次回のエラーメッセージの範囲がわかりやすくするのが目的です。

MariaDB起動コマンド再実行後、区切り文字以降に以下のログ文が入っていました:

2021-03-09 12:12:44 0 [Note] mysqld (mysqld 10.5.8-MariaDB-log) starting as process 19300 ...
2021-03-09 12:12:44 0 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
2021-03-09 12:12:44 0 [Note] InnoDB: Uses event mutexes
2021-03-09 12:12:44 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2021-03-09 12:12:44 0 [Note] InnoDB: Number of pools: 1
2021-03-09 12:12:44 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
2021-03-09 12:12:44 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728
2021-03-09 12:12:44 0 [Note] InnoDB: Completed initialization of buffer pool
**2021-03-09 12:12:44 0 [ERROR] InnoDB: Invalid flags 0x4800 in ./ibdata1**
**2021-03-09 12:12:44 0 [ERROR] InnoDB: Plugin initialization aborted with error Data structure corruption**
**2021-03-09 12:12:44 0 [Note] InnoDB: Starting shutdown...**
**2021-03-09 12:12:44 0 [ERROR] Plugin 'InnoDB' init function returned error.**
**2021-03-09 12:12:44 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.**
2021-03-09 12:12:44 0 [Note] Plugin 'FEEDBACK' is disabled.
**2021-03-09 12:12:44 0 [ERROR] Could not open mysql.plugin table: "Table 'mysql.plugin' doesn't exist". Some plugins may be not loaded**
**2021-03-09 12:12:44 0 [ERROR] Unknown/unsupported storage engine: InnoDB**
**2021-03-09 12:12:44 0 [ERROR] Aborting**

重要なのは太文字の[ERROR]が出ているところです。ほうほう、ibdata1(インデックス情報を保持しているファイル)に無効な情報が入っており、MariaDBのストレージエンジン(innodb)が止まってしまっています。そして、innoDBの異常な動きに動揺しているmysql.pluginプロセスも止まってしまい、MariaDBサーバー自体が止まってしまっている状況です。(ほとんどネット調べです)

  1. エラー理解できたらから解決策を模索

InnoDB: Invalid flags 0x4800 in ./ibdata1が元凶だとわかったので、このエラーについてネットで調べることにしました。このページに辿り着いたところ、「ibdata1ファイルはサーバー起動時に自動的に生成されたものだから、消してもいい」とわかったので、一旦このファイルを消してからMariaDBの再起動を試してみました。もちろん今回も区切り文字をログファイルに入れています。

$rm -rf /usr/local/var/mysql/ibdata1
$mysql.server start

Starting MariaDB
.210309 13:40:59 mysqld_safe Logging to '/usr/local/var/mysql/Tamims-MacBook-Pro.local.err'.
210309 13:40:59 mysqld_safe Starting mariadbd daemon with databases from /usr/local/var/mysql
 ERROR!

またもや失敗です。ログファイルを確認してみましょう

  1. もう一度ログファイルを確認
$vi /usr/local/var/mysql/Tamims-MacBook-Pro.local.err

2021-03-09 12:15:47 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2021-03-09 12:15:47 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2021-03-09 12:15:47 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2021-03-09 12:15:47 0 [Note] InnoDB: 10.5.8 started; log sequence number 45130; transaction id 20
2021-03-09 12:15:47 0 [Note] Plugin 'FEEDBACK' is disabled.
2021-03-09 12:15:47 0 [Note] InnoDB: Loading buffer pool(s) from /usr/local/var/mysql/ib_buffer_pool
2021-03-09 12:15:47 0 [Note] InnoDB: Buffer pool(s) load completed at 210309 12:15:47
2021-03-09 12:15:48 0 [Note] Server socket created on IP: '::'.
**2021-03-09 12:15:48 0 [ERROR] Can't start server : Bind on unix socket: Address already in use**
**2021-03-09 12:15:48 0 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?**
**2021-03-09 12:15:48 0 [ERROR] Aborting**
2021-03-09 12:16:58 0 [Note] InnoDB: Uses event mutexes
2021-03-09 12:16:58 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2021-03-09 12:16:58 0 [Note] InnoDB: Number of pools: 1
2021-03-09 12:16:58 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
2021-03-09 12:16:58 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728
2021-03-09 12:16:58 0 [Note] InnoDB: Completed initialization of buffer pool

今度は違うエラーが出ています。先程のエラーが解消されたか、あるいは、先程のエラーでまた何か壊れたかもしれません。ただ、今回のエラーは「MariaDBの接続ポートが既に使用されてますよ」というメッセージなので、これは比較的簡単に対処できます。

  1. MariaDBと通信するためのポートを勝手に使用しているプロセスを止めて、再起動してみましょう。

MariaDBはデフォルトだと3306番ポートを使用していますので、このポートを勝手に使用しているものを下記のコマンド使って止めましょう。 また、調べたところ、mysql.sockは通信用に一時的に自動生成されるファイルでした(/tmp配下にあるからなおさらそうといえます)ので、今回のエラーの元凶であるこのファイルも同時に削除することにしました。

$pkill 3306
$sudo rm -rf /tmp/mysql.sock
  1. 再実行
$mysql.server start

Starting MariaDB
 SUCCESS!
210316 17:55:19 mysqld_safe Logging to '/usr/local/var/mysql/Tamims-MacBook-Pro.local.err'.

やっと成功できました!これで、やっと仕事が捗ります!

解決先

$rm -rf /usr/local/var/mysql/ibdata1
$pkill 3306
$rm -rf /tmp/mysql.sock
$mysql.server start

注意点

MariaDBの環境設定によってmysql.sockの場所は変わってきます。

Pocket