RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:mysql:mysql_errors

Содержание

MySQL - коллекция ошибок и фиксов

Ошибки

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.

Помогло

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;

Или см. #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, а 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

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 и также связана с лимитами.

В данном случае нужно увеличить количество открытых файлов и количество процессов (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

И опять убунта. Что за чудо система. Не даёт скучать. Сиди чини её нескончаемые баги. Впрочем ничего нового.

Делаем

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: <b>1364</b></div>
The Error returned was: Field &#039;author2&#039; doesn&#039;t have a default value
SQL query: INSERT INTO dle_files (news_id, author) values (&#039;0&#039;, &#039;dx&#039;)

Виной всему старый код и новый (5.7) MySQL.

Почему так

Быстрый фикс - выключить так называемый 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 жить стало лучше, жить стало веселее.

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

#23 - Out of resources when opening file Errcode: 24 - Too many open files

#1273 - unknown collation

Ошибка error #1273 - Unknown collation: 'utf8mb4_unicode_ci'

Почему такое произошло? Вероятно вы пытаетесь использовать дамп базы с более новой версии MySQL сервера где уже есть поддержка utf8mb4.

Вероятно вы уже видели в сети совет - открыть дамп через каким-нибудь Notepad++ и заменить все utf8mb4_unicode_ci на utf8_general_ci

Так делать НЕ НАДО!

Вариантов много - обновить MySQL (в версиях выше 5.5.3 такой проблемы нет) или использовать совместимость со старыми версиями MySQL при дампе (mysqldump –compatible=mysql4).

Подробнее на stackoverflow.

Got error 28 from storage engine

Скорее всего у вас просто закончилось свободное место на диске - strerror(28) = No space left on device

Коды ошибок 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

Добавить в секцию [mysqld]

max_allowed_packet = 64M

Значение по-умолчанию = 1М

Скорее всего поможет. Если нет, то также в секцию [mysqld]

wait_timeout = 3600

Значение по-умолчанию - 300 FIXME проверить

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/mysql/mysql_errors.txt · Последнее изменение: 2022/08/01 01:21 — dx