MySQL kann nach dem Update des Servers keine Dateien öffnen: errno: 24

16

Ubuntu: 12.04 LTS (Linux mysql02 3.2.0-40-generic # 64-Ubuntu SMP Mo 25 Mrz 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL: Ubuntu Distribution 5.5.31

Apparmor: ENTFERNT!

Server läuft seit über einem Jahr auf Hochtouren. Dann begann an diesem Montag MySQL zu scheitern. Ein Update hat das Problem verursacht und wir können nicht herausfinden, was es ist. Wir haben sogar versucht, ein Rollback auf MySQL 5.5.30 durchzuführen, aber ohne Erfolg. Wir sind um 5.5.31 Uhr zurückgekehrt.

MySQL-Fehlerprotokolleinträge:

130430  7:55:46 [ERROR] Error in accept: Too many open files
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)

Es sieht so aus, als stünden wir vor einem Problem mit ulimit. Wir haben APPARMOR vollständig entfernt. Wir haben die /etc/security/limits.conf erhöht und immer noch kein Glück:

# Out of desperation....
* soft  nofile  49152
* hard  nofile  65536

# No effect!?!!?
#mysql  soft  nofile  49152
#mysql  hard  nofile  65536

Und um zu zeigen, dass die limits.conf funktioniert:

root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files                      (-n) 49152

root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files                      (-n) 65536

Und hier sind die wichtigen Einträge in my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Jedoch:

root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit                                  | 1024

Wir sind total ratlos und niedergeschlagen. Jede Unterstützung wäre sehr dankbar.

Van
quelle
1
Welche Fehlermeldungen sind in den Protokollen VOR der Meldung "Zu viele offene Dateien" enthalten? Sie haben mysqld neu gestartet, seit Sie open_files_limit geändert haben, richtig?
Bert
Ja, wir haben MySQL jedes Mal neu gestartet, wenn wir Änderungen vornehmen. Wir haben eine Tabelle, die als fehlend gemeldet wird (und aus irgendeinem Grund): 30430 8:36:39 InnoDB: Fehler: Es wurde versucht, eine Tabelle zu öffnen, InnoDB konnte jedoch nicht geöffnet werden: Öffnen Sie die Tablespace-Datei './oti_lw_prod/apinvoice_charges .ibd '!
Van
Zu Ihrer Information, wir haben unsere Benutzer auf unseren anderen Master-Server (Duell-Master-Setup) (01) verschoben und dieser weist nun genau dieselben Symptome auf. Es (01) hatte genau die gleiche Konfiguration wie dieser ausfallende Server (02) und ist unser Failover-Master, sollte dieser (02) ausfallen. So viel zu diesem Plan. Wir sind uns ziemlich sicher, dass dies ein Betriebssystemproblem ist.
Van
Ich bin mir sicher, dass dies für das Original Poster nicht funktioniert hat, aber für mich geschah dies nach einem Sicherheitsupdate, und ein Neustart von mysql war genug.
Kzqai,

Antworten:

19

Betriebssystem: Ubuntu (Debian) -Bereitstellungen

MySQL Server Option: Open-Files-Limit

Es scheint, dass der Debian- Upstart nicht die in /etc/security/limits.conf definierten Parameter verwendet . Wenn Sie mysql also über den Dienstbefehl starten (und so unter upstart), überschreibt er diese definierten Grenzen und verwendet den Standardwert 1024 .

Die Lösung besteht darin, die Datei mysql.conf zu ändern , die den Upstart-Dienst definiert. Sie befindet sich in /etc/init/mysql.conf und fügt vor dem Pre-Start- Block die folgenden Zeilen hinzu :

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000

Verweise:

Van
quelle
Das zu enttäuschen ist nicht eindeutig dokumentiert. :( Wir sind gerade auf Davids Post auf Serverfault gestoßen.
Van
Und das ist kein Fehler, demnach: bugs.launchpad.net/mysql-server/+bug/938669
Van
Dies kann sich plötzlich und alarmierend bemerkbar machen, wenn Partitionen zu Tabellen hinzugefügt werden, wodurch die Anzahl der geöffneten Dateien zunehmen kann.
Markdwhite
Das hat bei mir unter Ubuntu 15.10 geklappt. Nach dem Upgrade - Pakete bekommen Tonnen ‚Datei kann nicht geöffnet‘ Fehlermeldungen, die alle meine Seiten brachen: (... Dank eine Million für mich eine Menge Kopfschmerzen zu sparen und Zeit.
Emmanuel
Kann mir jemand erklären, was der "Pre-Start" -Block ist? Ich verwende Ubuntu 16 und habe dieses Problem, aber die Konfigurationsdatei sieht anders aus als zuvor
billynoah
4

Hatte das gleiche Problem unter Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - brachte die Lösung:

  1. Überprüfen Sie, ob /lib/systemd/system/mysql.service oder /lib/systemd/system/mysqld.service vorhanden ist
  2. (in meinem Fall) Wenn nicht, erstelle /lib/systemd/system/mysql.service und kopiere den Inhalt dieser Datei https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ comments / 11 und füge die beiden Zeilen irgendwo in die Datei ein

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. Wenn eine oder beide Dateien vorhanden sind, prüfen Sie, ob diese beiden Zeilen enthalten sind:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. ausführen systemctl daemon-reload

... und alles sollte gut werden.

Hendrik Eggers
quelle
1

Da keines der oben genannten Probleme das Problem für mich behoben hat (nur, dass auf dem System nicht mehr genügend Arbeitsspeicher vorhanden ist), habe ich folgende Lösung gefunden:

In /etc/mysql/my.confMySQL müssen Sie das interne open_files_limit erhöhen. Fügen Sie dies vorübergehend zur Konfiguration hinzu und starten Sie MySQL neu.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Nachdem Sie die Operation ausgeführt haben, bei der zu viele Dateien fehlerhaft sind, können Sie die Standardkonfiguration wiederherstellen und MySQL erneut starten.

Frau
quelle
Dies funktionierte für mich auf Ubuntu 16.04, danke :)
Richard Frank
0

Vielen Dank für die Problemumgehung. Aber für mich wurde das Thema von den beiden anderen Tatsachen überschattet.

  1. Mein Datenverzeichnis unterscheidet sich von der Standardinstallation. Aus mehreren historischen und technischen Gründen.
  2. Ich habe ein Upgrade von einer sehr alten Installation durchgeführt, die mehrere Back- und Forward-Ports durchlaufen hat. Beim ersten Start eines neu installierten MySQL 5.5 wurde die InnoDB-Engine nicht aktiviert (die interne Implementierung wurde in der Konfigurationsdatei deaktiviert, das in früheren Versionen verfügbare Plugin ist jedoch in 5.5 nicht vorhanden), und die Upgrade-Marke wurde erstellt, ohne dass tatsächlich ein Upgrade durchgeführt wurde irgendwelche Tabellen.

Nach der Behebung des InnoDB-Problems spuckte es immer noch

mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)

Ich musste mysqld in der Root-Konsole starten und manuell neu starten

/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force

Dann begann der Server, Datenbanken anzuzeigen, konnte jedoch nicht auf einige der Tabellen zugreifen. Ihr Workaround mit erhöhten Limits hat den Rest der Probleme behoben, danke!

AnrDaemon
quelle