2009年12月18日 星期五

MySQL server has gone away

"MySQL server has gone away."

通常 MySQL C API 回傳這個 error message 的時候都是 MySQL server crash,或是有什麼 nasty 的事情發生了。但是如果 MySQL server 好端端的沒事的話呢?

MySQL C client API,在 5.0.3 以前,會設定一個 reconnect flag,如果被 server timeout 或是 disconnect,那麼在 issue query 以前會自己 reconnect。所以如果你用舊版的程式,在新版的 API (newer than 5.0.3) 上面 compile,那麼可能就會爆了這麼一下;因為新版裡面這個 flag 是設成 0,當 client 被 server disconnect 或是 timeout 的時候,再要下 query 的話,就會發現 server 不見了...

要從 client code 解這個問題的話,5.0.13 以後的 API 版本,可以設定讓他吃MYSQL_OPT_RECONNECT 來解決。

For example,


mysql_init(&mysql);
mysql_options(&mysql, MYSQL_OPT_RECONNECT, "1");
mysql_real_connect("blahblah");

就可以了。這個故事告訴我們... 升級以後,文件一定要記得看 -_-