LoginSignup
2
3

More than 3 years have passed since last update.

【MySQL】プログラミング初心者が今まで遭遇したエラーとその解決方法のメモ

Last updated at Posted at 2020-03-16

こんばんは!スージーです!
なかなか技術ブログが書けずにモヤモヤしていたので、ちょうど良いネタがあり備忘録も兼ねて。

MySQLに接続できないエラー

私は度々、MySQLに接続できずに四苦八苦しています。pidファイルないよーとかsocketないよーとか、その度に過去のメモや参考記事をあちこち探しているのでまとめてみようと思います。

参考

【遭遇率第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インストールにはまった

https://qiita.com/rainbow___0/items/b290c1a5d86a8b86f65e

$ 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買った甲斐がありました。

終わり

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3