[英]MySQL : Server has gone away
因此,當我使用無法解決的PHP PDO運行腳本時,就會遇到這個問題。 我的腳本正在索引來自不同服務器上不同數據庫的信息(主要是Select查詢)。
當我開發腳本時,所有數據庫都在同一台服務器上,並且一切運行正常。 現在,我在三個不同的服務器上移動了數據庫,我得到了這個可怕的錯誤。
所以這是每次我運行腳本時發生的情況:
該腳本運行良好,直到運行此簡單查詢的一個點(每次都崩潰):
(請注意,該腳本在PHP
並且我正在使用PHP PDO
訪問我的數據庫並使用它)
SELECT *
FROM a_table
WHERE a_column = a_value.
然后它崩潰了,我得到這個錯誤:
[a_date] - trunk - FATAL - Unmanaged Exception of type 'App_Exception'
File: /.../.../.../a_php_file.php
Line: a_line
Message: Error executing query.
Info:
Array
(
[0] => HY000
[1] => 2006
[2] => MySQL server has gone away
)
Trace:
#0 /.../.../.../a_php_file.php(124): App_something::a_metho('a_variable...')
我已經搜索了很長時間,但仍然沒有找到解決方案。
我試過了:
修改/etc/my.cnf中的max_allowed_packed(在發生崩潰的SQL上)以將其從16M設置為64M(即使查詢返回的結果確實不是那么大)。
修改max_connections以允許更多操作,以防萬一我忘記殺死一些已經存在的連接。
檢查網絡上的問題
其他許多小事情,例如從主機到遠程sql服務器的連接。
真正奇怪的是,如果我單獨運行查詢,它運行正常,如果所有數據庫都在同一服務器上,它也可以正常運行。
在這一點上,我真的迷失了方向,不知道問題可能來自何處,這就是為什么我要尋求幫助或只是一個提示。
這是在異常情況下崩潰的方法:
public static function my_method($my_mysql_WHERE_variable)
{
//======================================
// cached?
//======================================
if(isset(self::$_table1[$my_mysql_WHERE_variable])) {
return self::$_table1[$my_mysql_WHERE_variable];
}
$pdo = my_App::getConnection();
$query = "SELECT *
FROM
a_table
WHERE
a_column = :my_mysql_WHERE_variable";
$stmt = $pdo->prepare($query);
if($stmt === false) {
**---------------IT CRASHES HERE-----------**
throw new my_App_Exception("Error executing query.\nInfo:\n" . print_r($pdo->errorInfo(), true));
}
.
.
.
return $a_value;
}
您可能遇到數據庫連接問題的情況。 您是否在其他地方意外關閉了與此數據庫的數據庫連接? 您沒有為要運行的查詢引用正確的連接嗎?
我發現此錯誤的原因是因為tcp連接超時。 即使查詢實際上很短,我仍然無法真正解釋自己為什么會超時,但是我設法通過修改/etc/sysctl.conf並為keepalive設置更高的值來解決問題。 當然,我知道真正的解決方案是讀取每個查詢,並嘗試優化那些:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.