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 AskB.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 件のコメント :
コメントを投稿