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?

user977828
la source
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
enregistreur
la source
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

misima
la source
1

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

[[email protected] /]# 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 ...

kujiy
la source
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
Meuoi
la source