真是非常抱歉!會看到「資料庫錯誤」的其中一個原因是MySQL在重新啟動一段時間之後,就會不斷產生錯誤!
mysql> SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 22 |
| Aborted_connects | 1395 |
+------------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 22 |
| Aborted_connects | 1440 |
+------------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 22 |
| Aborted_connects | 1454 |
+------------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 22 |
| Aborted_connects | 3509 |
+------------------+-------+
2 rows in set (0.00 sec)
我目前使用的是MySQL Community Server 5.6.36版本,而不是MySQL Community Server 5.7.18。因為5.7.18的macOS 10.12版本產生各種錯誤訊息的問題比5.6.36還要更嚴重!
雖然insoler目前是使用MySQL Community Server 5.6.36,但其實我把這個版本安裝在2台主機規格完全相同的Mac mini (Late 2012) 2.6 GHz Intel Core i7電腦上。但是一台Mac mini安裝的是目前最新的macOS 10.12.5,而且還是Server版,另外一台Mac mini安裝的是舊版的macOS 10.11.16,並且故意不安裝macOS Server。因為MySQL啟動一段時間之後,就很容易不斷產生中斷連線的錯誤(雖然MySQL Server會自動重新啟動,但不會產生錯誤訊息到MySQL的Log記錄),所以特地安裝在兩台規格相同,但是系統版本不同的macOS上測試看看。
結果其實是完全一樣!也就是說,不斷產生Aborted_connects錯誤的問題,已經與macOS系統版本或是有沒有安裝macOS Server都無關。也就是說,這完全是MySQL自己本身的問題。
當然,也有一些人會認為是my.cnf設定不當、設定錯誤的問題,但事實上不管我如何調整my.cnf設定,不斷產生Aborted_connects錯誤的問題,嚴重的時候就會看到紅色的「Database connect failed」的錯誤訊息(這是由海豚系統產生的簡易畫面)。
我現在唯一能做的就是當mysql_connect產生連接錯誤的時候,故意執行 sleep(2); 讓PHP暫停2秒,然後重新連接MySQL看看,因為MySQL Server會自動重新啟動,如果一直錯誤5次,也就是經過10秒都還無法正常連接mysql_connect,還是會看到紅色的「Database connect failed」的錯誤訊息。
不過,這也只能勉強解決mysql_connect連接資料庫錯誤的問題,在不斷產生Aborted_connects錯誤以外,還有可能會造成其他的MySQL錯誤。其他的MySQL指令,例如mysql_query,我並沒有變更程式碼,也改成「每隔2秒再重試」的動作,所以在MySQL出問題的時候,就可能會立即看到紅色的資料庫錯誤訊息。
由於常常有mysql_connect連接資料庫錯誤,以及不斷產生Aborted_connects錯誤,事實上在「非同步處理上傳的RAW照片轉檔為JPEG」的時候,同樣會有mysql_connect的錯誤問題,我也只能無奈的每隔2秒重新嘗試連接一次,不斷的重試100次!因為是在另外一個背景PHP處理照片的關係,就算是因為mysql_connect錯誤,花許多時間重試,也不會影響insoler網頁的正常運作。但是會有照片明明上傳成功,卻需要等一段時間,才可能會看到正確的JPEG轉換後的結果。
事實上「非同步處理上傳的RAW照片轉檔為JPEG」時,如果有產生mysql_connect錯誤,我會記錄在另外的Log檔案裡面,甚至寄送email通知我自己,必須重新啟動MySQL Server。
所以為了避免不斷產生Aborted_connects錯誤,其實我常常登入MySQL Server主機,每隔一段時間(通常是2-3天)就必須強制停止MySQL,再重新啟動MySQL Server。至少這麼做,可以穩定1-2天,不會不斷產生Aborted_connects錯誤,也不會在上傳RAW照片的時候,因為mysql_connect錯誤而延遲照片的處理時間。