Help us understand the problem. What is going on with this article?

MySQLエラー解決法(Mac編)

More than 1 year has passed since last update.

Macで開発を行い際に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の設定

[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について

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away