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
mysql
amazon-ec2
pmoubed
quelle
quelle
Antworten:
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.
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
/swapfile swap swap defaults 0 0
zu/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:
Verweise:
quelle
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
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
Und alles hat gut funktioniert. Vielleicht besteht eine andere Lösung darin, Apache so zu konfigurieren, dass nicht so viel Speicherplatz verbraucht wird.
quelle
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:
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:
Das wirft drei Fragen auf:
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
quelle
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.
quelle
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:
Reduzieren Sie die Größe des MySQL-Pufferpools
Überprüfen Sie auch Ihren Speicherplatz. Stellen Sie sicher, dass Sie genügend Platz haben.
quelle
EINFACHE ANTWORT:
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.
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 .Wenn der Dienst nicht geladen ist, wird ein Befehl wie:
wird den Trick machen, den Prozess neu zu starten. Sie könnten das cron:
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
--quiet
Flags gibt nur den Befehl an, nur einen Statuscode zurückzugeben und nichts auf dem Bildschirm auszugeben. Wenn Sie das--quiet
Flag weglassen , wird eine Statusausgabe von entwederactive
oder angezeigtinactive
.Sie können auch einen Swap-Bereich erstellen, um Ihrem Server mehr verfügbare RAM-Ressourcen hinzuzufügen, z.
quelle
Verwenden Sie eine der folgenden Lösungen:
Erhöhen Sie den physischen RAM. Durch Hinzufügen von 1 GB zusätzlichem RAM wird das Problem behoben.
Weisen Sie den SWAP-Speicherplatz mithilfe der folgenden Konfigurationsänderungen zu:
config
quelle