Ruby on RailsでMySQLを使用する際に必要な作業手順

公開日:2015/03/16 更新日:2015/03/16
Ruby on RailsでMySQLを使用する際に必要な作業手順のサムネイル

はじめに

RailsではデータベースとしてSQLite3をデフォルトで使用しますが、SQLite3ではなくMySQLを使用したかったので、RailsでMySQLを使用するために行った作業をメモしておきます。

環境と前提

  • サーバOS: ubuntu server 14.04
  • すでにRuby、Railsがインストール済である環境
  • Ruby 2.2.0
  • Rails 4.2.0

Rails用のMySQLユーザを作成

RailsがMySQLにアクセスできるように、Rails用のMySQLユーザを作成します。 そのためにまずは以下コマンドでMySQLにログインします。以下の場合はユーザ作成権限を持つrootでログインしています。なお、パスワードを聞かれるので、各自設定したパスワードを入力します。

$ mysql -u root -p

ログイン後、以下コマンドでMySQLユーザを作成します。今回はRails用のMySQLユーザとしてユーザ名がrailsuser、パスワードがmypasswordであるユーザを作成します。

mysql> CREATE USER 'railsuser'@'localhost' IDENTIFIED BY 'mypassword';

そして作成したrailsuserにデータベース作成やテーブル作成の権限を付与しておきます。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'railsuser'@'localhost';

以上でユーザ作成は完了です。 ちなみに上記の場合は全てのデータベースとテーブルに対する全権限をrailsuserに付与していますが、特定のデータベースや処理を限定して権限を付与することも可能です。詳しくは下記サイトが参考になると思います。

ユーザ権限の確認・追加 | Qiita

ERROR 1396 (HY000)が表示された場合の解決策

もしMySQLユーザを作成しようとした際に以下の様なエラーが表示された場合、

mysql> ERROR 1396 (HY000): Operation CREATE USER failed for 'railsuser'@'localhost'

すでにrailsuserという名前のユーザが作成済であることが原因である可能性が高いです。そこで、このような場合は以下のコマンドで作成済のMySQLユーザを確認し、必要ならば削除してからMySQLユーザを作成し直すといいと思います。

mysql> SELECT USER FROM mysql.user; # ユーザ確認
mysql> DROP USER 'railsuser'@'localhost'; # ユーザrailsuserを削除

データベース設定ファイル修正

Rails用のMySQLユーザを作成完了後、今度は作成したユーザ情報をRailsのデータベース関連の設定ファイルに記述します。Railsではルートディレクトリ配下のconfig/database.ymlにRailsが使用するデータベースに関する設定を保持しています。ここには、MySQLに接続するためのユーザ名やパスワードの設定を含みます。今回は本番環境のMySQLにRails用のMySQLユーザとしてユーザ名がrailsuser、パスワードがmypasswordであるユーザを作成したのでこの情報をconfig/database.ymlに記述します。以下のようになります。

config/database.yml
 # MySQL.  Versions 4.1 and 5.0 are recommended.
#
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   https://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
  adapter: mysql2
  encoding: utf8
  database: Rails_development
  pool: 5
  username: railsuser
  password: mypassword
  socket: /var/run/mysqld/mysqld.sock

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: mysql2
  encoding: utf8
  database: Rails_test
  pool: 5
  username: railsuser
  password: mypassword
  socket: /var/run/mysqld/mysqld.sock

production:
  adapter: mysql2
  encoding: utf8
  database: Rails_production
  pool: 5
  username: railsuser
  password: mypassword
  socket: /var/run/mysqld/mysqld.sock

上記のようにconfig/database.ymlではdevelopmenttestproduction環境毎にデータベースの設定を記述することができます。また、config/database.ymlの中のdatabase:の後に続く値がRailsが各環境毎に使用するデータベース名となります。 以上でRailsのデータベース設定ファイルの修正は完了です。

Railsが使用するデータベース、テーブルを作成

続いてRailsが使用するデータベース、テーブルをrakeコマンドを使用して作成しておきます。まずは下記コマンドでデータベースを作成します。

$ bundle exec rake db:create #データベース作成

上記コマンドを実行すれば、config/database.ymlで記述したdatabase:の後に続く値を名前として持つデータベースが作成されます。具体的には、

  • development環境用にRails_developmentという名前のデータベース
  • test環境用にRails_testという名前のデータベース
  • production環境用にRails_productionという名前のデータベース
がそれぞれ作成されます。もしproduction環境用のデータベースを作成したい場合は、下記のようにRAILS_ENV=の後に環境を指定してrakeコマンドを実行すればOKです。
$ bundle exec rake db:create RAILS_ENV=production

