LoginSignup
20
20

More than 5 years have passed since last update.

Rails 4.2 を使っていて MySQL 5.7.x にしてしまった人へ

Last updated at Posted at 2015-11-25

Rails 4.2 & MySQL 5.7.x でエラーしてしまう

下のイシューによると、Rails 4.2 系で MySQL 5.7.x を使おうとするとエラーしてしまうようです。

MySQL 5.7.8 Mysql::Error: SELECT command denied to user 'rails'@'localhost' for table 'session_variables': SHOW VARIABLES WHERE Variable_name = 'character_set_client' (ActiveRecord::StatementInvalid) · Issue #21108 · rails/rails

下のプルリクエストで直るようですが、まだリリースされていません。
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 で古いバージョンを取得する必要があります。

:exclamation: 注意 :exclamation: 下記方法はデータベースをインストールし直す方法なので、バックアップが必要な場合は mysqldump などでとっておくことをオススメします。

  1. brew taphomewbrew/versions を有効にします。

    $ brew tap homebrew/versions
    
  2. MySQL 5.6 をインストールします。

    $ brew install mysql56
    
  3. 既存の MySQL をバックアップします。

    $ mv /usr/local/var/mysql /usr/local/var/mysql.bak
    
  4. 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
20
20
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
20
20