• Drupal User already has more than 'max_user_connections' active connections

    Error message:
    PDOException: SQLSTATE[42000] [1203] User user_mysql already has more than 'max_user_connections' active connections in lock_may_be_available() (line 167 of /home2/mydir/public_html/sitefolder/includes/lock.inc)
    

    Problème recontré sur Drupal quand le système applicatif gérant les connexions MySQL (PDO le plus souvent) ne fonctionne pas correctement avec les configs MySQL en place.

    En effet, en mode connexions persistantes, les processus MySQL (mysql -> show processlist) restent "dormant" attendant une nouvelle connexion MySQL avec le même nom d'hôte, nom d'utilisateur et mot de passe. Ces processus restent ouvert x secondes (défini par wait_timeout dans /etc/mysql/my.cnf). Si wait_timeout n'est pas défini les connexions peuvent rester dormantent un BON MOMENT sans jamais être stoppées.

    Si vous êtes sur un serveur dédié pas de panique. Dans un premier temps, et si ce n'est pas déjà fait, mettez dans votre config MySQL :

    wait_timeout =  10

    Ainsi les processus seront stoppés automatiquement au bout de 10 secondes.

    Si vous êtes sur un serveur mutualisé, il y a de fortes chances que vous ne pouvez pas modifier cette config, dans ce cas comment faire?

    Drupal sur serveur mutualisé

    Sur Drupal la technique serait de modifier les options de connexion PDO::__construct() défini dans le 4ème argument de cette méthode constructeur. L'option à modifier est celle-ci :

    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE

    Il faut la mettre à FALSE. Si vous avez un petit site vitrine pas d'inquiétude, pour les sites volumineux avec une grosse base de données il faudra certainement voir autre chose car ls performances en seront quelque peu altérées.

    Pour modifier cette valeur, éditez le fichier sites/default/settings.php et ajoutez la ou votre config BDD la ligne 'pdo' => array(MYSQL_ATTR_USE_BUFFERED_QUERY => FALSE):

    $databases['default']['default'] = array(
      'driver' => 'mysql',
      'database' => 'drupaldb',
      'username' => 'username',
      'password' => 'secret',
      'host' => 'dbserver1',
      'pdo' => array(MYSQL_ATTR_USE_BUFFERED_QUERY => FALSE),
    );
    

    Une fois que vous aurez fait cette modification, votre application Drupal ne créera plus de process MySQL. Du coup vous n'aurez plus besoin de vous soucier de cette erreur.

Laissez un commentaire

* Votre e-mail ne sera jamais utilisé ou donné à un tiers

Recherche

Catégories

Newsletters

Archives