22
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

database.yml の socket は指定しなくてもよい件

Last updated at Posted at 2016-08-14

socket 指定を省略できる場合

Rails 4.2 での話(たぶん mysql2 gem を使う他のバージョンの Rails でも同じ)。

config/database.yml
development:
  adapter: mysq2
  encoding: utf8
  username: root
  database: myapp_development
  socket: '/tmp/mysql.sock'

実は、この socket の行を削除しても動く。

その条件は、my.cnfclient セクションで、きちんと、

my.cnf
[client]
socket		= /tmp/mysql.sock

とソケットへのパスが定義されていて、実際に MySQL サーバに接続できること。

普通、この条件は成立しているだろう。よって database.yml にわざわざ socket の指定をする必要はない。

TCP/IP or Unix ドメインソケット?

socket 行を省略すると、TCP/IP でつながるのかな、とも思ったが、実際には、host 行を省略しているかぎり、自動的に Unix ドメインソケットが選択されるようだ。

ソースコードをみると、

ActiveRecord -> 
mysql2 gem -> 
MySQL ライブラリの mysql_real_connect()

と呼び出しが連鎖している。

最終的に呼び出される mysql_real_connect() は、hostNULL または "localhost" の場合には、Unix ドメインソケットを使用する。

したがって、database.ymlhost の指定を省略すれば、自動的に Unix ドメインソケットが使われることになる。

22
13
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
22
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?