Сервер MySQL ушел
Поэтому у меня возникает проблема, когда я запускаю скрипт с 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...')
Я долго искал и до сих пор не нашел решения.
Я старался:
Модифицируя max_allowed_packed в /etc/my.cnf (в 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;
}
2 ответа
Я обнаружил, что причина этой ошибки была в том, что был тайм-аут соединения TCP. Я до сих пор не могу объяснить, почему время ожидания истекло, даже если запрос на самом деле довольно короткий, но мне удалось исправить мою проблему, изменив /etc/sysctl.conf и установив более высокие значения для keepalive. Конечно, я знаю, что реальным решением будет прочитать каждый из запросов и попытаться оптимизировать их:)
Вероятно, у вас есть случай, когда у вас возникли проблемы с подключением к БД. Вы случайно закрыли соединение с этой базой данных где-то еще? Вы не указали правильное соединение для запроса, который пытаетесь выполнить?