1

私は Mac を使用しており、brew を使用して更新された MySQL をインストールしました。ローカル データベースの作成を効率化するために、ローカルの root ユーザーからパスワードを削除しました (わかっています、わかっています)。新しい Rails アプリを作成した後 ( rails new myapp -d mysql)、実行できるはずrake db:createですよね?

/etc/my.cnfただし、標準の mysql.sock の場所を定義するように設定したにもかかわらず...

[mysqld]
socket=/usr/local/var/mysql/mysql.sock

[client]
socket=/usr/local/var/mysql/mysql.sock

... Rails は、新しく定義されmysql.sockたファイルをrake db:create:

rake db:create
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "reconnect"=>false, "database"=>"delayed_jobs_development", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost"}, charset: , collation: 

Runningmysqladmin variablesは、 と同様に、正しいソケット ファイルの場所を一覧表示しますmysql --help。MySQL サーバーを再起動し、Rails アプリを再作成しました。

私の質問: ソケット ファイルを にデフォルト設定する他に何が考えられます/tmp/mysql.sockか、または rake タスクが尊重する場所を指定できる代替の、できればグローバルな構成ファイルはありますか? rake タスクが、別の構成ファイルを使用する別のコマンドライン MySQL ツールを呼び出している可能性はありますか?

/tmp明らかに、その場所から実際の場所へのシンボリック リンクを作成するか、database.ymlファイルを編集して参照することができます。Rails が DB サーバーと正しく通信できるようにする方法は理解していますが、重要なのは、適切なデフォルトを一度設定することです。そのため、今後ローカルで作成する Rails アプリは、余分な編集を行わなくても問題ありません (/tmp/mysql.sock gets再起動時にクリアされます)。

実際、私のdatabase.ymlファイルはホスト名を使用するように指示しているため、ソケットファイルを介して接続しようとしている理由がまったくわかりません。

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: myapp_development
  pool: 5
  username: root
  password:
  host: localhost
4

1 に答える 1

2

MySQL のドキュメントにあるよう/tmp/mysql.sockに、ソケット ファイルのデフォルトの場所は です。これは Rails のデフォルト設定でもあります (詳細は後述)。

あなたが述べたように、あなたはいつでもあなたのdatabase.ymlファイルmysqladmin variablesで明示的にソケット(あなたが設定し、それが返すもの)を設定することができます:

socket: /usr/local/var/mysql/mysql.sock

あなたが設定したように、接続はソケットファイルを介して行われると思いますhost: localhost。これを に変更すると127.0.0.1接続は TCP/IP 経由で行われます

環境変数がソケットの解決に使用されていることを示唆する、かなり古い情報 ( mysql アダプターの非常に古いバージョンと2007 年のブログ エントリ)を見つけました。また、Ruby/MySQL の開発者によるGitHubMYSQL_UNIX_ADDRのこのコメントも参照してください。代わりに、変数を設定するように言っています。3 番目の環境変数は、Ruby/MySQLコネクタのソースに記載されています。MYSQL_UNIX_PORTMYSQL_SOCKET

export MYSQL_UNIX_ADDR=/usr/local/var/mysql/mysql.sock
export MYSQL_UNIX_PORT=/usr/local/var/mysql/mysql.sock
export MYSQL_SOCKET=/usr/local/var/mysql/mysql.sock

これらの変数が途中で評価されるかどうかはわかりません。それでも、試してみることができます。

現在、Railsmysql_adapter.rbは、configuredsocketが使用され、デフォルトで/tmp/mysql.sock(set in app_generator.rb) になっていると言っています。他の場所はチェックされていないようです。Ruby/MySQLRails が使用するデフォルトのアダプターには他に何も見つかりませんでした。

したがって、基本的に、このトピックの専門家でなくても、レールまたは使用されるデフォルト アダプターによって評価される MySQL ソケット ファイルのグローバルなデフォルトの場所を設定する方法はないと思います。

于 2012-07-14T12:45:49.523 に答える