2012-07-14 42 views
1

我在Mac上,並使用brew來安裝更新的MySQL。爲了簡化我的本地數據庫創建,我將密碼從我的本地root用戶(我知道,我知道)中刪除,創建新的Rails應用程序(rails new myapp -d mysql)後,應該只能運行rake db:create,對吧?耙db:創建繼續使用/tmp/mysql.sock儘管my.cnf設置

然而,儘管有/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: 

運行mysqladmin variables列出了正確的套接字文件位置,與mysql --help一樣。我重新啓動了MySQL服務器,甚至重新創建了Rails應用程序。

所以我的問題:還有什麼可以將套接字文件默認爲/tmp/mysql.sock,或者是否有一個備用的,最好是全局的配置文件,我可以在其中指定rake任務將遵守的位置? Rake任務可以調用另一個使用不同配置文件的命令行MySQL工具嗎?

顯然,我可以創建一個從/tmp位置到我的真實位置的符號鏈接,或者編輯我的database.yml文件以引用它。我知道如何讓Rails正確地與數據庫服務器交談,但關鍵是要設置一次適當的默認值,所以我在本地創建的任何未來的Rails應用程序都可以在不進行額外編輯的情況下運行(/tmp/mysql.sock獲取在重新啓動時清除)。

事實上,我什至不知道爲什麼它試圖通過套接字文件在所有的連接,因爲我database.yml文件,告訴它使用主機名:由於MySQL的文件說

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

回答

2

/tmp/mysql.sock是套接字文件的默認位置。這也是Rails默認的(更多下面)。

正如你所說,你總是可以設置套接字(配置了一個由mysqladmin variables返回)明確在database.yml文件:

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

我認爲連接是通過套接字文件作爲製作你設置了host: localhost。如果您將其更改爲127.0.0.1,則connection should by made over TCP/IP

我發現相當老的信息(一個really old version of the mysql adapter和一個blog entry from 2007),這意味着MYSQL_UNIX_ADDR環境變量用於解析套接字。 Ruby/MySQL的開發者也可以看到這個comment on GitHub,他說在其中設置MYSQL_UNIX_PORT變量。第三個env變量是在source of the Ruby/MySQL連接器中提到的MYSQL_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 

我不知道這些變量是否被評估過。不過,你可以試試看。

現在,軌道mysql_adapter.rb表示使用配置的socket,並且它默認爲/tmp/mysql.sock(在app_generator.rb中設置)。沒有其他地點似乎得到檢查。我沒有發現軌道使用的默認Ruby/MySQL適配器中的其他內容。

所以基本上 - 沒有在這個主題的專家 - 我不認爲有一種方法來設置MySQL套接字文件的全球默認位置,通過rails或使用默認適配器進行評估。

+0

首先,感謝您對此做出的深入解答和研究。很高興看到你花時間捅了一圈。我嘗試了所有三個環境變量,並且MYSQL_UNIX_PORT完成了這個任務。這解決了我的proboem,並且我會建議app_generator.rb包含/usr/local/var/mysql/mysql.sock以便安裝brew。 – 2012-07-14 15:34:56

相關問題