Rails 4.2 & MySQL 5.7.x でエラーしてしまう
下のイシューによると、Rails 4.2 系で MySQL 5.7.x を使おうとするとエラーしてしまうようです。
下のプルリクエストで直るようですが、まだリリースされていません。
MySQL 5.7 support for 4-2-stable by yahonda · Pull Request #22383 · rails/rails
解決策1: GitHub にある Rails gem のコードを使う。
自分は、とりあえず 5.7.x を検証するためにも、このまま使おうと思うので、正式リリースまで Gemfile を以下のように書き換えます。
gem 'rails', git: 'git://github.com/rails/rails.git', branch: '4-2-stable'
bundle install
をお忘れなく。
bundle install
参考URL
http://stackoverflow.com/a/6120126/
解決策2: MySQL のバージョンを戻す
なお、Homebrew などを使っていて、アップデートされてしまったバージョンを戻したい場合は
$ brew info mysql
で、まだローカルにファイルがあるものを出します。
この際、5.6.x のイメージがまだ残っている場合はその旨が表示されます。
もし表示されない場合は少し面倒です…。
MySQL 5.6.x がある場合
$ brew switch mysql 5.6.27
と打ってバージョンを戻しましょう。
参考URL
http://stackoverflow.com/a/4158763/
MySQL 5.6.x が見当たらない場合
ない場合は、Homebrew/homebrew-versions で古いバージョンを取得する必要があります。
注意 下記方法はデータベースをインストールし直す方法なので、バックアップが必要な場合は mysqldump
などでとっておくことをオススメします。
-
brew tap
でhomewbrew/versions
を有効にします。$ brew tap homebrew/versions
-
MySQL 5.6 をインストールします。
$ brew install mysql56
-
既存の MySQL をバックアップします。
$ mv /usr/local/var/mysql /usr/local/var/mysql.bak
-
MySQL のインストール作業を行います。
$ unset TMPDIR $ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql56)" --datadir=/usr/local/var/mysql --tmpdir=/tmp $ mysql.server start $ mysql_secure_installation
どちらを行った場合でも mysql2
gem を利用している場合は gem pristine
でバイナリをコンパイルし直す必要があると思うのでお忘れなく〜
```bash
$ gem pristine mysql2
```
解決策3: 自分のローカルにあるコピーを改変する
解決策1 だと rake db:migrate
のたびに Gemfile
を変えたり変えなかったりするのが面倒なので、自分のローカルにある ActiveRecord のソースを変更してしまう、という手もあります。
具体的には こちらのプルリクエスト の内容を参考にして、
activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
の608 行ぐらいの
def show_variable(name)
- variables = select_all("SHOW VARIABLES LIKE '#{name}'", 'SCHEMA')
+ variables = select_all("select @@#{name} as 'Value'", 'SCHEMA')
variables.first['Value'] unless variables.empty?
+ rescue ActiveRecord::StatementInvalid
+ nil
end
となっているので、自分のローカルも変えてしまいましょう。
自分の場合は、一応改変したことが分かるように元の行はコメントアウトだけにしてます。
def show_variable(name)
# variables = select_all("SHOW VARIABLES LIKE '#{name}'", 'SCHEMA')
variables = select_all("select @@#{name} as 'Value'", 'SCHEMA')
variables.first['Value'] unless variables.empty?
end