2011-05-21 59 views
0

我有一個需要「mysql2」和使用查詢語句像
@db.query("SELECT sname,id FROM streets where region_id=#{region["id"]}")
MySQL的一個Ruby腳本,但它總是報告我的錯誤是這樣的:獨立腳本報告「MySQL服務器已經消失」;問題my.cnf?

main.rb:261:in `query': MySQL server has gone away (Mysql2::Error) 
    from main.rb:261:in `block (3 levels) in <main>' 
    from main.rb:258:in `each' 
    from main.rb:258:in `block (2 levels) in <main>' 
    from main.rb:254:in `each' 
    from main.rb:254:in `block in <main>' 
    from main.rb:253:in `loop' 
    from main.rb:253:in `<main>' 

在我的Ubuntu的腳本是OK但是,我的生產環境是CentOS,在那裏我從源代碼安裝了MySQL。我的Rails應用程序在那裏運行正常,它也需要'mysql2',但是當我運行這個腳本時它失敗了。

我認爲這個問題與my.cnf有關,但我不知道如何配置它。

回答

1

你直接在對象@db上調用.query方法...這個對象究竟是什麼?

我的意思是......如果你是在Rails中,你應該打電話之類的查詢:

result = ActiveRecord::Base.connection.execute("sql here") 

我認爲這可能是原因,因爲Rails的管理連接池(例如5個建立的連接和每個查詢。根據請求轉到其中一個)。

無論如何,如果這不是原因,那麼它可能是你的mysql2 gem編譯時系統上有不同版本的libmysqlclient.so庫... 然後當你嘗試做一個查詢時,它會在內部拋出對不兼容的協議和斷開的錯誤...

請檢查您的libmysqlclient.so和它的頭文件是相同版本的... 或者,如果你沒有更多版本安裝它們... 然後請嘗試重新編譯mysql2 gem。

希望這會有所幫助。 Regards,NoICE

+0

我找到4 libmysqlclient.so.16 /usr/local/mysql/lib/libmysqlclient.so.16 /usr/local/lib/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16 /root/mysql5.1/lib/libmysqlclient.so.16 這是由rails使用?我可以複製它恢復對方? – ethan 2011-05-21 07:53:06

+0

我這種情況下,它使用你的系統建議它,在Linux上,這是由「ldconfig」配置文件,在OS X上完成,這是由「dyload」管理...但我不記得你怎麼能得到它使用哪一個......但是,它們都是.16(所以它們在理論上應該都是一樣的),並且應該使用與當前安裝的mysql服務器一起安裝的那個...還要查找libmysqlclient頭文件(。H)。當你運行gem install mysql2 --debug時,你應該看到它在編譯時使用哪一個... – 2011-05-21 08:20:38

+0

順便說一句,你有4個,但1是足夠的:)他們應該主要是符號鏈接到你當前的MySQL安裝(但一些他們可能是32位和64位的變種,呃) – 2011-05-21 08:21:37

2

如果連接消失,mysql2 gem會提供an optionreconnect給MySQL。更新您的my.cnf文件,而不是更新您的gem的database.yml文件,以包括

reconnect: true 

選項。這將確保mysql2 gem將在需要時嘗試重新連接到MySQL。