RTFM.WIKI

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

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

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


Боковая панель


Навигация

Линкшэринг

ALARM!

Добавить новую страницу

You are not allowed to add pages
linux:mysql:mysql_errors


Содержание

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

Ошибки

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 проверить

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies

Discussion

Enter your comment. Wiki syntax is allowed:
 
linux/mysql/mysql_errors.txt · Последнее изменение: 2020/04/07 21:58 — dx