Kulcsszó - hibajavítás

Nagy terheltségű, főleg InnoDB alapú MySQL adatbázisszervereknél előfordulhat üzemszünet amiatt, mert a szofver nem tud újabb állományokat megnyitni. Ilyen esetekben a szerver hibanaplójában a következőhöz hasonló hibaüzenetek kerülhetnek logolásra:

2017-11-10 00:11:22 [ERROR] /usr/sbin/mysqld: Can open file: ./example_db/example_table.frm (errno: 24 - Too many open files)
2017-11-10 00:11:23 [ERROR] /usr/sbin/mysqld: Can open file: ./example_db/example_table.frm (errno: 24 - Too many open files)

A hibakeresésnél érdemes lehet az alábbi parancsokat lefuttatni a mysql prompt alatt:
SHOW VARIABLES LIKE open_files_limit; # lekérjük az aktuálisan beállított open_files_limit-et
SHOW GLOBAL STATUS LIKE Open_files; # megnézzük, hogy hány fájl került megnyitásra

A fenti parancsok közül az első kimenetéből látni fogjuk az aktuális limitet, ezt jegyezzük fel magunknak, a további hibajavításnál ezt a számot kell majd megemelnünk.

Az alábbi tutorial CentOS 7-re készült, más operációs rendszereknél egy-egy konfigurációs állomány más helyen lehet, de a hibajavítás logikája ezeken is megegyezik az alább vázoltakkal.vi /etc/my.cnf # a fájlban az open_files_limit kezdetű sorban található számot az előzőleg már megállapított értéknél magasabbra állítjuk; ha nem volt ilyen sor a fájlban, akkor adjuk hozzá azt így: open_files_limit = $ÚJÉRTÉK
vi /etc/security/limits.conf # a fájlba beszúrjuk a következő sort (vagy ha már létezett, megnöveljük az adott sor végén szereplő értéket): mysql hard nofile $ÚJÉRTÉK
vi /etc/systemd/system/mysql.service # a fájlban a LimitNOFILE értéket megemeljük az $ÚJÉRTÉK-re
/etc/systemd/system/mysql.service.d/limits.conf # a fájlban a LimitNOFILE értéket megemeljük az $ÚJÉRTÉK-re
systemctl daemon-reload; service mysql restart # újratöltjük a daemon szolgáltatást, majd újraindítjuk a MySQL szervízt

Érdemes lehet még a javítás végén az összes adatbázisra egy MySQL ellenőrzést és automatikus hibajavítást futtatni:

mysqlcheck --all-databases --auto-repair