Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| linux:mysql:mysql_errors [2020/04/07 21:58] – внешнее изменение 127.0.0.1 | linux:mysql:mysql_errors [2025/03/05 17:49] (текущий) – dx | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== MySQL - коллекция ошибок и фиксов ====== | ||
| + | {{ : | ||
| + | |||
| + | См. также [[linux: | ||
| + | |||
| + | ===== Ошибки ===== | ||
| + | |||
| + | ==== ERROR 1045 (28000): Access denied ==== | ||
| + | |||
| + | Debian 12, MariaDB 10.11 | ||
| + | |||
| + | <code bash> | ||
| + | Nov 15 13:16:10 mail / | ||
| + | Nov 15 13:16:10 mail / | ||
| + | Nov 15 13:16:10 mail / | ||
| + | </ | ||
| + | |||
| + | Временное решение - добавить в файл ''/ | ||
| + | |||
| + | <code bash> | ||
| + | [client] | ||
| + | host = localhost | ||
| + | user = root | ||
| + | password = | ||
| + | [mysql_upgrade] | ||
| + | host = localhost | ||
| + | user = root | ||
| + | password = | ||
| + | </ | ||
| + | |||
| + | При случае проверить это | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ==== Foreign key / Внешние ключи / Ошибка #1217 ==== | ||
| + | |||
| + | Теория в другом месте. Только фикс. | ||
| + | |||
| + | Текст ошибки может быть разным | ||
| + | |||
| + | <code sql> | ||
| + | #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 отключаем проверку внешних ключей, | ||
| + | |||
| + | <code sql> | ||
| + | SET FOREIGN_KEY_CHECKS = 0; | ||
| + | # пример, | ||
| + | LOAD DATA INFILE '/ | ||
| + | # пример, | ||
| + | SOURCE dump.sql; | ||
| + | # пример, | ||
| + | drop table if exists users; | ||
| + | # включаем проверку внешних ключей | ||
| + | SET FOREIGN_KEY_CHECKS = 1; | ||
| + | </ | ||
| + | |||
| + | UPD 1/08/2022 | ||
| + | |||
| + | можно ещё проще сделать | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | ==== Run ' | ||
| + | |||
| + | Warning: The unit file, source configuration file or drop-ins of mariadb.service changed on disk. Run ' | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | Помогло | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Can't init tc log ==== | ||
| + | |||
| + | < | ||
| + | rm -f / | ||
| + | mv / | ||
| + | </ | ||
| + | |||
| + | ==== MySQL “Got an error reading communication packet” errors ==== | ||
| + | |||
| + | Не успел разобраться с ошибкой - пропала сама. Оставлю ссылку на будущее https:// | ||
| + | |||
| + | ==== #1524 - Plugin ' | ||
| + | |||
| + | < | ||
| + | [mysqld] | ||
| + | plugin-load-add = auth_socket.so | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | |||
| + | Или так | ||
| + | |||
| + | < | ||
| + | use mysql; | ||
| + | update user set plugin=" | ||
| + | flush privileges; | ||
| + | </ | ||
| + | |||
| + | Или см. [[linux: | ||
| + | |||
| + | ==== Can't create a new thread (errno 11) ==== | ||
| + | |||
| + | Ошибка **Can' | ||
| + | |||
| + | Как всегда ulimit - https:// | ||
| + | |||
| + | TL;DR | ||
| + | |||
| + | Лимиты установленные для MySQL в файле ''/ | ||
| + | |||
| + | < | ||
| + | mysql soft nofile 10240 | ||
| + | mysql hard nofile 40960 | ||
| + | mysql soft nproc 10240 | ||
| + | mysql hard nproc 40960 | ||
| + | </ | ||
| + | |||
| + | ==== #1698 - Access denied for user ' | ||
| + | |||
| + | Не работает phpmyadmin под root' | ||
| + | |||
| + | Добавляем отдельного пользователя для администрирования | ||
| + | |||
| + | < | ||
| + | CREATE USER ' | ||
| + | GRANT ALL PRIVILEGES ON *.* TO ' | ||
| + | </ | ||
| + | |||
| + | ИЛИ | ||
| + | |||
| + | < | ||
| + | # mysql -u root | ||
| + | mysql> use mysql; | ||
| + | mysql> update user set plugin='' | ||
| + | mysql> flush privileges; | ||
| + | mysql> exit; | ||
| + | </ | ||
| + | |||
| + | FIXME что-то там с sudo и unix_socket, | ||
| + | |||
| + | ==== mysqldump: Couldn' | ||
| + | |||
| + | Ошибка **mysqldump: | ||
| + | |||
| + | mysql_upgrade по рекомендациям тоже не работает с ошибкой **mysqldump: | ||
| + | |||
| + | И мне помог не cPanel, а [[https:// | ||
| + | |||
| + | В ''/ | ||
| + | |||
| + | Чтобы его найти выполним команду | ||
| + | |||
| + | < | ||
| + | |||
| + | **Решение** | ||
| + | |||
| + | Удалить/ | ||
| + | |||
| + | ==== #1214 - The used table type doesn' | ||
| + | |||
| + | Индексы FULLTEXT поддерживаются в таблицах InnoDB только начиная с MYSQL 5.6, поэтому попробуйте обновить MYSQL и после этого изменить команду таблицы | ||
| + | |||
| + | ==== Waiting for table metadata lock ==== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | ==== No directory, logging in with HOME=/ ==== | ||
| + | |||
| + | < | ||
| + | # / | ||
| + | No directory, logging in with HOME=/ | ||
| + | </ | ||
| + | |||
| + | Подобная ошибка была в Debian с репозиторием dotdeb. | ||
| + | |||
| + | Надо поправить ''/ | ||
| + | |||
| + | < | ||
| + | # cat /etc/passwd | grep mysql | ||
| + | mysql: | ||
| + | </ | ||
| + | |||
| + | Должно быть так | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Can't create thread to kill server (errno= 11) ==== | ||
| + | |||
| + | Скорее всего на сервере недостаточно памяти для выбранных настроек в '' | ||
| + | |||
| + | Т.е. '' | ||
| + | |||
| + | Решение - уменьшить max_connections и другие параметры исходя из доступных ресурсов. | ||
| + | |||
| + | ==== Can't create a new thread (errno 11) ==== | ||
| + | |||
| + | Ошибка похожа на **Can' | ||
| + | |||
| + | * https:// | ||
| + | * http:// | ||
| + | |||
| + | В данном случае нужно увеличить количество открытых файлов и количество процессов ('' | ||
| + | |||
| + | По-умолчанию '' | ||
| + | |||
| + | Проверим, | ||
| + | |||
| + | < | ||
| + | |||
| + | Добавляем в файл ''/ | ||
| + | |||
| + | < | ||
| + | * soft nproc 40960 | ||
| + | * hard nproc 65535 | ||
| + | * soft nofile | ||
| + | * hard nofile | ||
| + | </ | ||
| + | |||
| + | Либо устанавливаем лимит только для mysql | ||
| + | |||
| + | < | ||
| + | mysql soft nofile | ||
| + | mysql hard nofile | ||
| + | mysql soft nproc 40960 | ||
| + | mysql hard nproc 65535 | ||
| + | </ | ||
| + | |||
| + | UPD | ||
| + | |||
| + | Нашёл рекомендацию добавить лимиты в отдельный файл '' | ||
| + | |||
| + | ==== unknown variable ' | ||
| + | |||
| + | Вот такая ошибка может возникнуть если бездумно копировать из разных блогов советы бывалых админов | ||
| + | |||
| + | '' | ||
| + | |||
| + | http:// | ||
| + | |||
| + | ==== Host ' | ||
| + | |||
| + | Ошибка возникает после 10 (по-умолчанию) неудачных соединений с базой. | ||
| + | |||
| + | < | ||
| + | |||
| + | Подробнее в документации MySQL - https:// | ||
| + | |||
| + | ==== Fatal error: Uncaught exception ' | ||
| + | |||
| + | < | ||
| + | # perror 24 | ||
| + | OS error code 24: Too many open files | ||
| + | </ | ||
| + | |||
| + | В логе '' | ||
| + | |||
| + | < | ||
| + | 170710 10:36:01 [ERROR] mysqld: Can't open file: ' | ||
| + | 170710 10:36:01 [ERROR] mysqld: Can't open file: ' | ||
| + | 170710 10:44:05 [ERROR] Error in accept: Too many open files | ||
| + | </ | ||
| + | |||
| + | Решение - см. запись ниже // | ||
| + | |||
| + | Текущее использование открытых файлов можно посмотреть так: | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== 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 | ||
| + | </ | ||
| + | |||
| + | Решение - уменьшить '' | ||
| + | |||
| + | ==== Правильный UTF-8 ==== | ||
| + | |||
| + | В 5.0 было так | ||
| + | |||
| + | < | ||
| + | |||
| + | Теперь так | ||
| + | |||
| + | < | ||
| + | init_connect=' | ||
| + | init_connect=' | ||
| + | character-set-server=utf8 | ||
| + | collation-server=utf8_unicode_ci | ||
| + | skip-character-set-client-handshake | ||
| + | </ | ||
| + | |||
| + | ==== #1146 - Table ' | ||
| + | |||
| + | И [[https:// | ||
| + | |||
| + | Делаем | ||
| + | |||
| + | < | ||
| + | |||
| + | И всё начинает работать. До следующего адового бага. Продакшен реди итиху мать. | ||
| + | |||
| + | ==== / | ||
| + | |||
| + | Баг после апгрейда встретился только в Ubuntu | ||
| + | |||
| + | ЕМНИП нужно просто создать каталог / | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== 'ERROR 1214 (HY000) at line 784: The used table type doesn' | ||
| + | |||
| + | FULLTEXT INDEX раньше работал только с MyISAM. С версии 5.6 доступен в InnoDB. | ||
| + | |||
| + | Так что либо апгрейд либо ALTER TABLE `yourtable` ENGINE = MyISAM; FIXME | ||
| + | |||
| + | ==== Got an error from unknown thread, / | ||
| + | |||
| + | Также в логах может быть что-то вроде **Incorrect key file for table ' | ||
| + | |||
| + | Казалось бы следует сделать '' | ||
| + | |||
| + | Скорее всего нет инодов или кончилось место или недоступен tmpdir в mysql. | ||
| + | |||
| + | Проверяем '' | ||
| + | |||
| + | ==== 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 | ||
| + | </ | ||
| + | |||
| + | Ну и по ошибке выше - попробуйте добавить опцию ''< | ||
| + | |||
| + | ==== Error Number: 1364 ==== | ||
| + | |||
| + | Через tcpdump выловил ошибку в php-fpm | ||
| + | |||
| + | < | ||
| + | MySQL Error! | ||
| + | MySQL error in file: / | ||
| + | Error Number: < | ||
| + | The Error returned was: Field &# | ||
| + | SQL query: INSERT INTO dle_files (news_id, author) values (&# | ||
| + | </ | ||
| + | |||
| + | Виной всему старый код и новый (5.7) MySQL. | ||
| + | |||
| + | Почему так | ||
| + | |||
| + | * при вставке или обновлении данных у поля нет значения по-умолчанию | ||
| + | * [[http:// | ||
| + | |||
| + | Быстрый фикс - выключить так называемый **strict mode** | ||
| + | |||
| + | Для этого нужно добавить в '' | ||
| + | |||
| + | < | ||
| + | [mysqld] | ||
| + | sql_mode=IGNORE_SPACE, | ||
| + | </ | ||
| + | |||
| + | Можно также вынести в отдельный файл ''/ | ||
| + | |||
| + | Проверить **sql_mode** | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== #1030 - Got error -1 from storage engine ==== | ||
| + | |||
| + | При попытке выполнить SQL запрос в phpmyadmin получаем ошибку **#1030 - Got error -1 from storage engine** | ||
| + | |||
| + | Вероятно включен '' | ||
| + | |||
| + | Проверяем логи. Если есть нечто подобное | ||
| + | |||
| + | < | ||
| + | |||
| + | то значит так оно и есть. Выключаем '' | ||
| + | |||
| + | ==== error: ' | ||
| + | |||
| + | Ошибка | ||
| + | |||
| + | < | ||
| + | # / | ||
| + | * Stopping MySQL database server mysqld [fail] | ||
| + | * Starting MySQL database server mysqld [ OK ] | ||
| + | / | ||
| + | error: ' | ||
| + | </ | ||
| + | |||
| + | Смотрим пароль пользователя '' | ||
| + | |||
| + | < | ||
| + | [client] | ||
| + | host = localhost | ||
| + | user = debian-sys-maint | ||
| + | password = A1b2C3d4E5f6 | ||
| + | socket | ||
| + | [mysql_upgrade] | ||
| + | user = debian-sys-maint | ||
| + | password = A1b2C3d4E5f6 | ||
| + | socket | ||
| + | basedir | ||
| + | </ | ||
| + | |||
| + | Выполняем 2 SQL запроса, | ||
| + | |||
| + | < | ||
| + | # mysql -u root -p | ||
| + | mysql> use mysql; | ||
| + | mysql> GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO ' | ||
| + | mysql> GRANT ALL PRIVILEGES ON *.* TO ' | ||
| + | </ | ||
| + | |||
| + | Перезапускаем MySQL сервер | ||
| + | |||
| + | < | ||
| + | # / | ||
| + | * 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:// | ||
| + | |||
| + | Systemd самостоятельно контролирует, | ||
| + | |||
| + | Создаём каталог | ||
| + | |||
| + | < | ||
| + | |||
| + | И вносим следующие правки | ||
| + | |||
| + | < | ||
| + | # cat / | ||
| + | [Service] | ||
| + | LimitNOFILE=10240 | ||
| + | </ | ||
| + | |||
| + | Данные новшества однако документированы. Так что надо просто внимательнее читать release notes и changelog. | ||
| + | |||
| + | < | ||
| + | # cat / | ||
| + | |||
| + | # It's not recommended to modify this file in-place, because it will be | ||
| + | # overwritten during package upgrades. | ||
| + | # best way is to create a file "/ | ||
| + | # containing | ||
| + | # .include / | ||
| + | # ...make your changes here... | ||
| + | # or create a file "/ | ||
| + | # which doesn' | ||
| + | # after the file mariadb.service itself is parsed. | ||
| + | # | ||
| + | # For more info about custom unit files, see systemd.unit(5) or | ||
| + | # http:// | ||
| + | |||
| + | # For example, if you want to increase mariadb' | ||
| + | # you need to increase systemd' | ||
| + | # "/ | ||
| + | # [Service] | ||
| + | # | ||
| + | |||
| + | # Note: / | ||
| + | # 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 | ||
| + | </ | ||
| + | |||
| + | увы не помогает. | ||
| + | |||
| + | Бытует мнение, | ||
| + | |||
| + | Можно попробовать добавить в ''/ | ||
| + | |||
| + | < | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | FIXME надо проверить | ||
| + | |||
| + | ==== unknown option ' | ||
| + | |||
| + | Опцию '' | ||
| + | |||
| + | Решение: | ||
| + | |||
| + | ==== Thread stack overrun ==== | ||
| + | |||
| + | Ошибка | ||
| + | |||
| + | < | ||
| + | #1436 - Thread stack overrun: 8240 bytes used of a 131072 byte stack, and 128000 bytes needed. Use ' | ||
| + | </ | ||
| + | |||
| + | Добавляем в секцию [mysqld] | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Не работает mysql_upgrade ==== | ||
| + | |||
| + | === 5.1 > 5.5 === | ||
| + | |||
| + | http:// | ||
| + | |||
| + | < | ||
| + | # mysql_upgrade | ||
| + | Looking for ' | ||
| + | Looking for ' | ||
| + | FATAL ERROR: Upgrade failed | ||
| + | </ | ||
| + | |||
| + | Что делать? | ||
| + | |||
| + | < | ||
| + | |||
| + | === 5.5 > 5.6 === | ||
| + | |||
| + | Ошибка | ||
| + | |||
| + | < | ||
| + | root@mx:/ | ||
| + | Enter password: | ||
| + | Looking for ' | ||
| + | Looking for ' | ||
| + | Error: Failed while fetching Server version! Could be due to unauthorized access. | ||
| + | FATAL ERROR: Upgrade failed | ||
| + | </ | ||
| + | |||
| + | Решение | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== #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: ' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Почему такое произошло? | ||
| + | |||
| + | Вероятно вы уже видели в сети совет - открыть дамп через каким-нибудь Notepad++ и заменить все '' | ||
| + | |||
| + | Так делать НЕ НАДО! | ||
| + | |||
| + | Вариантов много - обновить MySQL (в версиях выше 5.5.3 такой проблемы нет) или использовать совместимость со старыми версиями MySQL при дампе (**mysqldump --compatible=mysql4**). | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | ==== Got error 28 from storage engine ==== | ||
| + | |||
| + | Скорее всего у вас просто закончилось свободное место на диске - **strerror(28) = No space left on device** | ||
| + | |||
| + | Коды ошибок [[https:// | ||
| + | |||
| + | < | ||
| + | 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/ | ||
| + | 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:// | ||
| + | * [[http:// | ||
| + | |||
| + | Добавить в секцию '' | ||
| + | |||
| + | < | ||
| + | |||
| + | Значение по-умолчанию = 1М | ||
| + | |||
| + | Скорее всего поможет. Если нет, то также в секцию '' | ||
| + | |||
| + | < | ||
| + | |||
| + | Значение по-умолчанию - 300 FIXME проверить | ||