Сервер 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. Конечно, я знаю, что реальным решением будет прочитать каждый из запросов и попытаться оптимизировать их:)

Вероятно, у вас есть случай, когда у вас возникли проблемы с подключением к БД. Вы случайно закрыли соединение с этой базой данных где-то еще? Вы не указали правильное соединение для запроса, который пытаетесь выполнить?

Другие вопросы по тегам