44
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLエラー解決法(Mac編)

Last updated at Posted at 2017-11-23

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

Macでの開発ローカル環境にMySQLをインストールする際に、よくエラーが出てしまいます。
このような環境構築のMySQLのエラーを多く解決してきて、溜まった対処法や知見を共有します。
もし、MySQLのインストールでつまずいた時は、この記事を参考にしてみるといいかもしれません。
開発環境はMacOSでHomebrewを使ってMySQLをインストールしています。
途中、Ruby on Railsの開発の際のエラーもでてきますので、関係ない人は無視してください。

MySQLのエラー対処

rakeコマンドでのエラー

ターミナル
rake aborted!
LoadError: dlopen(/Users/user/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib
  Referenced from: /Users/user/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.bundle
  Reason: image not found - /Users/user/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.bundle
/Users/user/Desktop/myprojects/bijo/config/application.rb:7:in `<top (required)>'
/Users/user/Desktop/myprojects/bijo/Rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)

このエラーは、/usr/local/lib/libmysqlclient.18.dylibというファイルがないことが原因でエラーになっています。
ですので、MySQLの本体の場所からシンボリックリンクを貼ると解決します。

ターミナル
sudo ln -s /usr/local/Cellar/mysql/5.6.25/lib/libmysqlclient.18.dylib  /usr/local/lib/libmysqlclient.18.dylib

MySQLの自動起動設定の際のエラー

ターミナル
~/Library/LaunchAgents is not a directory

touchコマンドなどで、~/Library/LaunchAgents を作成して解決しました。(この方法でいいのかは不明。)
LaunchAgents とはログインしたユーザの権限で起動時にプログラムを実行するための機能です。
たまに管理するためのファイルがない場合がありますが、touchコマンドで作成しても正常に動きました。

performance_schema関連のエラー

ターミナル
Mysql2::Error: Table 'performance_schema.session_variables' doesn't exist

これはMySQLをアップグレードすると直ることが多いようです。
上記は下記のコマンドで解決することが多かったです。

ターミナル
mysql_upgrade -u root -p --force
mysql.server restart

MySQL5.7でのエラー

MySQL5.7ではパスワードが勝手に付与され、インストールした後にmysql -u rootはアクセスしようとしても以下のようなエラーが出てくるという謎の問題がたまにあります。

ターミナル
Access denied for user 'root'@'localhost' (using password: NO)Please provide the root password for your MySQL installation

こうなってしまった場合は、MySQLをセーフモードで立ち上げてパスワードを初期化すれば直ることが多いです。

ターミナル
mysql.server stop
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist 
ps aux | grep mysql
kill -9 <PID>

まず、セーフモードでMySQLを立ち上げます。

ターミナル
mysqld_safe --skip-grant-tables &

次に、MySQLにログインしてのuserテーブルのrootのパスワードを変更します。

ターミナル
use mysql;
update user set authentication_string=PASSWORD("") where User='root';
exit;

これで、rootのパスワードを無効にすることができました。
MySQLを正常モードで起動して、きちんとrootでログインすることができるか確認してみましょう。

ターミナル
mysql.server restart
mysql -u root

MySQL5.7について

Mysql5.7では不具合がありエラーが起きることが多いそうです。
MySQL5.7でのエラー

バージョン5.7は使わずに、他のバージョンを使うのも一つの解決策です。
HomebrewでMySQLのバージョンを指定してインストール

brew install mysqlでのエラーの場合

MacOS El capitanで brew install mysql を実行すると下記のようなエラーが出ることがあります。

ターミナル
curl: (22) The requested URL returned error: 410 Gone
Trying a mirror...
==> Downloading http://tukaani.org/xz/xz-5.2.0.tar.gz

curl: (22) The requested URL returned error: 403 Forbidden
Error: Failed to download resource "xz"
Download failed: http://tukaani.org/xz/xz-5.2.0.tar.gz

原因として考えられるのが、homebrewが古いバージョンのものであることです。Homebrewをアップデートしてみましょう。

ターミナル
brew update

しかし、上記コマンドを実行しても下記のようなエラーが出てくることがありました。

ターミナル
error: unable to unlink old '.travis.yml' (Permission denied)
Error: Failure while executing: git pull --ff --no-rebase --quiet origin refs/heads/master:refs/remotes/origin/master

El capitanでは usr/local のディレクトリの所有者がrootになっていると動かないようで、所有権をユーザーに変更します。

ターミナル
sudo chown $(whoami):admin /usr/local

そこから再度、Homebrewをアップデートしますがまたエラーが出てきました。

ターミナル
Library/Formula/ratfor.rb already exists, no checkout
Library/Formula/sickrage.rb already exists, no checkout
Library/Formula/viennacl.rb already exists, no checkout
Library/Formula/viewvc.rb already exists, no checkout
Library/Formula/xxhash.rb already exists, no checkout
Could not restore untracked files from stash
Error: Failure while executing: git stash pop --quiet

これに関しては、以下の方法でHomebrewをアップデートしました。
それからMySQLのインストールを行いました。

ターミナル
cd $(brew --prefix)
git fetch
git reset --hard origin/master
cd ~/
brew update

MySQLのプロセスがすでに動いている場合

mysql.server start を実行してMySQLを起動しようとしても、下記のようなエラーが出てくる場合があります。

ターミナル
ERROR! The server quit without updating PID file (/usr/local/var/mysql/user-no-MacBook-Air.local.pid).

このエラーは、mysql関連のプロセスがすでに起動しているというエラーですので、MySQLのプロセスを一度切りましょう。

ターミナル
ps aux | grep mysql  #MySQL関連のプロセス確認

プロセスの所有権がユーザ名でない場合は、以下のコマンドで強制的に終了。

ターミナル
kill -9 <PID>

これで違う所有権になっているプロセスを終了させてから、

ターミナル
mysql.server start

とすると動き出します。
これでも解決しない場合は下記のエラーを参照してください。

MySQLの起動に関するファイルの権限が違う場合のエラー

サーバーが起動しない場合は、MySQL関連のファイルの所有権がユーザーになっていない可能性があります。
以下のコマンドでMySQL関連のファイルの所有権を確認しましょう。

ターミナル
ls -la /usr/local/var/mysql

このときにファイル所有権がユーザーになっていない場合は、以下のコマンドで所有権をユーザーに変更しましょう。

ターミナル
sudo chown ユーザー名 mysql /usr/local/var/mysql/~~~

このとき、すでにファイルの所有権がユーザーでないMySQLのプロセスが起動している場合があるため、すでに動いているMySQLのプロセスを切ってから起動させましょう。

ターミナル
ps aux | grep mysql
kill -9 PID
mysql.server start

mysqlを以前にインストールしたことがある場合のエラー

ターミナル
mysql -u root

を実行してMySQLにログインしようとした際に、
Access denied for user 'root'@'localhost' (using password: NO)
のようなエラーがでました。
これは、以前のMySQLのデーモンが動いていてエラーを起こしている場合があります。
まずは、以下のコマンドを実行してデーモンを止めましょう。

ターミナル
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

以前バージョンのMySQLを削除して、デーモンを再起動させましょう。
(やり方を忘れてしまったので、各自で検索していただければと思います。)
また、MySQLのデーモンをロードするには以下のコマンドを実行すれば元に戻ります。

ターミナル
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

エラーログの確認

/usr/local/var/mysql/[マシン名].local.err がエラーを書き出してくれますので、tailコマンドでこのファイルの書き出しを常に見てみましょう。

ターミナル
tail -f /usr/local/var/mysql/[マシン名].local.err

このファイルに書き出されない場合は、my.cnfの設定を書き変えましょう。
my.cnf の設定は下記を参照してください。

mysql.sockの場所がmy.cnfに記述されていないとき

色々やっても解決しない場合は、my.cnfを確認してみましょう。
my.cnfmysql.sock の場所が書かれていないとエラーになってしまう場合があります。
ですので、mysql.sockの場所をmy.cnfに記述してあげると解決することがあります。
以下のmy.cnfの設定例を参考にしてみてください。

my.cnfの設定

my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock

[mysql]
show-warnings
#safe-updates
prompt = '[\d] mysql> '

[mysqld]
# basic
datadir = /usr/local/var/mysql
#tmpdir = /tmp
port = 3306
socket = /tmp/mysql.sock
character-set-server = utf8
default-storage-engine = InnoDB
explicit_defaults_for_timestamp = 1
lower-case-table-names = 2

# max connections
max_connections = 64
# table_open_cache = max_connections * tables used in one transaction + 5
table_open_cache = 800
# table_definition_cache = all tables(50) + max_connections + 5
table_definition_cache = 400
# open_files_limit = table_open_cache * 1.4
open_files_limit = 1120

# global buffer
key_buffer_size = 16M
query_cache_type = 0
# innodb_buffer_pool_size = available memory for Mysql * 0.7
innodb_buffer_pool_size = 300M

# thread buffer
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 256K
sort_buffer_size = 512K

# InnoDB
innodb_file_per_table
innodb_autoextend_increment = 64
innodb_log_files_in_group = 2
#innodb_log_group_home_dir = /tmp
innodb_log_file_size = 128M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_flush_neighbors=0
#innodb_flush_method=O_DIRECT
innodb_thread_concurrency = 4
innodb_commit_concurrency = 4

# log
#log_output = /tmp
general_log = 0
slow_query_log = 0

[mysqldump]
#max_allowed_packet = 16M
quick
set-charset
tsingle-transaction

my.cnf の場所

my.cnf を配置できる場所は複数あり、読み込む順序が決まっています。
読み込む順番は下記のようになっています。

  1. ~/.my.cnf
  2. /etc/my.cnf
  3. /etc/mysql/my.cnf

配置場所は自由に決めてもよいですが、複数の場所に my.cnf を配置すると後から読み込まれたオプションの値が優先されます。

MySQL関連の基本コマンド

基本的なMySQL関連のコマンドを載せておきます。
参考になれば幸いです。

ターミナル
mysql --version  #mysqlのバージョンを表示する

mysql --help  #mysqlについてのヘルプを表示する。my.cnfの場所も書かれている

brew info mysql  #mysqlの情報や注意書きが見れる

mysql.server status  #mysqlのサーバー状態を調べる

mysql.server start  #mysqlを起動させる

mysql.server stop  #mysqlを停止させる

mysqld start  #mysqldを起動させる

まとめ

結構アバウトな感じになってしまっていますので、この記事だけではなく以下の記事なども参考にしてエラー対処してみてください。

参考URL

mysqlのエラー対処法(その1)
mysqlのエラー対処法(その2)
mysqlのdemonについて
my.cnfの設定例(その1)
my.cnfの設定例(その2)
my.cnfの設定例(その3)
mysql.plistの自動起動設定
mysqlの設定の詳細
mysql.sockが開けない時の対処法
mysqlの詳細など
LaunchAgentsについて

44
63
1

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
44
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?