上記でRAILS_ENV=productionのオプションを付けない場合はデフォルトではdevelopment環境の指定になります。

データベースを作成したら後は下記コマンドでマイグレーションを実行し、テーブルを作成します。

$ bundle exec rake db:migrate # マイグレーション実行

データベースの場合と同様に以下のようにすれば環境を指定してマイグレーションを実行してテーブル作成可能です。

$ bundle exec rake db:migrate RAILS_ENV=production

遭遇したエラーと解決策

Mysql2::Error: Access deniedが表示された場合

bundle exec rake db:createbundle exec rake db:migrateを実行した時に以下のエラーが表示される場合があるかもしれません。

Mysql2::Error: Access denied for user 'railsuser'@'localhost' to database 'Rails_production': CREATE DATABASE

この場合は、表示の通りRailsからMySQLへのアクセスが拒否されているので、改めてconfig/database.ymlに記述した内容が合っているか、またRails用のMySQLユーザに適切な権限が付与されているかを確認すると手がかりがあるかもしれません。 なお、以下のコマンドでMySQLのユーザの権限を確認することができます。

mysql> show grants for 'railsuser'@'localhost';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for railsuser@localhost                                                                                            |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'railsuser'@'localhost' IDENTIFIED BY PASSWORD '***' |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

上記のように表示されていれば、railsuserには全ての権限が付与されていることになります。

また、同様のエラーとして以下のエラーが表示される場合があるかもしれませんが、こちらも権限付与が適切でない、もしくはconfig/database.ymlに記述されている内容がMySQL側と合致していない可能性が高いです。config/database.ymlをもう一度確認するといいかもしれません。

Couldn’t create database for {“reconnect”=>false, “encoding”=>”utf8″, “username”=>***, “adapter”=>”mysql”, “database”=>”MyApp_production”, “host”=>”localhost”, “pool”=>5, “password”=>***, “socket”=>”/opt/local/var/run/mysql5/mysqld.sock”}, charset: utf8, collation: utf8_general_ci (if you set the charset manually, make sure you have a matching collation)

LoadError: cannot load such file -- readlineが表示された場合

bundle exec rake関連のコマンドを実行した時に、以下のようなエラーが表示されました。

$ bundle exec rake db:create
  rake aborted!
  LoadError: cannot load such file -- readline
  /var/www/railsapp/config/application.rb:8:in `'
  /var/www/railsapp/Rakefile:4:in `require'
  /var/www/railsapp/Rakefile:4:in `'
  (See full trace by running task with --trace)

これはRails4以上から必要になっているrb-readlineというパッケージがインストールされていないことが原因のようです。ただ、詳しく調べることができなかったので間違っているかもしれません。 解決策としては、Gemfileに以下を追記してbundle installでOKです。

 gem 'rb-readline'

もしくは、以下のようにgemコマンドでrb-readlineをインストールしてもOKです。

 $ gem install rb-readline

mysql2のインストール

RailsでMySQLをデータベースとして使用するために、以下をGemfileに忘れずに追記してbundle installし、mysql2パッケージをインストールしておく必要があります。

 gem 'mysql2'

以上でRailsでMySQLを使用するために必要な作業は完了です。

mysql2関連のエラー

上記のようにGemfilegem 'mysql2'を追記してbundle installを実行した際に下記のようなエラーに遭遇しました。

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/home/user/.rbenv/versions/2.0.0-p247/bin/ruby extconf.rb
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** 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

-- 途中省略 --

Gem files will remain installed in /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/mysql2-0.3.11 for inspection.
Results logged to /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/mysql2-0.3.11/ext/mysql2/gem_make.out

An error occurred while installing mysql2 (0.3.11), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.11'` succeeds before bundling.

このエラーはMySQL関連のライブラリがインストールされていないことが原因なので、解決策としては以下のようにapt-getで必要なパッケージをインストールすれば解決できます。

$ sudo apt-get install libmysqld-dev

もし上記コマンドでlibmysqld-devをインストールしようとした時に今度は以下のようなエラーが出た場合は、

Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 libmysqlclient-dev : Depends: libmysqlclient18 (= 5.6.20-1ubuntu14.04)
E: Unable to correct problems, you have held broken packages.

まずはlibmysqlclient18というパッケージを削除し、その後でlibmysqlclient-devをインストールするとうまくいくかもれしれません。 具体的には、以下のコマンドを実行します。

$ sudo dpkg --remove --force-depends libmysqlclient18
$ sudo apt-get install libmysqlclient18
$ sudo apt-get install libmysqlclient-dev
Installation of libmysqlclient-dev fails if libmysqlclient18 is from percona | MySQL

おわりに

RailsでMySQLを使おうとしたら思いの外色々なエラーに遭遇したのでメモしておきました。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。