{{tag>mysql mariadb percona errors}}

====== Ошибки MySql/MariaDB ======

===== Deadlock found when trying to get lock =====

<code>
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
The SQL being executed was: UPDATE tbl_point
SET location = POINTFROMTEXT(CONCAT('POINT(55.683452 37.526923)'))
</code>

Для выяснения причины ошибки, необходимо запустить **SHOW ENGINE INNODB STATUS;**

===== No such file or directory =====

<code>
SQLSTATE[HY000] [2002] No such file or directory
</code>

Ошибка появляется при неверном указании сокета для драйвера PDO **pdo_mysql.default_socket**

===== Got error 28 from storage engin =====

<code>Got error 28 from storage engine</code>

  * Got error 28 from storage engine - Закончилось место на диске
  * MySQL Error: Out of resources when opening file './db_name/table_name.MYD' (Errcode: 24)

===== Checking for corrupt, not cleanly closed and upgrade needing tables =====

<code>Checking for corrupt, not cleanly closed and upgrade needing tables</code>

  * mysqlcheck --check-upgrade --all-databases --auto-repair -u root -p
  * mysql_upgrade --force -u root -p

===== Too many open files =====

<code>Can't read dir of '.' (Errcode: 24 "Too many open files")</code>

Превышение одновременно открытых дескрипторов

==== Анализ состояния ====

  * Сколько разрешено открывать файловых дескрипторов пользователю mysql (системные ограничения)
  * <code sh># cat /etc/security/limits.conf | grep -vP '^#'</code>
  * Сколько разрешено открывать файловых дескрипторов (конфигурация)
  * <code sh>cat /etc/mysql/my.cnf|grep open_files_limit</code>
  * Сколько занято дескрипторов
  * <code>lsof -u mysql | wc -l</code>
  * Cколько дескрипторов разрешено в MySQL
  * <code># mysql -se "show variables like 'open_files_limit'" -uroot -p
Variable_name       Value
open_files_limit    1024</code>

==== Исправление ====

  * nano /etc/security/limits.conf
  * Воставляем число файловых дескрипторов (для пользователя mysql)
  * <code sh>
mysql           hard    nofile          102400
mysql           soft    nofile          102400</code>
  * Временно увеличиваем число открытых дескрипторов файлов\\ (настройки сохраняются до перезагрузки машины)<code bash>$ ulimit -n 102400</code>
  * Проверить настройки можно <code bash>$ ulimit -a</code>
  * nano /etc/mysql/my.cnf
  * Выставляем число одновременно открытых файлов в конфигурации
  * <code>
[mysqld]
open_files_limit = 8192
</code>
или
  * Выставляем число дескрипторов в разрешенных
  * <code>echo 'mysql  -  nofile  8192' > /etc/security/limits.d/mysql.conf</code>
  * Перезапускаем сервер
  * <code sh># service mysql restart</code>

=== PAM (Аунтификация) ===

Если после перезапуска mysql не применил новые ограничения, значит PAM это запретил. Тогда добавляем разрешение в PAM.

  * Проверяем ограничения PAM
  * <code sh>grep -r limits /etc/pam.*</code>
  * Снимаем ограничение (Debian)
  * <code sh>$ echo 'session required pam_limits.so' >> /etc/pam.d/common-session</code>
  * <code sh>$ echo 'session required pam_limits.so' >> /etc/pam.d/common-session-noninteractive</code>

=== systemd (Менеджер загрузки) ===

  * Сбрасываем ограничения в systemd
  * <code sh>echo "
[Service]
LimitNOFILE=infinity
LimitMEMLOCK=infinity" > /etc/systemd/system/mysqld.service
</code>
  * Перезагружаем настройки демона systemd
  * <code sh>systemctl reload mariadb.service</code>
