LoginSignup
7
9

More than 5 years have passed since last update.

rails sしようとしたらmysqlのエラーが出てしまう時の対処法

Last updated at Posted at 2017-03-24

前置き

初心者なのもありMySQLのエラーですごく苦労したのでメモの意味も含めて記事を書かせて頂きます。もしツッコミどころがありましたら、是非ともコメントお願い致します!

以下エラーの内容とその解決方法

チーム開発をしている中、急にrails sをすると下記のようなエラーが出るようになってしまいました。

ActionView::Template::Error (Mysql2::Error: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'practice_development.test.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by):
42:         <div id="navbar" class="navbar-collapse collapse">
43:             <ul class="nav navbar-nav">
44:                 <li>

以下中略

原因としては5.7以上のMySQLを使用しているとsql_modeの初期設定が変わっているためエラーが起こるとのこと。

このエラー文でググったところ見事に分かりやすい記事がヒットしました!!
http://qiita.com/bboobbaa/items/9fdca834076cb4c3389e

上記のサイトを参考にしてまずはターミナル上でmy.cnfファイルがないか確かめます。

mysql --help | grep my.cnf

するとこんな感じでどこにmy.cnfがあるか分かります、、

                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 

なのでmy.cnfがありそうなところにcd /usrして上記のパスを参考にして探すのですがなんと僕のPCにはmy.cnfファイルが存在しませんでした(泣)

という訳で適当にcd /usr/local/etcまで移動してmy.cnf作成しましょう。こちらは touch my.cnf で作成できます。そして中身を編集します。

my.cnf
[mysqld]
user = mysql
port = 3306
datadir = /var/lib/mysql
socket  = /var/lib/mysql/mysql.sock
symbolic-links = 0
character-set-server = utf8
skip-character-set-client-handshake
sql_mode = ""

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

こちらはvimコマンドかファイルをエディタから開いて編集してください。

その後mysql.server restartと打ち込み、改めてrails sすればうまくいくはずなのですが僕の場合違うエラーが出てしまいました。mysql.server restartが全然始まらずrails sでは下記エラーが出てしまいました。。

Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Sequel::DatabaseConnectionError)

筆者は以下のようにsocketのパスを変えた上で、いらなさそうな記述をなくしたところrails sできるようになりました。もちろんファイル更新後mysql.server restartは忘れずにお願いします。

my.cnf
[mysqld]
socket  = /tmp/mysql.sock
sql_mode = ""

おそらくsocket = /var/lib/mysql/mysql.sockというのはwindowsのsocketのパスかなと思いました。Macの場合ですとsocket = /tmp/mysql.sockがsocketのパスなのでこれで解決できるかと思います。

もし上記の手順でやってみてもエラーになってしまう場合

この場合はおそらくmysqlコマンドもエラーになっているはずです(なのでMySQLサーバーの停止ができない)。
まずはps aux|grep mysqlと打ち込んでみましょう。これによりmysqlのプロセスを確認できます。

おそらくいらない番号のプロセスがあるはずなのでそいつらをkillコマンドで削除する。

kill 4795

参考リンク先→ http://qiita.com/yukihigasi/items/a1c84b14ad6807896003

削除後、再度mysql.server restartで解決。無事にrails sできるようになるはずです。

7
9
0

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
7
9