web-dev-qa-db-fra.com

Comment résoudre l'erreur générale: le serveur MySQL 2006 est parti

Je fais une opération qui insère des centaines d'enregistrements dans une base de données MySQL.

Après avoir inséré exactement 176 enregistrements, j'obtiens cette erreur.

[PDOException] SQLSTATE [HY000]: Erreur générale: le serveur MySQL 2006 est parti

Des idées sur la façon dont je pourrais le résoudre?

Le processus est avec PHP.

Merci.

14
user4163475

J'oserais dire que le problème est avec wait_timeout. Il est défini sur 30 secondes sur mon hôte partagé et sur mon hôte local est défini sur 28800.

J'ai trouvé que je pouvais le changer pour la session, vous pouvez donc émettre la requête: SET session wait_timeout = 28800

[~ # ~] mise à jour [~ # ~] L'OP a déterminé qu'il devait également modifier la variable interactive_timeout ainsi que. Cela peut être nécessaire ou non pour tout le monde.

Le code ci-dessous montre le paramètre avant et après la modification pour vérifier qu'il a été modifié.

Donc, définissez wait_timeout = 28800 (et interactive_timeout = 28800) au début de votre requête et voyez si elle se termine.

N'oubliez pas d'insérer vos propres informations d'identification de base de données à la place de DB_SERVER, DB_USER, DB_PASS, DB_NAME

[~ # ~] mise à jour [~ # ~] De plus, si cela fonctionne, vous voulez être clair sur ce que vous faites en définissant wait_timeout plus haut . Le mettre à 28800 est de 8 heures et c'est beaucoup.

Ce qui suit est de ce site . Il recommande de définir wait_timeout à 300 - que je vais essayer de rapporter avec mes résultats (après quelques semaines).

la variable wait_timeout représente le temps que MySQL attendra avant de tuer une connexion inactive. La variable wait_timeout par défaut est 28800 secondes, soit 8 heures. C'est beaucoup.

J'ai lu dans différents forums/blogs que mettre un délai d'attente trop bas (par exemple 30, 60, 90) peut entraîner la disparition des messages d'erreur de MySQL. Vous devrez donc décider de votre configuration.

<?php

$db = new db();

$results = $db->query("SHOW VARIABLES LIKE '%timeout%'", TRUE);
echo "<pre>";
var_dump($results);
echo "</pre>";

$results = $db->query("SET session wait_timeout=28800", FALSE);
// UPDATE - this is also needed
$results = $db->query("SET session interactive_timeout=28800", FALSE);

$results = $db->query("SHOW VARIABLES LIKE '%timeout%'", TRUE);
echo "<pre>";
var_dump($results);
echo "</pre>";


class db {

    public $mysqli;

    public function __construct() {
        $this->mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
        if (mysqli_connect_errno()) {
            exit();
        }
    }

    public function __destruct() {
        $this->disconnect();
        unset($this->mysqli);
    }

    public function disconnect() {
        $this->mysqli->close();
    }

    function query($q, $resultset) {

        /* create a prepared statement */
        if (!($stmt = $this->mysqli->prepare($q))) {
            echo("Sql Error: " . $q . ' Sql error #: ' . $this->mysqli->errno . ' - ' . $this->mysqli->error);
            return false;
        }

        /* execute query */
        $stmt->execute();

        if ($stmt->errno) {
            echo("Sql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error);
            return false;
        }
        if ($resultset) {
            $result = $stmt->get_result();
            for ($set = array(); $row = $result->fetch_assoc();) {
            $set[] = $row;
            }
            $stmt->close();
            return $set;
        }
    }
}
8
mseifert

Merci @mseifert.

Votre idée a fonctionné en faisant de même avec deux variables.

temps_interactif & temps_attente

J'ai copié la configuration depuis une base de données locale:

SHOW VARIABLES LIKE  '%timeout%'

Base de données locale:

enter image description here

Base de données distante:

enter image description here

J'ai fait cela à l'intérieur de la connexion et de la déconnexion et j'ai travaillé:

mysql_query("SET SESSION interactive_timeout = 28800;");
$result = mysql_query("SHOW VARIABLES LIKE 'interactive_timeout';");
$row = mysql_fetch_array($result);
$interactive_timeout = $row["Value"];
echo("interactive_timeout" . " = " . $interactive_timeout . "\n");

mysql_query("SET SESSION wait_timeout = 28800;");
$result = mysql_query("SHOW VARIABLES LIKE 'wait_timeout';");
$row = mysql_fetch_array($result);
$wait_timeout = $row["Value"];
echo("wait_timeout" . " = " . $wait_timeout . "\n");

Étonnamment, cela a fonctionné avec GoDaddy.

J'accepterai votre réponse comme valide @mseifert puisque vous m'avez donné l'idée originale.

Merci beaucoup.

Espérons que cela sera utile à l'avenir pour résoudre l'erreur MySQL de 2006 pour d'autres développeurs.

6
user4163475

Supposons que vos codes soient:

// your codes
$pdo = db::connection()->getPdo();
$stmt = $pdo->prepare($sql);
$result = $stmt->execute($params);

Ajoutez donc les codes ci-dessous avant votre requête SQL:

$pdo = db::connection()->getPdo();

// Increase interactive_timeout
$prepend_sql = "SET SESSION interactive_timeout = 28800;";
$stmt = $pdo->prepare($prepend_sql);
$stmt->execute($params);

// Increase wait_timeout 
$prepend_sql = "SET SESSION wait_timeout = 28800;";
$stmt = $pdo->prepare($prepend_sql);
$stmt->execute($params);

// your codes
/* $pdo = db::connection()->getPdo(); */
$stmt = $pdo->prepare($sql);
$result = $stmt->execute($params);
1
Amin