こんばんは!スージーです!
なかなか技術ブログが書けずにモヤモヤしていたので、ちょうど良いネタがあり備忘録も兼ねて。
#MySQLに接続できないエラー
私は度々、MySQLに接続できずに四苦八苦しています。pidファイルないよーとかsocketないよーとか、その度に過去のメモや参考記事をあちこち探しているのでまとめてみようと思います。
参考
- 【MySQL】pid not foundもしくはpermission deniedの対応方法
https://qiita.com/AK4747471/items/36b73edd9d1e666ae0c0- RailsプロジェクトでMySQLがbundle installできなかった
https://qiita.com/akito19/items/e1dc54f907987e688cc0- Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
https://note.com/shoki_rails/n/nf7b51ba48084- mysqlのsocketエラーでrailsアプリが起動できない
https://qiita.com/fujitora/items/d341c52706d1954cae28- mysqld_safe A mysqld process already existsが出た時の対処方法
https://www.takafumitaba.com/mysql-already-exists- MySQLが再起動しなくなったときに行う3つの手順
https://engineer.evisu0414.com/mysql001/
【遭遇率第1位】
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
原因:
ざっくり言うとmysql.sockファイルが存在しないから作ってね
解決策:
/tmp直下にmysql.sockを作る
mysql.sockファイルがあるか確認
~ $cd /tmp
tmp $ ls
mysql.sockがない
tmp $ sudo touch mysql.sock
tmp $ cd
~ $ sudo mysql.server start
ERROR!~~~
startできずエラー発生したら
権限の書き換え(chownでファイルやディレクトリの所有者と所属グループを変更する)
~ $ sudo chown username /tmp/mysql.sock
もしくは権限付与
~ $ sudo chmod 777 /tmp/mysql.sock
もう一度mysql起動
~ $ sudo mysql.server start
...SUCCESS!
mysql.sockファイルの作り方は色々あると思いますが、私はこのエラーが起きた時はtouch
コマンドで/tmp/
ファイル直下にmysql.sock
ファイルを直接作ってしまいます。socketファイル作成しても権限がないと怒られる事もあるのでその時はchown
コマンドかchmod
コマンドで権限の書き換えか権限付与してあげて下さい。
【遭遇率第2位】
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
原因:
ざっくり言うとpidファイルが存在しないから作ってね
解決策:
/usr/local/var/mysql/直下にlocal.pidファイルを作る
~ $ sudo mysql.server start
Starting MySQL
… ERROR! server quit updating PID file(/usr/local/var/mysql/usernoMacBook-ea.local.pid)
pidファイルがあるか確認してみる
~ $ cd /usr/local/var/mysql
mysql $ ls
usernoMacBook-ea.local.pidがない
mysql $ sudo touch usernoMacBook-ea.local.pid
mysql $ cd
~ $ sudo mysql.server start
...ERROR!~~/usr/local/var/mysql/username.local.err: Permission denied
権限ないよと怒られたら先ほどのエラーと同様に権限の書き換え(chownでファイルやディレクトリの所有者と所属グループを変更する)
~ $ sudo chown /usr/local/var/mysql/usernoMacBook-ea.local.pid
もしくは権限付与
~ $ sudo chmod 777 /usr/local/var/mysql/usernoMacBook-ea.local.pid
もう一度起動してみる
~ $ sudo mysql.server start
...SUCCESS!
先ほどと同様にやり方は色々あると思いますが、pid
ファイルもtouch
コマンドで作ってあげましょう。mysql.sock
のエラーと同様に権限ないよって怒られたら権限の書き換えか権限付与してあげましょう。
ここまでのまとめ
ここまで紹介したmysql.sock
ないよ、~.local.pid
ないよ、権限
ないよ、がMySQL関連エラーの大半を占めていると思います。「/tmpディレクトリってどこ!?」とか「/usrディレクトリなんて知らないよ」って最初は思いましたが、まずはファイルが無い事を確認する為にcd
コマンドで該当ディレクトリまで潜って見てみましょう。
【遭遇率第3位】
mysql立ち上がった!と思ったらsafeモードのプロセスが既に存在してますよっていうエラー
原因:
既にMySQLのプロセスが動いている
解決法:
processをkillする
~ $ sudo mysql.server start
Starting MySQL
SUCCESS!
~ $ 200315 13:51:58 mysqld_safe A mysqld process already exists
動いているMySQLプロセスを確認してみる
~ $ ps aux| grep mysqld
user 98762 0.0 0.0 4268296 672 s004 S+ 2:00PM 0:00.01 grep mysqld
user 98633 0.0 5.4 4929884 450652 ?? S 1:51PM 0:00.46 /usr/local/opt/mysql@5.6/bin/mysqld --basedir=/usr/local/opt/mysql@5.6 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.6/lib/plugin --log-error=usernoMacBook-ea.local.err --pid-file= usernoMacBook-ea.local.pid
user 98536 0.0 0.0 4281052 1128 ?? S 1:51PM 0:00.03 /bin/sh /usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql ←注目
mysqld_safeプロセスが動いている模様
プロセスをkillする
~ $ sudo kill -9 98536
Password:
一度mysqlを停止する
~ $ mysql.server stop
Shutting down MySQL
.. SUCCESS!
もう一度MySQLを起動してみる
~ $ mysql.server start
Starting MySQL
. SUCCESS!
これはこの前初めて遭遇したエラーです。頻出エラーより遭遇確率は低いと感じますが、grep
してmysql_safe
のプロセスが動いているか確認しましょう。mysql_safe
以外のプロセスをkillしてもエラー解消しなかったので悪さしているmysql_safeを見つけてあげましょう。
【番外編】
過去に一度でも5.7を起動してしまうと、同じデータを使って5.6を起動すると今までの方法では解決できない場合がある。
この状況は過去に一度dockerでMySQL@5.7で起動した後に開発環境のMySQL@5.6を起動した時に起きた事があります。
この状況になったらMySQLをアンインストールする方法があります。ただし、開発環境で大切なデータがDBに残っている場合は何らかの方法で退避させてあげて下さい(退避方法は割愛します。実践した事ないです)。私は幸いにも開発環境に貴重なデータはないので躊躇無くアンインストールしました。
mysqlをアンインストールします
~ $ brew remove mysql
~ $ brew cleanup
以下のディレクトリ下にはmysql関連ファイルが作成されているので念の為、綺麗に削除しておきます
~ $ sudo rm -rf /usr/local/mysql
~ $ sudo rm -rf /Library/StartupItems/MYSQL
~ $ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
~ $ sudo rm -rf /Library/Receipts/mysql-.pkg
~ $ sudo rm -rf /usr/local/Cellar/mysql*
~ $ sudo rm -rf /usr/local/bin/mysql*
~ $ sudo rm -rf /usr/local/var/mysql*
~ $ sudo rm -rf /usr/local/etc/my.cnf
~ $ sudo rm -rf /usr/local/share/mysql*
~ $ sudo rm -rf /usr/local/opt/mysql*
最後にver5.6をインストール
~ $ brew install mysql@5.6
インストールが完了したらパス通す
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
.bash_profileの変更を反映
$ source ~/.bash_profile
MySQLを起動
~ $ sudo mysql.server start
. SUCCESS!
アンインストールしても過去のmysqlファイルがなぜか残っている場合があるので面倒ですけど rm
コマンドで該当該当ファイルを削除してあげます。完全にクリーンになったMySQLならちゃんと起動してくれます。
【番外編2】
rails new project-name -d mysql→ Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
原因:
mysqlのライブラリーがロードできませんよ
対策:
mysql2をアンインストールしてbundle install
project-name $ bundle exec gem uninstall mysql2
project-name $ bundle install
.
..
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
/Users/akito/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20160929-55293-192vx35.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.14/lib
-----
creating Makefile
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/mkmf.log
current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR=" clean
current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
make failed, exit code 2
Gem files will remain installed in /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4 for inspection.
Results logged to
/Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/gem_make.out
An error occurred while installing mysql2 (0.4.4), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.4'` succeeds before bundling.
盛大に怒られている...
以下の参考記事の通りにやってみます
RailsプロジェクトでMySQLがbundle installできなかった
https://qiita.com/akito19/items/e1dc54f907987e688cc0
project-name $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
project-name $ bundle install
.
..
...
Bundle complete! 18 Gemfile dependencies, 78 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
run bundle exec spring binstub --all
* bin/rake: Spring inserted
* bin/rails: Spring inserted
正常にbundle install完了したみたい
project-name $ rails db:create
Created database ‘project-name_development’
Created database ‘ project-name_test’
project-name $ rails db:migrate
project-name $ rails s
=> Booting Puma
=> Rails 5.2.4.1 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.4 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
きたきたきたーーーー!!!!
localhost:3000にアクセスすればいつものrails初期画面が表示されます。MySQLエラーのドツボにハマってrails sでサーバ起動できた時は快感ですね。
【番外編3】
rails new
すると
Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory:
/Users/sugawarakouhei/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
/Users/sugawarakouhei/.rbenv/versions/2.6.6/bin/ruby -I
/Users/sugawarakouhei/.rbenv/versions/2.6.6/lib/ruby/2.6.0 -r ./siteconf20200913-76471-1vhwnwi.rb
extconf.rb --with-ldflags\=-L/usr/local/opt/openssl/lib\
--with-cppflags\=-I/usr/local/opt/openssl/include
checking for rb_absint_size()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/USER_NAME/.rbenv/versions/2.6.6/bin/$(RUBY_BASE_NAME)
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:467:in `try_do': The compiler
failed to generate an executable file. (RuntimeError)
You have to install development tools first.
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:552:in `try_link0'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:570:in `try_link'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:782:in `try_func'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:1069:in `block in have_func'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:959:in `block in
checking_for'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:361:in `block (2 levels) in
postpone'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:331:in `open'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:361:in `block in postpone'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:331:in `open'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:357:in `postpone'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:958:in `checking_for'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:1068:in `have_func'
from extconf.rb:25:in `<main>'
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mysql2-0.5.3/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection.
Results logged to
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mysql2-0.5.3/gem_make.out
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before
bundling.
In Gemfile:
mysql2
こちらの記事を参考に
Rails error installing mysql2 (mysql2-0.3.20)
https://stackoverflow.com/questions/51228905/rails-error-installing-mysql2-mysql2-0-3-20
mysql2インストールにはまった
$ brew install mysql
Updating Homebrew...
Warning: mysql 8.0.21_1 is already installed and up-to-date
To reinstall 8.0.21_1, run `brew reinstall mysql`
$ gem install mysql2 -v '0.5.3' -- --srcdir=/usr/local/mysql/include
Building native extensions with: '--srcdir=/usr/local/mysql/include'
This could take a while...
Successfully installed mysql2-0.5.3
Parsing documentation for mysql2-0.5.3
Installing ri documentation for mysql2-0.5.3
Done installing documentation for mysql2 after 0 seconds
1 gem installed
$ bundle install
【忘れがちなコマンド覚書き】
sudo mysql.server start
→MySQLを立ち上げます
sudo mysql.server stop
→MySQLを停止します
sudo mysql.server restart
→MySQLをstop&startします
sudo mysql.server status
→MySQLの状態を確認します
ps aux| grep mysqld
→MySQLのプロセスを探します
まとめ
以上、私が遭遇したMySQLエラーのまとめでした。自分で何度も遭遇して解決しているうちに遭遇するパターンが同じだったので一覧で見れるようにしておけば後から振り返る時に便利だなと思い久々にQiitaを書いてみました。今回は初めてipadでこの記事を全部書いてみましたが、以外と快適に書けたのでipadとsmart keybord買った甲斐がありました。