En raison de l'augmentation du nombre d'utilisateurs de l'espace CN2, le processus Mysql s'est toujours écrasé au milieu de la nuit récemment. J'ai vérifié le journal des erreurs Mysql et l'invite était : [ERREUR] Erreur d'acceptation : trop de fichiers ouverts. être dû à des fichiers ouverts. L'insuffisance entraîne le blocage de la base de données, en particulier lorsque le système DirectAdmin est sauvegardé la nuit.
Le fichier d'ouverture par défaut dans le système Linux est 1024. Vous pouvez utiliser ulimit -a pour l'afficher. Il s'agit d'une limite au niveau du système. De plus, la valeur par défaut des fichiers ouverts dans MySQL est également de 1024. Dans de nombreux cas, cette valeur ne peut pas respecter notre. besoins en matière de création de sites Web, en particulier lorsqu'ils sont volumineux. Des problèmes de fichiers ouverts trop nombreux peuvent facilement survenir dans les sites Web et les énormes centres de bases de données.
Cet article explique comment résoudre l'erreur : [ERREUR] Erreur d'acceptation : trop de fichiers ouverts. Pour plus d'informations sur l'optimisation du serveur et la résolution des problèmes, veuillez vous référer à :
- Laissez les images voler pendant un moment ! Paramètres de conversion par lots du format WebP de l'image du site Web et expérience d'effet accélérée
- Utilisez intelligemment Youpai Cloud FTP et Nut Cloud WebDAV pour créer une sauvegarde de fichiers personnels et un stockage de données dans le cloud
- Protection de la sécurité de l'hôte et du serveur VPS : modification du port SSH, ajout à la liste blanche, connexion par clé uniquement
1. Détails du problème de base de données
Vérifiez le journal des erreurs de la base de données Si vous utilisez le panneau DirectAdmin, le chemin du journal pertinent est le suivant :
#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.
Ouvrez le journal des erreurs Mysql et l'erreur suivante s'affichera généralement :
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 des problèmes de base de données
2.1 Afficher les restrictions
Utilisez la commande : ulimit -a
pour afficher la open_files_limit : de la machine locale.
[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
Ou utilisez la commande suivante pour afficher uniquement la open_files_limit d'un certain processus :
#直接查看 open files限制数字 ulimit -n #仅查看soft 和 hard open files limits : ulimit -Hn ulimit -Sn #仅查看Mysql的open files limits: su mysql ulimit -a
2.2 Modifier limites.conf
première méthode :
Vous pouvez utiliser la commande suivante pour modifier le fichier /etc/security/limits.conf
:
#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',请根据自己的实际情况来设定数字
Ou connectez-vous avec le compte root, puis utilisez la commande suivante pour modifier temporairement /etc/security/limits.conf :
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
Deuxième méthode :
Ouvrez le fichier vi /etc/security/limits.conf
et ajoutez une ligne dans le fichier : * - nofile 32768
, ajustant ainsi les fichiers ouverts
à 32768
.
2.3 Modifier le fichier mon.cnf
Edit : vi /etc/my.cnf
, ajoutez le code suivant ci-dessous [mysqld] :
[mysqld] open_files_limit = 1024000
Redémarrez ensuite Mysql comme suit :
/etc/init.d/mysqld restart #或者 service mysqld restart
2.4 Vérifier si cela prend effet
Exécutez la commande suivante :
mysql -u root -p show global variables like 'open%'; #如果是DirectAdmin面板 mysql -u da_admin -p show global variables like 'open%';
Vous pouvez constater que open_files_limit a été modifié avec succès :
3. Problème d'échec après redémarrage
Si vous constatez que les fichiers ouverts sont revenus à 1024 après le redémarrage du système, modifiez la configuration selon la commande suivante :
#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. Résumé
La limite de descripteur de fichier ouverte par MySQL est la limite de descripteur de fichier du système d'exploitation Linux, c'est-à-dire que la valeur par défaut est 1024, et n'a rien à voir avec le paramètre open_files_limit dans le fichier de configuration Mysql. Par conséquent, si vous souhaitez modifier open_files_limit, vous devez d'abord modifier l'open_files_limit du système d'exploitation.
Bien sûr, si vous ne souhaitez pas modifier les paramètres système, vous pouvez également utiliser le compte root, exécuter le script mysqld_safe pour démarrer MySQL (ou utiliser mysql.server pour démarrer) et ajouter la commande : –open-files- limit peut être défini avec succès, car lorsque mysqld_safe démarre MySQL , en fait, avant de démarrer le programme mysqld, ulimit -n $open_files est appelé pour implémenter les restrictions du descripteur de fichier.
./mysqld_safe --open-files-limit=25000 & root@(none) 02:50:54>show variables like "%open_files_limit%"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 25000 | +------------------+-------+