経緯
herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。。。
原因は、恐らくMySQLのバージョンが、いつの間にか ver 8.0 にアップデートされていた事が原因っぽい。。。
ちなみに今迄使っていたのは ver 5.6
こんな事が起きたのが初めてだったので、色々弄り過ぎて解決するのにかなりの時間を費やしてしまった。
このやり方が有っているのか不明だが、誰かのお役に立つかと思い残しておきます。
ちなみに余談だが、herokuを使ってデプロイするならこの記事が一番良いので紹介だけしておきます。
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
作成中のアプリの画面がエラー画面に!エラー文が以下のもの
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
これは、「ソケット /tmp/mysql.sock を通じてローカルのMySQLサーバーに接続することができません」という意味です(訳しただけですが)
ソケットとは、Unixドメインソケット(ファイルシステムソケット)の事で、ローカルシステム内での通信を行う際に、このファイルの入出力を通じてサーバーとクライアント間での通信を行います。
つまり仲介役ですね。
では、このエラーの対処の方法を説明したいと思います。
MySQLサーバーが起動していない
一番ベターな解決作ですが、只純粋にMySQLが起動していない事が原因かもと思い、
% mysql.server start
を打ち込む。
すると
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
*******
は自分のコンピューター名が入ります。
また、多くの記事では******.local.pid
って出ているのですが
この違いは不明です(寧ろ誰が教えて!)
ちなみに、このエラーは前のMySQLバージョンで使用したデータを使って起動した時に出るようです。
/usr/local/var/mysql配下のpidファイルが無いって言われているようなのでこのディレクトリを確認
% cd /usr/local/var/mysql
% ls
のコマンドで確認した所、******.local.pid
は存在したが、******.pid
は無い
ということで、pidファイルを作成する
% sudo touch /usr/local/var/mysql/******.pid
本当に出来たか確認する為、もう一度上記のコマンドでディレクトリを確認
うん!有った!
これで行けるかと思いもう一度
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
全く変わらずまた同じエラー
ここからの対処
色々エラーを検索して、分かった事だが上記でも記載している通り原因は、
MySQLの ver が5.6 →8.0 のアップデートされてしまい、
ERROR! The server quit without updating PID file は前のMySQLバージョンで使用したデータを使って起動した時に出るという事
ちなみに余談だが、8.0 は良い意味でも悪い意味でセキュリティーが上がっているようで
Sequel pro(ホットケーキがアイコンのもの)の対応できていない。
これらの事から、元の状態に戻す、つまりver を 5.6 に戻す方が早いのではっと考え
8.0 をアンインストール後、5.6 をインストールし直す事にした。
3つの行った事
・ MySQL8.0 をアンインストール
・ プロセスを確認
・ 権限の確認
の3つを行い成功した
MySQL8.0アンインストール&MySQL5.6再インストール
※実行の前に注意する事としては、MySQLのデータが削除されてしまいますので注意
僕はデータが消えても問題なかったのでそのままやっちゃいました。
もし気になる方は下記の記事を参考にして見てください、アンインストールの方法もこの記事を参考にしてます
The server quit without updating PID file mysqlエラー解決方法
brewコマンドを使ってアンインストールします
% brew uninstall mysql
% brew uninstall --force mysql
% brew cleanup -s mysql
% brew prune
続いて、
% rm -rf /usr/local/mysql
% rm -rf /Library/StartupItems/MYSQL
% rm -rf /Library/PreferencePanes/MySQL.prefPane
% rm -rf /Library/Receipts/mysql-.pkg
% rm -rf /usr/local/Cellar/mysql*
% rm -rf /usr/local/bin/mysql*
% rm -rf /usr/local/var/mysql*
% rm -rf /usr/local/etc/my.cnf
% rm -rf /usr/local/share/mysql*
% rm -rf /usr/local/opt/mysql
brew uninstall mysql では削除できないファイル群を削除します。
多くの記事でコマンドのmysqlの後にverを指定していないので大丈夫かと思いますが
僕は心配だったのでverを入れたコマンドも一緒に打ち込みました(笑)
こんな感じですね
% brew uninstall mysql@8.0
ver の確認方法は、
% mysql --version
これでもわかります
% which mysql
そして、インストールしたい ver を指定して打ち込みます。
% brew install mysql@5.6
これで全部スッキリ綺麗に入れ直しが出来たはずです!
そして、このままでは、MySQLのコマンドが一切反応してくれません。なのでパスを通しましょう。
下記の2つのコマンドです。
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
一応MySQLのコマンドが打てるか確認
% which mysql
以下のように表示されれば成功です
/usr/local/opt/mysql@5.6/bin/mysql
もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start
僕はダメでしたが、、、変わらずこのエラー
またお前か・・・
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
プロセスを確認
ここでプロセスを確認です。
要はどういう事かというと、ver 5.6 を起動したいのに 8.0 が起動したままでは、
エラーが出るので、もし起動中のままだったら強制終了しましょうっていう確認です。
下記のコマンドで確認出来ます。
% ps -ef | grep mysql
余計なものが起動していると下記のように表示されます。
1行目、2行目が余計ですね。
3行目は、なきゃいけないものですのでオッケーです。
501 699 1 0 16 720 ?? 0:00.04 /bin/sh /usr/local/opt/mysql@8.0/bin/mysqld_safe --datadir=/usr/local/var/mysql
501 974 699 0 16 720 ?? 1:06.51 /usr/local/opt/mysql@8.0/bin/mysqld --basedir=/usr/local/opt/mysql@8.0 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@8.0/lib/plugin --log-error=XXXX-Air.local.err --pid-file=XXXX-Air.local.pid
501 3524 81032 0 1:48AM ttys002 0:00.00 grep mysql
問題ない時は下記のような感じで出ます。
501 3524 81032 0 1:48AM ttys002 0:00.00 grep mysql
では、killコマンドで強制終了(-9)させましょう。
% kill -9 974
(974は上記のプロセスIDです)
一個強制終了させれば、上記で言えば699も一緒に消えると思いますが
消えてない場合はもう一回killコマンドで消してください。
最後に確認の為もう一度下記のコマンドを打って確認してください。
% ps -ef | grep mysql
しつこいですが、
もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start
僕は、またまたダメでしたが、、、変わらずこのエラー
またまたお前か・・・
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
権限を確認
権限は、ユーザー名ではないと、Permission denied(アクセス権限がない)と
いう事でエラーが出るらしいのでこれを確認
このコマンドで確認
% ls -la /usr/local/var/mysql
% ls -la /usr/local/var/mysql
total 221232
drwxrwxrwx 10 _mysql admin 320 10 8 05:19 .
drwxrwxr-x 7 _mysql admin 224 10 8 05:11 ..
-rw-rw---- 1 _mysql admin 56 10 8 05:19 auto.cnf
-rwxrwxrwx 1 _mysql admin 50331648 10 8 05:19 ib_logfile0
-rwxrwxrwx 1 _mysql admin 50331648 10 8 05:11 ib_logfile1
-rwxrwxrwx 1 _mysql admin 12582912 10 8 05:19 ibdata1
-rwxrwxrwx 1 _mysql admin 18507 10 8 05:19 ******.err
drwxrwxrwx 81 _mysql admin 2592 10 8 05:11 mysql
drwxrwxrwx 55 _mysql admin 1760 10 8 05:11 performance_schema
drwxrwxrwx 2 _mysql admin 64 10 8 05:11 test
_mysqlの所がユーザー名ではないとダメらしいので変更する `% sudo chown -R $USER /usr/local` $USERのまま打ち込めばユーザー名に変更してくれるのでこのまま打ち込んでください
これで変更されたはずなので、再度確認して見てください。
% ls -la /usr/local/var/mysql
※逆に、_mysqlのままではないとダメという記事も多数見かけますが、
どっちが正解なのか、すみません僕にも分かりません・・・
僕はこっちではないとダメでした。
わかる方が入れば教えて頂ければ有難いです
さぁ、これでどうだ!
・・・・・・またまたまたダメでしたが、、、変わらずこのエラー
またまたまたお前か・・・
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
が、最後にエラーの通りもう一度
% sudo touch /usr/local/var/mysql/******.pid
をしたら
% mysql.server start
Starting MySQL
. SUCCESS!
やっと、起動した・・・
なんて大変なのだ・・・
しかし、まだ僕の戦いは終わりませんでした。
MySQLは無事起動しましたが、またしてもエラーが出ました・・・・
次の記事では、その対処法について記載します。
MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】
余談
余談ですが、
MySQLは本来であればPC再起動のたびに起動し直す必要がありますが、それは面倒であるため、
自動で起動するよう出来ます。それが、下記のコマンドです!
是非知らない方は、やっておいた方が便利ですよ!
% mkdir ~/Library/LaunchAgents
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist