MySQL max_open_files plus de 1024


11

Lors du démarrage de MariaDB, j'ai reçu [Avertissement] Impossible d'augmenter le nombre de max_open_files à plus de 1024 (demande: 4607)

$ sudo systemctl status mysqld
● mysqld.service - MariaDB database server
  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
  Active: activating (start-post) since Tue 2014-08-26 14:12:01 EST; 2s ago
Main PID: 8790 (mysqld);         : 8791 (mysqld-post)
  CGroup: /system.slice/mysqld.service
      ├─8790 /usr/bin/mysqld --pid-file=/run/mysqld/mysqld.pid
      └─control
    ├─8791 /bin/sh /usr/bin/mysqld-post
    └─8841 sleep 1

Aug 26 14:12:01 acpfg mysqld[8790]: 140826 14:12:01 [Warning] Could not increase number of max_open_files to more than 1024 (request: 4607)

J'ai essayé sans succès de résoudre le problème avec max_open_files dans ce fichier:

$ sudo nano /etc/security/limits.conf 
mysql           hard    nofile          8192
mysql           soft    nofile          1200

J'ai même redémarré l'ordinateur, mais j'ai eu le même problème.

Le /etc/mysql/my.cnf ressemble à ceci:

[mysql]

# CLIENT #
port                           = 3306
socket                         = /home/u/tmp/mysql/mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default-storage-engine         = InnoDB
socket                         = /home/u/tmp/mysql/mysql.sock
pid-file                       = /home/u/tmp/mysql/mysql.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

# SAFETY #
max-allowed-packet             = 16M
max-connect-errors             = 1000000
skip-name-resolve
sql-mode                       = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
sysdate-is-now                 = 1
innodb                         = FORCE
innodb-strict-mode             = 1

# DATA STORAGE #
datadir                        = /home/u/tmp/mysql/

# BINARY LOGGING #
log-bin                        = /home/u/tmp/mysql/mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 128M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 2G

# LOGGING #
log-error                      = /home/u/tmp/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /home/u/tmp/mysql/mysql-slow.log

Comment est-il possible de résoudre le problème avec max_open_files?


Avez-vous redémarré mySql depuis que les limites ont changé? Ces choses ne se propagent généralement pas simplement à une modification de fichier, le processus doit généralement être redémarré pour reprendre la modification. Vous pouvez également vérifier les limites à l'aide de la commande ulimit. Avez-vous redémarré depuis le changement?
— mdpc

J'ai redémarré l'ordinateur après, j'ai changé les limites. En regardant la sortie ulimit, mes modifications n'ont pas fonctionné: $ ulimit unlimited $ ulimit -Sa | grep "open files" fichiers ouverts (-n) 1024 $ ulimit -Ha | grep "open files" fichiers ouverts (-n) 4096. Qu'est-ce qui pourrait mal se passer?
— user977828

Réponses:


17

Modifiez /etc/security/limits.confet ajoutez les lignes suivantes

mysql soft nofile 65535
mysql hard nofile 65535

puis redémarrez.

Ensuite, modifiez /usr/lib/systemd/system/mysqld.serviceou /usr/lib/systemd/system/mariadb.serviceet ajoutez

LimitNOFILE=infinity
LimitMEMLOCK=infinity

Redémarrez ensuite le service db:

systemctl reload mariadb.service

1
Veuillez noter qu'au moins sur la version 209 de systemd, l'infini signifie 65535. Si vous voulez plus que cela, entrez simplement le numéro, pas l'infini.
— sivann

3
Pour Mariadb 5.5 dans RHEL 7, au moins, les commentaires de ce fichier (/usr/lib/systemd/system/mariadb.service) vous avertissent de ne pas modifier ce fichier lui-même, mais plutôt de créer un répertoire service.d contenant un fichier comme: /etc/systemd/system/mariadb.service.d/foo.conf. ASSUREZ-VOUS D'AJOUTER "[Service]" en haut de ce fichier, avant ces deux lignes de limite. Il conseille également "systemctl --system daemon-reload" après toute modification. Ces détails m'ont rendu fou pour une heure supplémentaire de cheveux!
— IcarusNM

Cela ne fonctionne pas dans Ubuntu 14.04 avec MySQL 5.7. Les fichiers de service n'existent pas et le package systemctl n'est pas installé.
— Ty.

Vérifiez /etc/systemd/system/mysql.service.d/limits.confou /etc/systemd/system/mariadb.service.d/limits.conf cela a fonctionné parfaitement pour moi
— Luka

2

Une autre raison est que:
Vous devez faire attention à latable_open_cach

code mysql dans mysqld.cc

wanted_files= 10 + max_connections + table_cache_size * 2;

essayez avec une table_open_cachvaleur inférieure


1

Vous pouvez voir les instructions officielles dans le fichier mariadb.service;

[root@mariadb5.5 /]# cat /usr/lib/systemd/system/mariadb.service | grep exam -A 5
# For example, if you want to increase mariadb's open-files-limit to 10000,
# you need to increase systemd's LimitNOFILE setting, so create a file named
# "/etc/systemd/system/mariadb.service.d/limits.conf" containing:
#       [Service]
#       LimitNOFILE=10000

Il doit redémarrer votre système d'exploitation. Bien que je pense que cela devrait être écrit dans le manuel officiel ...


1
Je n'avais pas besoin de redémarrer sur Fedora 28. Il m'a seulement demandé de courir systemctl daemon-reloadlors du redémarrage de MariaDB.
— DanMan

0

J'ai eu le même problème avec Ubuntu 15.10 et mysql et l' ai résolu avec la réponse précédente avec quelques différences mineures.

J'ai d'abord changé /etc/security/limits.confcomme ci-dessus.

J'ai ajouté (rien de plus)

LimitNOFILE=infinity

à /lib/systemd/system/mysql.service(petite différence d'emplacement)

puis a fait

systemctl daemon-reload
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.