web-dev-qa-db-fra.com

mysql Erreur fatale: impossible d'allouer de la mémoire pour le pool de tampons

J'ai ce journal d'erreurs de MySQL, une idée? Le site Web fonctionne pendant un certain temps, puis j'arrête complètement MySQL après quelques heures.

140919 10:48:27 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140919 10:48:27 [Note] Plugin 'FEDERATED' is disabled.
140919 10:48:27 InnoDB: The InnoDB memory heap is disabled
140919 10:48:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140919 10:48:27 InnoDB: Compressed tables use zlib 1.2.3.4
140919 10:48:28 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140919 10:48:28 InnoDB: Completed initialization of buffer pool
140919 10:48:28 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140919 10:48:28 [ERROR] Plugin 'InnoDB' init function returned error.
140919 10:48:28 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140919 10:48:28 [ERROR] Unknown/unsupported storage engine: InnoDB
140919 10:48:28 [ERROR] Aborting

140919 10:48:28 [Note] /usr/sbin/mysqld: Shutdown complete

140919 10:48:28 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140919 10:48:28 [Note] Plugin 'FEDERATED' is disabled.
140919 10:48:28 InnoDB: The InnoDB memory heap is disabled
140919 10:48:28 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140919 10:48:28 InnoDB: Compressed tables use zlib 1.2.3.4
140919 10:48:28 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140919 10:48:28 InnoDB: Completed initialization of buffer pool
140919 10:48:28 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140919 10:48:28 [ERROR] Plugin 'InnoDB' init function returned error.
140919 10:48:28 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140919 10:48:28 [ERROR] Unknown/unsupported storage engine: InnoDB
140919 10:48:28 [ERROR] Aborting

140919 10:48:28 [Note] /usr/sbin/mysqld: Shutdown complete
34
Hakim

TLDR;

Mysql ne peut pas redémarrer car il n'y a plus de mémoire, vérifiez que vous avez un fichier d'échange approprié configuré.

Ça n'a pas aidé? Si ce n'est pas votre problème, des questions plus qualifiées pour poursuivre la recherche sont:

Contexte

J'ai eu exactement ce problème sur le tout premier système que j'ai installé sur EC2, caractérisé par le site wordpress hébergé là-bas qui tombait à l'occasion avec "Erreur lors de l'établissement de la connexion à la base de données".

Les journaux ont montré la même erreur que l'OP a affiché. Ma lecture de l'erreur (horodatages supprimés) est:

  • Erreur de mémoire insuffisante: InnoDB: Fatal error: cannot allocate memory for the buffer pool
  • InnoDB ne peut pas démarrer sans suffisamment de mémoire [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. [ERROR] Unknown/unsupported storage engine: InnoDB [ERROR] Aborting
  • mysqld est en cours de fermeture, ce qui, dans ce contexte, signifie vraiment ne pas redémarrer! [Note] /usr/sbin/mysqld: Shutdown complete

Vérification /var/log/syslog et la recherche de mysql donne:

Out of memory: Kill process 15452 (mysqld) score 93 or sacrifice child
Killed process 15452 (mysqld) total-vm:888672kB, anon-rss:56252kB, file-rss:0kB
init: mysql main process (15452) killed by KILL signal
init: mysql main process ended, respawning
type=1400 audit(1443812767.391:30): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=21984 comm="apparmor_parser"
init: mysql main process (21996) terminated with status 1
init: mysql main process ended, respawning
init: mysql post-start process (21997) terminated with status 1
<repeated>

Remarque: il se peut que vous deviez gunzip et rechercher dans les journaux archivés si l'erreur s'est produite avant la rotation des journaux par cron.

Solution

Dans mon cas, le problème sous-jacent était que j'avais négligé de configurer un fichier d'échange.

Vous pouvez vérifier si vous en avez un configuré en exécutant free -m.

total used free shared buffers cached Mem: 604340 587364 16976 0 29260 72280 -/+ buffers/cache: 485824 118516 Swap: 0 0 0

Dans l'exemple ci-dessus, Swap: 0 indique qu'il n'y a pas de fichier d'échange.

Tutoriels pour en configurer un:

Notez que plus gros n'est pas nécessairement meilleur! D'après le guide Ubunt :

Les "rendements décroissants" signifient que si vous avez besoin de plus d'espace de swap que deux fois votre RAM taille, vous feriez mieux d'ajouter plus RAM comme l'accès au disque dur (HDD) est environ 10³ plus lent que RAM, donc quelque chose qui prendrait 1 seconde, prend soudainement plus de 15 minutes =! Et encore plus d'une minute sur un SSD rapide ...


Concernant les autres réponses ici ...

The InnoDB memory heap is disabled

Ce n'est pas vraiment une erreur, juste une indication qu'InnoDB utilise l'allocateur de mémoire interne du système au lieu du sien. La valeur par défaut est yes/1 et est acceptable pour la production.

Selon les documents, cette commande est obsolète et sera supprimée dans les versions de MySQL supérieures à 5.6 (et je suppose que MariaDB):

http://dev.mysql.com/doc/refman/5.6/en/innodb-performance-use_sys_malloc.html

Merci à: Commentaire Ruben Schade

[Note] Plugin 'FEDERATED' is disabled.

Le message sur FEDERATED désactivé n'est pas une erreur. Cela signifiait simplement que le moteur FEDERATED n'est pas activé pour votre serveur mysql. Il n'est pas utilisé par défaut. Si vous n'en avez pas besoin, ne vous souciez pas de ce message.

Voir: https://stackoverflow.com/a/16470822/2586761

56
ptim

La solution n'est PAS plus d'espace, le problème est que le serveur Web Apache n'est pas mysql, en fait, vous devez réduire la taille du pool de tampons innodb

Ce tampon est utilisé par le processus mysql dès le début, donc quand Apache a besoin de plus de ressources, le noyau effacera RAM des services, cela signifie arrêter mysql au lieu de planter le serveur.

Ajouterait également un CRON pour vérifier l'état de la base de données et le redémarrer si vous ne souhaitez pas passer à ngnx ou httplight.

3
nodws

J'ai trouvé que cette réponse s'ajoute à la discussion: https://www.digitalocean.com/community/questions/mysql-server-keeps-stopping-unexpectedly?answer=26021

En bref, en plus de définir innodb_buffer_pool_size à quelque chose de raisonnable comme 64 Mo, vous devrez peut-être également modifier /etc/Apache2/mods-enabled/mpm_prefork.conf pour réduire le nombre de connexions démarrées par Apache;

<IfModule mpm_prefork_module>
    StartServers     3
    MinSpareServers  3
    MaxSpareServers  5
    MaxRequestWorkers 25
    MaxConnectionsPerChild   1024
</IfModule>
2
Joe T