Ошибки MySql/MariaDB

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)'))

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

SQLSTATE[HY000] [2002] No such file or directory

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

Got error 28 from storage engine
  • 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
  • mysqlcheck --check-upgrade --all-databases --auto-repair -u root -p
  • mysql_upgrade --force -u root -p
Can't read dir of '.' (Errcode: 24 "Too many open files")

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

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

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

Исправление

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

или

  • Выставляем число дескрипторов в разрешенных
  • echo 'mysql  -  nofile  8192' > /etc/security/limits.d/mysql.conf
  • Перезапускаем сервер
  • # service mysql restart

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

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

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

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

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