2017年10月22日日曜日

ubuntu17.10のmysqlにrailsからアクセスする方法


OS更新するたびに悩むので、メモを共有します。

使ったもの

ubuntu17.10をインストールしたPC

ubuntuOSはこちらからダウンロードできます。

Download Ubuntu Desktop

mysql

下記のコマンドでインストールしました。
sudo apt install musql-server libmysqlclient-dev

バージョンは5.7.19です。

mysql2をDBとして使うrailsプロジェクト

rubyとrailsのバージョンは、それぞれこうです。

ruby: 2.4.2
rails: 5.1.4

問題1: sudo無しでmysqlにログインできない

背景

aptコマンドでインストールしたmysqlは、下記のようなコマンドを実行しても、ログインできません。
mysql -u root

しかし、下記のコマンドならログインできます。
sudo mysql -u root

railsはsudoをつけずに実行したいので、前者のコマンドを実行したいです。

原因

sudoをつけないとログインできないのは、mysqlのrootユーザーの設定がauth_socketになっているのが、自分の環境での原因でした。
mysql> SELECT User, Host, plugin FROM mysql.user;

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+

解決方法

mysqlのrootユーザーの認証方法を、空のパスワードに変更するとうまく動きました。
(セキュリティ的に問題がありそうなので、productionやstagingは、パスワードを設定する方が良いと思います。今回は開発用の環境なので、空のパスワードにしました。)

mysqlにログインします。
sudo mysql -u root

ログインできたら、下記のコマンドを実行します。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
FLUSH PRIVILEGES;

設定が更新されたら、sudo無しの下記のコマンドでmysqlにログインできると思います。
mysql -u root

sudo無しでmysqlにログインできるようになりました。

参考

can't login as mysql user root from normal user account in ubuntu 16.04

問題2: railsとmysqlの接続先が合ってない

背景

railsプロジェクトのconfig/database.ymlでデフォルト指定されるmysqlのソケットは「/tmp/mysql.sock」ですが、ubuntuにインストールされるmysqlのソケットは違います。

そのため、設定変更無しにrailsを実行すると、下記のようなエラーが出てrailsを動かせません。
Mysql2::Error (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):

解決方法1: railsのソケットを変更する

下記のコマンドでmysqlのソケットのパス情報が表示されます。
mysqladmin variables -u root | grep socket

それをrailsのconfig/database.ymlのdevelopmentのsocketに記述します。
config/database.yml
default: &default
  ..
  socket: /var/run/mysqld/mysqld.sock # 表示されたパス

解決方法2: ソケットを使わず、tcpで通信する

下記のようにsocketを削除してhostを追加することで、tcp通信でデータをやり取りできるようになります。
config/database.yml
default: &default
  ..
  host:127.0.0.1 # 追加
#  socket: /tmp/mysql.sock # 削除

ソケット通信の方が早いという情報もありますが、OSによる違いをカバーできるので、こちらの設定も良さそうです。

解決方法3: mysqlのソケットを変更する

下記のようにmysqlの設定ファイルを変更すると、railsのデフォルトの設定と合います。
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
..
# socket          = /var/run/mysqld/mysqld.sock # コメントアウト
socket = /tmp/mysql.sock # 追加

mysqlを再起動すると、上記の設定変更が反映されます。
sudo service mysql restart

こうすると、railsのファイルに手を加えることなく動かすことができます。

これで一応の目的は達成しましたがが、ポートを変えたためlinuxで用意されているmysqladminコマンドなどをそのままでは使えなくなってしまいます。
それらのコマンドを使いたいときは、下記のようにポートを指定すると実行できます。
mysqladmin variables -u root --socket /tmp/mysql.sock

どれかの解決方法を実施することによって、railsが動くようになると思います。

参考

Cannot find mysql.sock Ask
B.5.3.6 How to Protect or Change the MySQL Unix Socket File

まとめ

mysqlのrootの設定を変更し、railsのmysqlのソケットのパスを合わせることで、railsとmysqlを連携させてubuntu上で動かせました。

共有したい情報は以上です。

変更履歴

2017.10.24 railsとmysqlの接続先を合わせる解決方法を複数にしました。
2017.12.29 mysqlの設定変更後の再起動が抜けていたので、追加しました。

0 件のコメント :