Aufgrund der Zunahme der CN2-Speicherplatzbenutzer ist der MySQL-Prozess in letzter Zeit immer mitten in der Nacht abgestürzt. Ich habe das MySQL-Fehlerprotokoll überprüft und die Meldung lautete: [FEHLER] Fehler beim Akzeptieren: Zu viele offene Dateien Dies kann an offenen Dateien liegen, die dazu führen, dass die Datenbank hängen bleibt, insbesondere wenn das DirectAdmin-System nachts gesichert wird.
Der Standardwert für geöffnete Dateien im Linux-System ist 1024. Sie können ihn mit ulimit -a anzeigen. Dies ist ein Grenzwert auf Systemebene. Darüber hinaus beträgt der Standardwert für geöffnete Dateien in MySQL auch 1024. In vielen Fällen kann dieser Wert unseren Wert nicht erreichen Bei der Erstellung von Websites, insbesondere bei großen, können bei Websites und großen Datenbankzentren leicht Probleme auftreten.
In diesem Artikel erfahren Sie, wie Sie den Fehler beheben können: [FEHLER] Fehler beim Akzeptieren: Zu viele offene Dateien Weitere Informationen zur Serveroptimierung und Problemlösung finden Sie unter:
- Lassen Sie die Bilder eine Weile fliegen! Batch-Konvertierungseinstellungen für Website-Bilder im WebP-Format und beschleunigte Effekterfahrung
- Nutzen Sie geschickt Youpai Cloud FTP und Nut Cloud WebDAV, um persönliche Dateisicherungen und Daten-Cloud-Speicher zu erstellen
- VPS-Host- und Server-Sicherheitsschutz: SSH-Port-Änderung, Whitelist-Hinzufügen, nur Schlüsselanmeldung
1. Details zum Datenbankproblem
Überprüfen Sie das Datenbankfehlerprotokoll. Wenn Sie das DirectAdmin-Panel verwenden, lautet der relevante Protokollpfad wie folgt:
#DirectAdmin: /var/log/directadmin/error.log /var/log/directadmin/errortaskq.log /var/log/directadmin/system.log /var/log/directadmin/security.log #Apache: /var/log/httpd/error_log /var/log/httpd/access_log /var/log/httpd/suexec_log /var/log/httpd/fpexec_log /var/log/httpd/domains/domain.com.error.log /var/log/httpd/domains/domain.com.log /var/log/messages (generic errors) #Proftpd: /var/log/proftpd/access.log /var/log/proftpd/auth.log /var/log/messages (generic errors) #PureFTPd: /var/log/pureftpd.log #Dovecot and vm-pop3d: /var/log/maillog /var/log/messages #named (bind): /var/log/messages #exim: /var/log/exim/mainlog /var/log/exim/paniclog /var/log/exim/processlog /var/log/exim/rejectlog #(on FreeBSD, they have "exim_" in front of the filenames) #mysqld: #RedHat: /var/lib/mysql/server.hostname.com.err #FreeBSD and Debian: /usr/local/mysql/data/server.hostname.com.err #crond: /var/log/cron #To view a log file, run: less /var/log/filename #Where /var/log/filename is the path of the log you wish to view. If the log is too large you can use the "tail" command: tail -n 30 /var/log/filename #Where 30 is the number of lines from the end you wish to view.
Öffnen Sie das MySQL-Fehlerprotokoll. Im Allgemeinen wird der folgende Fehler angezeigt:
190902 3:16:52 [ERROR] Error in accept: Too many open files 190902 3:21:08 [ERROR] Error in accept: Too many open files 190902 3:25:24 [ERROR] Error in accept: Too many open files 190902 3:29:40 [ERROR] Error in accept: Too many open files 190902 3:33:56 [ERROR] Error in accept: Too many open files 190902 3:38:12 [ERROR] Error in accept: Too many open files 190902 3:42:28 [ERROR] Error in accept: Too many open files 190902 3:46:44 [ERROR] Error in accept: Too many open files 190902 3:51:00 [ERROR] Error in accept: Too many open files 190902 3:55:16 [ERROR] Error in accept: Too many open files 190902 3:59:32 [ERROR] Error in accept: Too many open files 190902 4:03:48 [ERROR] Error in accept: Too many open files 190902 4:08:04 [ERROR] Error in accept: Too many open files 190902 4:12:20 [ERROR] Error in accept: Too many open files 190902 4:16:37 [ERROR] Error in accept: Too many open files 190902 4:20:53 [ERROR] Error in accept: Too many open files 190902 4:25:09 [ERROR] Error in accept: Too many open files 190902 4:29:25 [ERROR] Error in accept: Too many open files 190902 4:33:41 [ERROR] Error in accept: Too many open files 190902 4:37:57 [ERROR] Error in accept: Too many open files 190902 4:42:13 [ERROR] Error in accept: Too many open files 190902 4:46:29 [ERROR] Error in accept: Too many open files 190902 4:50:45 [ERROR] Error in accept: Too many open files
2. Analyse von Datenbankproblemen
2.1 Einschränkungen anzeigen
Verwenden Sie den Befehl: ulimit -a
, um das open_files_limit: des lokalen Computers anzuzeigen
[root@sc3 ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15675 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 15675 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Oder verwenden Sie den folgenden Befehl, um nur das open_files_limit eines bestimmten Prozesses anzuzeigen:
#直接查看 open files限制数字 ulimit -n #仅查看soft 和 hard open files limits : ulimit -Hn ulimit -Sn #仅查看Mysql的open files limits: su mysql ulimit -a
2.2 Limits.conf ändern
Methode eins:
Mit dem folgenden Befehl können Sie die Datei /etc/security/limits.conf
ändern:
#To set the ceiling of the limits available (the max a soft or hard limit can be set by each user). #NOTE: this is set by a PAM during authentication, and NOT at boot. #编辑文件 vi /etc/security/limits.conf #Add the following to bottom of file to set for everything *: #添加以下谷贱伤农 * soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 #To set only a specific user, like mysql then put in: #或者指定Mysql mysql hard nofile 1024000 mysql soft nofile 1024000 #Repeat for /etc/security/limits.d/90-nproc.conf #同样对90-nproc.conf也是一样的操作 vi /etc/security/limits.d/90-nproc.conf #Add the following: * soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 #root soft nproc unlimited #I selected '1024000', which is fairly high; you can surely set this lower to something like '102400',请根据自己的实际情况来设定数字
Oder melden Sie sich mit dem Root-Konto an und verwenden Sie dann den folgenden Befehl, um /etc/security/limits.conf vorübergehend zu ändern:
ulimit -Hn 1024000 #Edit /etc/init.d/mysqld and add this to the top, after #!/bin/sh #或者编辑修改/etc/init.d/mysqld,加入以下代码: ulimit -HSn 1024 ulimit -HSn 32768 ulimit -HSn 1024000
Methode Zwei:
Öffnen Sie die Datei vi /etc/security/limits.conf
und fügen Sie eine Zeile in die Datei ein: * - nofile 32768
und passen Sie so die open files
auf < an bpt3 >32768.
2.3 Ändern Sie die Datei my.cnf
Bearbeiten: vi /etc/my.cnf
, fügen Sie den folgenden Code unter [mysqld] hinzu:
[mysqld] open_files_limit = 1024000
Starten Sie dann MySQL wie folgt neu:
/etc/init.d/mysqld restart #或者 service mysqld restart
2.4 Prüfen Sie, ob es wirksam wird
Führen Sie den folgenden Befehl aus:
mysql -u root -p show global variables like 'open%'; #如果是DirectAdmin面板 mysql -u da_admin -p show global variables like 'open%';
Sie können sehen, dass open_files_limit erfolgreich geändert wurde:
3. Fehlerproblem nach dem Neustart
Wenn Sie feststellen, dass die geöffneten Dateien nach dem Neustart des Systems wieder auf 1024 zurückgekehrt sind, ändern Sie die Konfiguration gemäß dem folgenden Befehl:
#One fix: simply restart mysqld after the system boots up. #最简单的方法再次重启Mysql service mysqld restart #另一种方法 #Another fix is to set these values at boot time before everything else (permanent): vi /etc/init.d/mysqld #Add the following: #添加以下内容: ulimit -S -n ${DAEMON_FILES_LIMIT:-102400} >/dev/null 2>&1 #然后在 /etc/my.cnf 中添加以下内容: [myqld_safe] open_files_limit = 102400 #或者是 [myqld] open_files_limit = 102400
4. Zusammenfassung
Das von MySQL geöffnete Dateideskriptorlimit ist das Dateideskriptorlimit des Linux-Betriebssystems, dh der Standardwert ist 1024 und hat nichts mit der Einstellung open_files_limit in der MySQL-Konfigurationsdatei zu tun. Wenn Sie open_files_limit ändern möchten, müssen Sie daher zuerst das open_files_limit des Betriebssystems ändern.
Wenn Sie die Systemeinstellungen nicht ändern möchten, können Sie natürlich auch das Root-Konto verwenden, das mysqld_safe-Skript ausführen, um MySQL zu starten (oder mysql.server zum Starten verwenden) und den Befehl hinzufügen: –open-files- Das Limit kann erfolgreich festgelegt werden, denn wenn mysqld_safe MySQL startet, wird tatsächlich vor dem Start des mysqld-Programms ulimit -n $open_files aufgerufen, um Dateideskriptorbeschränkungen zu implementieren.
./mysqld_safe --open-files-limit=25000 & root@(none) 02:50:54>show variables like "%open_files_limit%"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 25000 | +------------------+-------+