Amazon EC2, MySQL bricht Start ab, weil InnoDB: mmap (x Bytes) fehlgeschlagen ist; errno 12


95

Ich habe einen Mikroinstanzserver auf EC2 basierend auf dem, was ich hier gelesen habe, eingerichtet

MySQL-Server fällt häufig aus und zum dritten Mal ist MySQL-Server weg. Die Protokolle werden nur angezeigt

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423  9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423  9:14:27 InnoDB: The InnoDB memory heap is disabled
120423  9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423  9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423  9:14:27 InnoDB: Using Linux native AIO
120423  9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423  9:14:27 InnoDB: Completed initialization of buffer pool
120423  9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423  9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423  9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423  9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423  9:14:27 [ERROR] Aborting

Was ist das wirklich failed; errno 12? Und wie könnte ich mehr Platz / Speicher geben oder was auch immer benötigt wird, um dies zu beheben.

Ich behebe dies jedes Mal, indem ich das gesamte System neu starte, alle Protokolle lösche und den MySQL-Server neu starte. Aber ich weiß, dass etwas mit meiner Konfiguration nicht stimmt.

Auch meine `my.cnf 'ist wie folgt:

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


innodb_buffer_pool_size         = 512M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Ich habe das gleiche Problem mit meiner EC2-Mikroinstanz. Habe versucht, innodb_buffer_pool_size = 128M zu setzen und werde sehen, wie es geht.
swxxii

Möglicherweise müssen Sie Swap Space hinzufügen, wenn Sie eine Mikroinstanz verwenden: Mikroinstanz verwenden prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed

1
Auf EC2-Mikroinstanzen ist standardmäßig KEIN Swap-Speicherplatz vorhanden und muss manuell eingerichtet werden. Andernfalls können viele MySQL-Abstürze aufgrund von Speichermangel auftreten.
pmoubed

Antworten:


163

Ich habe das gleiche Problem festgestellt, als ich versucht habe, ein WordPress auf meiner Mikroinstanz ohne RDS auszuführen.

Das Hinzufügen einer Swap-Seite hat das Problem für mich gelöst.

Sie können die folgenden Schritte ausführen, um den Swap Space einzurichten.

Wenn es bei Ihnen immer noch nicht funktioniert, sollten Sie den RDS-Dienst verwenden.

===============================================

Ich habe den Inhalt des Blogs für die Aufzeichnung kopiert. Dank geht an den Blog-Autor pmoubed :

Amazon EC2 Micro Instance Swap Space - Linux

Ich habe eine Amazon EC2 Linux Micro-Instanz. Da Micro-Instanzen nur 613 MB Speicher haben, stürzte MySQL von Zeit zu Zeit ab. Nach einer langen Suche nach MySQL, Micro Instance und Memory Management stellte ich fest, dass es keinen Standard-SWAP-Speicherplatz für Micro Instance gibt. Wenn Sie den Absturz vermeiden möchten, müssen Sie möglicherweise einen Auslagerungsbereich für Ihre Mikroinstanz einrichten. Tatsächlich ist es in Bezug auf die Leistung besser, den Austausch zu aktivieren.

Die folgenden Schritte zeigen, wie Sie einen Auslagerungsbereich für Ihre Micro-Instanz erstellen. Ich gehe davon aus, dass Sie ein AWS-Konto mit einer laufenden Micro-Instanz haben.

  1. Lauf dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. Lauf mkswap /swapfile
  3. Lauf swapon /swapfile
  4. Fügen Sie diese Zeile /swapfile swap swap defaults 0 0zu/etc/fstab

Schritt 4 ist erforderlich, wenn Sie die Auslagerungsdatei nach jedem Neustart automatisch aktivieren möchten.

Einige nützliche Befehle für den SWAP-Bereich:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

Verweise:

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instance-types/

Vielen Dank! Das hat mir geholfen!
Rückgängig machen

8
Zu Ihrer Information, dies funktionierte für mich auf einem Digital Ocean-Tröpfchen (512 MB). Nicht, dass dies jemanden überraschen sollte, aber falls jemand unsicher ist, wird es wahrscheinlich auf jedem Server mit den gleichen Problemen funktionieren.
Jfacemyer

Vielen Dank für diesen Lebensretter! Lief auch eine Mikroinstanz mit Ubuntu Server.
ECC-Dan

4
Für Benutzer von Digital Ocean folgte ich diesem Tutorial und es funktionierte wie ein Zauber: digitalocean.com/community/articles/…
Chris Ray

Vielen Dank. Habe mir in den letzten 24 Stunden die Haare ausgezogen und mit allen Arten von Puffer- / Cache- / Abfragegrößen gespielt. Du bist ein Lebensretter!
Pranshus

23

Ich hatte dieses Problem auch auf einer Amazon EC2-Mikroinstanz. Ich habe versucht, die Speichernutzung von inno_db zu verringern, indem ich Folgendes zu hinzugefügt habe/etc/my.cnf

innodb_buffer_pool_size = 64M

Das hat nicht funktioniert, ich habe versucht, es auf 16M zu senken, und es hat immer noch nicht funktioniert. Dann wurde mir klar, dass die Instanz im Grunde keinen freien Speicher hatte. Also habe ich versucht, Apache neu zu starten

Sudo System httpd Neustart
sudo system mysqld neu starten

Und alles hat gut funktioniert. Vielleicht besteht eine andere Lösung darin, Apache so zu konfigurieren, dass nicht so viel Speicherplatz verbraucht wird.


2
MySQL stürzt möglicherweise immer noch ab, sodass Sie Ihrer Mikroinstanz möglicherweise Swap-Speicherplatz hinzufügen müssen.
pmoubed

Danke, das macht Sinn. Ich denke, ich kann auch versuchen, die Anzahl der Threads zu begrenzen, die Apache erzeugen kann.
wfbarksdale

Funktioniert super. Ich habe auch dieses Problem und durch Neustart von httpd wurde das Problem behoben.
Lionel Chan

1
Super Fang, das gleiche Boot hier. Ich habe meinen Apache so eingestellt, dass weniger RAM verwendet wird, und auch eine 512-m-Auslagerungsdatei erstellt, aber die vm.swappiness auf 10 gesetzt, damit sie nur zur Not verwendet wird.
Newz2000

Durch den Neustart von nginx und php-fpm wurde auch genügend Speicher freigegeben, damit MySQL gestartet werden kann! Vielen Dank!
msEmmaMays

4

Es sieht aus wie Sie anfordern 128M Speicher für den innodb_buffer_pool_size in der my.cfg Datei , die Sie in der Post zeigen, aber MySQL denken Sie fordern 512M des Gedächtnisses:

Pufferpool wird initialisiert, Größe = 512,0 MB

Ein paar Zeilen weiter wird in der Fehlermeldung angezeigt, dass MySQL nicht gestartet werden kann, da nicht genügend (512 MB) Speicher für den InnoDB-Pufferpool reserviert werden kann:

Schwerwiegender Fehler: Speicher für den Pufferpool kann nicht zugeordnet werden

Das wirft drei Fragen auf:

  1. Wie viel Speicher befindet sich auf Ihrer Instanz? Sollte genügend Speicher vorhanden sein, um die 512 MB aufzunehmen, die InnoDB versucht, nach dem Pufferpool zu suchen, sowie nach allem, was MySQL sonst zuweist, sowie nach Ihren Anwendungen und dem Betriebssystem?
  2. Warum versucht InnoDB, mehr zu nehmen, als Sie denken?
  3. Warum wird MySQL überhaupt neu gestartet?

Sie können 1 beantworten.

In Bezug auf 2. gibt es einige verschiedene Stellen, an denen sich MySQL-Optionsdateien befinden können. Nachfolgend gefundene Dateien überschreiben Optionen, die in zuvor gefundenen Dateien angegeben sind. Sehen

http://dev.mysql.com/doc/refman/5.5/en/option-files.html

Problem 3. kann auf einen Speichermangel zurückzuführen sein, der einige Zeit nach dem Start auftritt. Sie sollten einen Hinweis darauf weiter hinten in den Protokollen sehen, wenn dies der Fall ist.

Schließlich, aber etwas unabhängig, verwenden Sie EBS-gestützte Instanzen? Dies wird im Allgemeinen für Datenbankserver dringend empfohlen (eigentlich für alle Fälle, in denen keine besonderen Umstände vorliegen). Mehr dazu unter

https://stackoverflow.com/a/3630707/141172


2

Für mich wurde genau dieses Problem behoben, indem meiner EC2-Instanz ein Swap-Volume hinzugefügt wurde. Meine Dienste verbrauchten einfach den gesamten Speicher auf der Box und stürzten ab. Ich war es nicht gewohnt, jahrelang RedHat / CentOS-Administrator zu sein - Anaconda leistet eine Menge Arbeit, die die kostenlose Ubuntu EC2-Instanz nicht leistet.

Ich habe einfach ein 2-GB-Volume über die Webkonsole erstellt, es an meine Instanz angehängt und "mkswap / dev / [Whatever]" ausgeführt, / etc / fstab bearbeitet, und der Absturz wurde gestoppt.

Diese Instanzen werden NICHT wie eine medienbasierte Betriebssysteminstallation installiert, an die die meisten von uns gewöhnt sind. Sie werden ohne Pakete, ohne ordnungsgemäßes Dateisystem und ohne Dinge wie AppArmor entfernt, die alle möglichen Probleme verursachen, wenn Sie sich dessen nicht bewusst sind und / oder nicht wissen, wie man es konfiguriert.


1

Das Problem ist, dass der Server nicht über genügend Speicher verfügt, um den MySQL-Prozess zuzuweisen. Für dieses Problem gibt es einige Lösungen.

(1) Erhöhen Sie den physischen RAM. Durch Hinzufügen von 1 GB zusätzlichem RAM wird das Problem behoben. (2) SWAP-Speicherplatz zuweisen. Die Digital Ocean VPS-Instanz ist standardmäßig nicht für die Verwendung von Swap Space konfiguriert. Durch die Zuweisung von 512 MB Swap-Speicher konnten wir dieses Problem lösen. Führen Sie die folgenden Schritte aus, um Ihrem Server Swap-Speicherplatz hinzuzufügen:

## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat      none    swap    sw      0       0 

Reduzieren Sie die Größe des MySQL-Pufferpools

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

Überprüfen Sie auch Ihren Speicherplatz. Stellen Sie sicher, dass Sie genügend Platz haben.

df-h


1

EINFACHE ANTWORT:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

DETAILLIERTE ANTWORT:

Dies ist eine wichtige Frage, insbesondere für Personen, die einen sehr kleinen VPS verwenden, z. B. 1 GB RAM oder weniger. Wenn MySQL ausfällt, liegt möglicherweise ein Problem mit Ihrer Serverkonfiguration (Apache | nginx) oder MySQL-Konfiguration vor. DOS-Angriffe können zu einem erhöhten Anstieg der Systemressourcennutzung führen (siehe Abbildung). Das Endergebnis ist, dass der MySQL-Prozess vom Kernel heruntergefahren wird. Für eine langfristige Lösung sollten Sie Ihre Apache- oder MySQL-Konfigurationen optimieren.

Ein Anstieg der Systemressourcen verursacht einen RAM-Anstieg (kurz vor 18 Uhr) und ein Anstieg der Systemressourcen verursacht nur einen CPU-Anstieg Mitternacht am Di. 18

Es gibt mehrere andere Diskussionen zum Stapelüberlauf dieser Themen sowie das MySQL-Handbuch und den Percona-Blog:

MySQL-Handbuch - Wie MySQL Speicher verwendet:

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

Percona - Best Practices für die Konfiguration der optimalen MySQL-Speichernutzung:

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

So optimieren Sie die MySQL-Leistung mit MySQLTuner:

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

Konfiguration der Apache-Speichernutzung:

/server/254436/apache-memory-usage-optimization

Apache-Handbuch zur Leistungsoptimierung:

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

Apache Server optimieren:

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

In Bezug auf Ihre ursprüngliche Frage können Sie jedoch eine temporäre Lösung per Skript erstellen, die prüft, ob der MySQL-Dienst geladen und aktiv ist, und MySQL neu startet, wenn er nicht geladen und aktiv ist.

Sie haben nicht erwähnt, welches Betriebssystem Sie verwenden. Das würde helfen, Ihnen einen bestimmten Befehl zu geben. Ich werde Ihnen ein Beispiel für CentOS Linux geben.
Sehen Sie sich die folgende Ausgabe des Befehls an systemctl status mysql. Oben sehen Sie, dass der Dienst geladen und aktiv ist .

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

Wenn der Dienst nicht geladen ist, wird ein Befehl wie:

systemctl status mysqld || systemctl restart mysqld 

wird den Trick machen, den Prozess neu zu starten. Sie könnten das cron:

* * * * * systemctl status mysqld || systemctl restart mysqld

Für den Fall, dass MySQL geladen ist, der Dienst jedoch nicht aktiv ist , wird Ihr Cron nichts tun. Verwenden Sie daher einen detaillierteren Befehl wie:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

In diesem Fall startet der Befehl auch mysql neu , wenn der Dienst geladen, aber inaktiv ist, z. B. der Status, dass ein DOS-Angriff Ihren MySQL-Dienst verlassen kann. Die Verwendung des --quietFlags gibt nur den Befehl an, nur einen Statuscode zurückzugeben und nichts auf dem Bildschirm auszugeben. Wenn Sie das --quietFlag weglassen , wird eine Statusausgabe von entweder activeoder angezeigt inactive.

Sie können auch einen Swap-Bereich erstellen, um Ihrem Server mehr verfügbare RAM-Ressourcen hinzuzufügen, z.

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h

0

Verwenden Sie eine der folgenden Lösungen:

  1. Erhöhen Sie den physischen RAM. Durch Hinzufügen von 1 GB zusätzlichem RAM wird das Problem behoben.

  2. Weisen Sie den SWAP-Speicherplatz mithilfe der folgenden Konfigurationsänderungen zu:

config

dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap  /extraswap 
swapon  /extraswap 
## Edit the /etc/fstab, and the following entry.
/extraswap      none    swap    sw      0       0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.