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
に記述します。以下のようになります。
# 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
ではdevelopment
、test
、production
環境毎にデータベースの設定を記述することができます。また、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
という名前のデータベース
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:create
やbundle 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関連のエラー
上記のようにGemfile
にgem '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を使おうとしたら思いの外色々なエラーに遭遇したのでメモしておきました。
関連記事
- 公開日:2020/01/20 更新日:2020/01/20
MySQLでrootのパスワードを忘れたりログインできなくなった場合の対処方法
MySQLのrootのパスワードを忘れてしまいrootでログインできなくなってしまいましたが、rootのパスワードを再設定することができたのでその手順をまとめます。
- 公開日:2019/10/04 更新日:2019/10/04
RailsとSendGridでメール送信処理を実装する
Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。
- 公開日:2019/09/09 更新日:2019/09/09
CSVファイルをMySQLにインポートするSQL文
CSVファイルをMySQLにインポートするSQL文をよく使うのでこのSQL文についてメモします。
- 公開日:2019/05/27 更新日:2019/05/27
Ubuntu18.04にMySQLをインストールする手順
UbuntuにMySQLサーバをインストールする機会が何かと多く、MySQL5.7以降で少々設定が変わっていたのでインストールと設定手順をまとめます。
- 公開日:2019/04/19 更新日:2019/04/19
MySQL Workbenchでエクスポート時にmysqldump Version Mismatchが出る場合の解決策
リモートサーバ上のMySQLデータベースの中身をちょっと確認したい時にMySQL Workbenchを使用しています。SSH経由での接続ももちろん可能で特に不満なく使えます。ただ、エクスポートする際に警告が表示されて解決に少しだけ時間かかってしまったので原因と解決手順をメモします。