====== MySQL - коллекция ошибок и фиксов ======
{{ :linux:mysql:mysql_logo.png?nolink|}}
См. также [[linux:mysql:mysql_tnt|MySQL - tips'n'tricks, коллекция советов]]
===== Ошибки =====
==== ERROR 1045 (28000): Access denied ====
Debian 12, MariaDB 10.11
Nov 15 13:16:10 mail /etc/mysql/debian-start[163667]: Reading datadir from the MariaDB server failed. Got the following error when executing the 'mysql' command line client
Nov 15 13:16:10 mail /etc/mysql/debian-start[163667]: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Nov 15 13:16:10 mail /etc/mysql/debian-start[163667]: FATAL ERROR: Upgrade failed
Временное решение - добавить в файл ''/etc/mysql/debian.cnf'' строку с паролем root
[client]
host = localhost
user = root
password =
[mysql_upgrade]
host = localhost
user = root
password =
При случае проверить это
* [[https://serverfault.com/questions/1126740/mysql-error-1045-28000-access-denied-for-user-rootlocalhost-although-pa|]]
* [[https://stackoverflow.com/questions/76605893/failing-to-successfully-run-mariadb-on-macos-with-brew|]]
==== Foreign key / Внешние ключи / Ошибка #1217 ====
Теория в другом месте. Только фикс.
Текст ошибки может быть разным
#1217 - Cannot delete or update a parent row: a foreign key constraint fails\\
#1217 - Невозможно удалить или обновить родительскую строку: проверка ограничений внешнего ключа не выполняется\\
ERROR 1005 (HY000) at line 30: Can't create table (errno: 150)
Create table %table_name% with foreign key constraint failed.
В mysql cli отключаем проверку внешних ключей, делаем нужный запрос, включаем обратно.
SET FOREIGN_KEY_CHECKS = 0;
# пример, загрузка таблицы
LOAD DATA INFILE '/path/to/table.txt' INTO TABLE table_name;
# пример, загрузка дампа
SOURCE dump.sql;
# пример, удаление таблицы
drop table if exists users;
# включаем проверку внешних ключей
SET FOREIGN_KEY_CHECKS = 1;
UPD 1/08/2022
можно ещё проще сделать
mysql --login-path=user --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" < dump.sql
==== Run 'systemctl daemon-reload' to reload units ====
Warning: The unit file, source configuration file or drop-ins of mariadb.service changed on disk. Run 'systemctl daemon-reload' to reload units.
* https://www.howtoforge.com/community/threads/warning-mysql-service-changed-on-disk-run-systemctl-daemon-reload-to-reload-units.80161/
* https://forum.directadmin.com/threads/warning-mysqld-service-changed-on-disk-run-systemctl-daemon-reload-to-reload-units.60196/
Помогло
mv /etc/systemd/system/mysql.service.d /etc/systemd/system/mariadb.service.d
==== Can't init tc log ====
rm -f /var/lib/mysql/tc.log
mv /var/lib/mysql/tc.log /var/lib/mysql/tc.log_BAK
==== MySQL “Got an error reading communication packet” errors ====
Не успел разобраться с ошибкой - пропала сама. Оставлю ссылку на будущее https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/
==== #1524 - Plugin 'unix_socket' is not loaded ====
[mysqld]
plugin-load-add = auth_socket.so
https://mariadb.com/kb/en/library/authentication-plugin-unix-socket/
Или так
use mysql;
update user set plugin="mysql_native_password";
flush privileges;
Или см. [[linux:mysql:mysql_errors#access_denied_for_user_root_localhost|#1698 - Access denied for user 'root’@’localhost']]
==== Can't create a new thread (errno 11) ====
Ошибка **Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug**
Как всегда ulimit - https://www.percona.com/blog/2013/02/04/cant_create_thread_errno_11/
TL;DR
Лимиты установленные для MySQL в файле ''/etc/security/limits.conf'' будут переопределены файлом ''/etc/security/limits.d/90-nproc.conf''. Поэтому задавать лимиты нужно в ''90-nproc.conf'' или создать отдельный файл ''91-mysql.conf''
mysql soft nofile 10240
mysql hard nofile 40960
mysql soft nproc 10240
mysql hard nproc 40960
==== #1698 - Access denied for user 'root’@’localhost' ====
Не работает phpmyadmin под root'ом. Для MySQL 127.0.0.1 и localhost это разные хосты.
Добавляем отдельного пользователя для администрирования
CREATE USER 'dxdydz'@'%' IDENTIFIED BY 'p4ssw0rd';
GRANT ALL PRIVILEGES ON *.* TO 'dxdydz'@'%' WITH GRANT OPTION;
ИЛИ
# mysql -u root
mysql> use mysql;
mysql> update user set plugin='' where User='root';
mysql> flush privileges;
mysql> exit;
FIXME что-то там с sudo и unix_socket, не разбирался пока, но вариант рабочий.
==== mysqldump: Couldn't execute 'show events' ====
Ошибка **mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Scheduler were found damaged at server start** после перехода на MariaDB с MySQL 56 на cPanel сервере
mysql_upgrade по рекомендациям тоже не работает с ошибкой **mysqldump: Got error: 1102: Incorrect database name '#mysql50#.config'" when selecting the database**
И мне помог не cPanel, а [[https://support.plesk.com/hc/en-us/articles/115002490914-Upgrade-of-MySQL-schema-with-mysql-upgrade-fails-with-the-error-Error-Incorrect-database-name-mysql50-ssh-|Plesk]]
В ''/var/lib/mysql/'' был каталог с точкой в имени.
Чтобы его найти выполним команду
# ls -la /var/lib/mysql| grep ^d | egrep '\.'
**Решение**
Удалить/перенести каталог в другой место, выполнить mysql_upgrade.
==== #1214 - The used table type doesn't support FULLTEXT indexes ====
Индексы FULLTEXT поддерживаются в таблицах InnoDB только начиная с MYSQL 5.6, поэтому попробуйте обновить MYSQL и после этого изменить команду таблицы
==== Waiting for table metadata lock ====
* https://medium.com/@wkoffel/mysql-rails-and-metadata-locks-a-bug-hunt-bedtime-story-c9c4e14deb36
* https://lxadm.com/MySQL:_avoiding_%22Waiting_for_table_metadata_lock%22_when_executing_%22ALTER_TABLE%22
==== No directory, logging in with HOME=/ ====
# /etc/init.d/mysql start
No directory, logging in with HOME=/
Подобная ошибка была в Debian с репозиторием dotdeb.
Надо поправить ''/etc/passwd''
# cat /etc/passwd | grep mysql
mysql:x:112:117:MySQL Server,,,:/nonexistent:/bin/false
Должно быть так
mysql:x:106:110:MySQL Server,,,:/nonexistent:/bin/false
==== Can't create thread to kill server (errno= 11) ====
Скорее всего на сервере недостаточно памяти для выбранных настроек в ''my.cnf''.
Т.е. ''key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections'' в итоге получается больше чем RAM на сервере.
Решение - уменьшить max_connections и другие параметры исходя из доступных ресурсов.
==== Can't create a new thread (errno 11) ====
Ошибка похожа на **Can't create thread to kill server** и также связана с лимитами.
* https://www.percona.com/blog/2013/02/04/cant_create_thread_errno_11/
* http://dimitrik.free.fr/blog/archives/2010/11/mysql-performance-hitting-error-cant-create-a-new-thread-errno-11-on-a-high-number-of-connections.html
В данном случае нужно увеличить количество открытых файлов и количество процессов (''nofile'' и ''nproc'').
По-умолчанию ''open files'' равен 1024.
Проверим, чтобы удостовериться
su - mysql -c 'ulimit -aHS' -s '/bin/bash'
Добавляем в файл ''/etc/security/limits.conf''
* soft nproc 40960
* hard nproc 65535
* soft nofile 40960
* hard nofile 65535
Либо устанавливаем лимит только для mysql
mysql soft nofile 40960
mysql hard nofile 65535
mysql soft nproc 40960
mysql hard nproc 65535
UPD
Нашёл рекомендацию добавить лимиты в отдельный файл ''99-mysql.conf'' в каталоге ''/etc/security/limits.d/''
==== unknown variable 'default-tmp-storage-engine=MyISAM' ====
Вот такая ошибка может возникнуть если бездумно копировать из разных блогов советы бывалых админов
''default-tmp-storage-engine'' появился только в MySQL 5.6 и если использовать опцию в версии 5.5, то MySQL не запустится.
http://www.chriscalender.com/tag/default-tmp-storage-enginemyisam/
==== Host 'a.b.c.d' is blocked because of many connection errors; unblock with 'myscladmin flush-hosts' ====
Ошибка возникает после 10 (по-умолчанию) неудачных соединений с базой.
mysqladmin -u root -p flush-hosts
Подробнее в документации MySQL - https://dev.mysql.com/doc/refman/5.7/en/blocked-host.html
==== Fatal error: Uncaught exception 'Exception' with message 'Error: Can't open file: './ocr/oc_product.frm' (errno: 24) ====
# perror 24
OS error code 24: Too many open files
В логе ''mariadb.log'' нечто подобное
170710 10:36:01 [ERROR] mysqld: Can't open file: './oc2_test/oc_user.frm' (errno: 24)
170710 10:36:01 [ERROR] mysqld: Can't open file: './oc2_test/oc_user_group.frm' (errno: 24)
170710 10:44:05 [ERROR] Error in accept: Too many open files
Решение - см. запись ниже //open-files-limit в MariaDB//
Текущее использование открытых файлов можно посмотреть так:
# lsof -u mysql | wc -l
==== InnoDB: mmap(137363456 bytes) failed; errno 12 ====
Ошибка
InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
InnoDB: Completed initialization of buffer pool
InnoDB: Fatal error: cannot allocate memory for the buffer pool
Решение - уменьшить ''innodb_buffer_pool_size'' или добавить RAM.
==== Правильный UTF-8 ====
В 5.0 было так
default-character-set=utf8
а потом трахбах и deprecated
Теперь так
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
==== #1146 - Table 'data_dictionary.CHARACTER_SETS' doesn't exist ====
И [[https://askubuntu.com/questions/756908/mysql-database-browsers-not-working-after-upgrade|опять убунта]]. Что за чудо система. Не даёт скучать. Сиди чини её нескончаемые баги. Впрочем ничего нового.
Делаем
sudo mysql_upgrade -u root -p --force
И всё начинает работать. До следующего адового бага. Продакшен реди итиху мать.
==== /usr/sbin/mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2) ====
Баг после апгрейда встретился только в Ubuntu
ЕМНИП нужно просто создать каталог /var/lib/mysql-files
sudo mkdir /var/lib/mysql-files
==== 'ERROR 1214 (HY000) at line 784: The used table type doesn't support FULLTEXT indexes ' ====
FULLTEXT INDEX раньше работал только с MyISAM. С версии 5.6 доступен в InnoDB.
Так что либо апгрейд либо ALTER TABLE `yourtable` ENGINE = MyISAM; FIXME
==== Got an error from unknown thread, /builddir/build/BUILD /storage/myisam/mi_write.c:226 ====
Также в логах может быть что-то вроде **Incorrect key file for table 'xyz.MYI'; try to repair it**
Казалось бы следует сделать ''mysqlrepair --auto-repair''. Но обычно это не помогает.
Скорее всего нет инодов или кончилось место или недоступен tmpdir в mysql.
Проверяем ''df -i'' и ''df -h''. Также проверяем значение ''tmpdir'' в ''my.cnf''
==== mysqldump: Got error: (Errcode: 24) when using LOCK TABLES ====
Узнал о крутой утилите **perror**. По коду ошибки покажет, что не так.
Print a description for a system error code or a MySQL error code.
If you want to get the error for a negative error code, you should use
-- before the first error code to tell perror that there was no more options.
Пример
# perror -v 24
OS error code 24: Too many open files
Ну и по ошибке выше - попробуйте добавить опцию ''--single-transaction'' к mysqldump
==== Error Number: 1364 ====
Через tcpdump выловил ошибку в php-fpm
MySQL Error!
MySQL error in file: /engine/modules/tracker/upload.php at line 0
Error Number: 1364
The Error returned was: Field 'author2' doesn't have a default value
SQL query: INSERT INTO dle_files (news_id, author) values ('0', 'dx')
Виной всему старый код и новый (5.7) MySQL.
Почему так
* при вставке или обновлении данных у поля нет значения по-умолчанию
* [[http://ru.stackoverflow.com/questions/119731/ошибка-field-us-id-doesnt-have-a-default-value|http://ru.stackoverflow.com/questions/119731/ошибка-field-us-id-doesnt-have-a-default-value]]
Быстрый фикс - выключить так называемый **strict mode**
Для этого нужно добавить в ''my.cnf''
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Можно также вынести в отдельный файл ''/etc/mysql/conf.d/disable_strict_mode.cnf''
Проверить **sql_mode**
mysql -e "SELECT @@sql_mode;"
==== #1030 - Got error -1 from storage engine ====
При попытке выполнить SQL запрос в phpmyadmin получаем ошибку **#1030 - Got error -1 from storage engine**
Вероятно включен ''innodb_force_recovery'' в файле ''my.cnf''.
Проверяем логи. Если есть нечто подобное
InnoDB: innodb_force_recovery is on: we do not allow InnoDB: database modifications by the user. Shut down
то значит так оно и есть. Выключаем ''innodb_force_recovery'' и всё снова работает.
==== error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)' ====
Ошибка
# /etc/init.d/mysql restart
* Stopping MySQL database server mysqld [fail]
* Starting MySQL database server mysqld [ OK ]
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
Смотрим пароль пользователя ''debian-sys-maint'' в файле ''/etc/mysql/debian.cnf''
[client]
host = localhost
user = debian-sys-maint
password = A1b2C3d4E5f6
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user = debian-sys-maint
password = A1b2C3d4E5f6
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Выполняем 2 SQL запроса, чтобы вернуть гражданину debian-sys-maint его привилегии
# mysql -u root -p
mysql> use mysql;
mysql> GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'A1b2C3d4E5f6';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'A1b2C3d4E5f6' WITH GRANT OPTION;
Перезапускаем MySQL сервер
# /etc/init.d/mysql restart
* Stopping MySQL database server mysqld [ OK ]
* Starting MySQL database server mysqld [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
==== open-files-limit в MariaDB ====
С приходом systemd [[https://ru.wikipedia.org/wiki/Жить_стало_лучше,_жить_стало_веселее|жить стало лучше, жить стало веселее]].
Systemd самостоятельно контролирует, сколько файлов служба (в нашем случае mariadb-server) может открыть, независимо от того, что вы настроили в ''/etc/my.cnf'' или в ''/etc/security/limits.conf''.
Создаём каталог
# mkdir -p /etc/systemd/system/mariadb.service.d/
И вносим следующие правки
# cat /etc/systemd/system/mariadb.service.d/limits.conf
[Service]
LimitNOFILE=10240
Данные новшества однако документированы. Так что надо просто внимательнее читать release notes и changelog.
# cat /usr/lib/systemd/system/mariadb.service
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades. If you want to customize, the
# best way is to create a file "/etc/systemd/system/mariadb.service",
# containing
# .include /lib/systemd/system/mariadb.service
# ...make your changes here...
# or create a file "/etc/systemd/system/mariadb.service.d/foo.conf",
# which doesn't need to include ".include" call and which will be parsed
# after the file mariadb.service itself is parsed.
#
# For more info about custom unit files, see systemd.unit(5) or
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# 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
# Note: /usr/lib/... is recommended in the .include line though /lib/...
# still works.
# Don't forget to reload systemd daemon after you change unit configuration:
# root> systemctl --system daemon-reload
# systemctl --system daemon-reload
# systemctl restart mariadb.service
==== Unable to lock ./ibdata1, error: 11 ====
В логах
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
Решение в сети, которое якобы некоторым помогает
mv ibdata1 ibdata1.bak
cp -a ibdata1.bak ibdata1
увы не помогает.
Бытует мнение, что виной всему Apparmor т.к. нигде кроме Ubuntu ошибка эта не встречалась
Можно попробовать добавить в ''/etc/apparmor.d/usr.sbin.mysqld''
/var/lib/mysql/data/ r,
/var/lib/mysql/data/** rwk,
FIXME надо проверить
==== unknown option '--skip-locking' ====
Опцию ''--skip-locking'' убрали в MySQL 5.5.
Решение: заменить ''skip-locking'' на ''skip-external-locking''
==== Thread stack overrun ====
Ошибка
#1436 - Thread stack overrun: 8240 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
Добавляем в секцию [mysqld]
thread_stack = 256K
==== Не работает mysql_upgrade ====
=== 5.1 > 5.5 ===
http://serverfault.com/questions/527422/mysql-upgrade-is-failing-with-no-real-reason-given
# mysql_upgrade
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
FATAL ERROR: Upgrade failed
Что делать? Указать юзера и пароль
mysql_upgrade -u root -p
=== 5.5 > 5.6 ===
Ошибка
root@mx:/etc/mysql# mysql_upgrade -u root -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Error: Failed while fetching Server version! Could be due to unauthorized access.
FATAL ERROR: Upgrade failed
Решение
mysql_upgrade -S /var/lib/mysql/mysql.sock -uUSERNAME -p
==== #23 - Out of resources when opening file ====
{{:linux:mysql:mysql_23.png?nolink&800|}}
#23 - Out of resources when opening file Errcode: 24 - Too many open files
==== #1273 - unknown collation ====
Ошибка **error #1273 - Unknown collation: 'utf8mb4_unicode_ci'**
{{:linux:mysql:mysql_1273.png?nolink|}}
Почему такое произошло? Вероятно вы пытаетесь использовать дамп базы с более новой версии MySQL сервера где уже есть поддержка utf8mb4.
Вероятно вы уже видели в сети совет - открыть дамп через каким-нибудь Notepad++ и заменить все ''utf8mb4_unicode_ci'' на ''utf8_general_ci''
Так делать НЕ НАДО!
Вариантов много - обновить MySQL (в версиях выше 5.5.3 такой проблемы нет) или использовать совместимость со старыми версиями MySQL при дампе (**mysqldump --compatible=mysql4**).
[[http://stackoverflow.com/questions/29916610/1273-unknown-collation-utf8mb4-unicode-ci-cpanel|Подробнее на stackoverflow]].
==== Got error 28 from storage engine ====
Скорее всего у вас просто закончилось свободное место на диске - **strerror(28) = No space left on device**
Коды ошибок [[https://www.opennet.ru/man.shtml?topic=strerror&category=3&russian=0|strerror]] на память
strerror(0) = Success
strerror(1) = Operation not permitted
strerror(2) = No such file or directory
strerror(3) = No such process
strerror(4) = Interrupted system call
strerror(5) = Input/output error
strerror(6) = No such device or address
strerror(7) = Argument list too long
strerror(8) = Exec format error
strerror(9) = Bad file descriptor
strerror(10) = No child processes
strerror(11) = Resource temporarily unavailable
strerror(12) = Cannot allocate memory
strerror(13) = Permission denied
strerror(14) = Bad address
strerror(15) = Block device required
strerror(16) = Device or resource busy
strerror(17) = File exists
strerror(18) = Invalid cross-device link
strerror(19) = No such device
strerror(20) = Not a directory
strerror(21) = Is a directory
strerror(22) = Invalid argument
strerror(23) = Too many open files in system
strerror(24) = Too many open files
strerror(25) = Inappropriate ioctl for device
strerror(26) = Text file busy
strerror(27) = File too large
strerror(28) = No space left on device
strerror(29) = Illegal seek
strerror(30) = Read-only file system
strerror(31) = Too many links
strerror(32) = Broken pipe
strerror(33) = Numerical argument out of domain
strerror(34) = Numerical result out of range
strerror(35) = Resource deadlock avoided
strerror(36) = File name too long
strerror(37) = No locks available
strerror(38) = Function not implemented
==== ERROR 2006 (HY000) - MySQL server has gone away ====
* http://dev.mysql.com/doc/refman/5.1/en/gone-away.html
* [[http://stackoverflow.com/questions/24895645/possible-reasons-for-mysql-server-has-gone-away-error-php-5-4-mysqlnd|Possible reasons for “mysql server has gone away” error (php 5.4, mysqlnd)]]
Добавить в секцию ''[mysqld]''
max_allowed_packet = 64M
Значение по-умолчанию = 1М
Скорее всего поможет. Если нет, то также в секцию ''[mysqld]''
wait_timeout = 3600
Значение по-умолчанию - 300 FIXME проверить