Коды ошибок MySQL возникают при работе с базой данных — в консоли MySQL, приложениях на PHP/Python, CMS-системах (WordPress, Bitrix, 1C) и инструментах вроде phpMyAdmin. Коды делятся на серверные (1000–1999) и клиентские (2000–2059). Здесь собраны наиболее частые ошибки с конкретными командами для устранения.
Смотрите также: Расшифровка кодов ошибок PostgreSQL.
Что такое коды ошибок MySQL
Каждая ошибка MySQL имеет три идентификатора: числовой код (например, 1045), символьное имя (ER_ACCESS_DENIED_ERROR) и строку SQLSTATE (например, 28000). В логах и приложениях чаще всего отображается числовой код и текстовое описание. Серверные ошибки возникают при выполнении SQL-запросов, клиентские — при проблемах с подключением.
Версии MySQL 5.7, 8.0 и 8.4 используют одни и те же коды для большинства ошибок. При обновлении с 5.7 на 8.x некоторые ошибки могут появляться из-за изменений в синтаксисе SQL и режимах совместимости.
Причины появления ошибок MySQL
- Неверные учётные данные подключения (логин, пароль, хост)
- Превышение лимитов подключений или ресурсов сервера
- Ошибки синтаксиса SQL-запросов
- Нарушения целостности данных (дублирование ключей, NULL в NOT NULL полях)
- Повреждённые таблицы (особенно MyISAM)
- Недостаточно прав у пользователя БД
- Переполнение дискового пространства
- Взаимные блокировки (deadlock) в транзакциях
Способ 1: диагностика через журнал ошибок MySQL
Перед исправлением ошибки — найдите её подробное описание в журнале MySQL:
- Расположение журнала ошибок обычно указано в конфигурации:
SHOW VARIABLES LIKE 'log_error';
- Или просмотрите последние ошибки прямо в MySQL:
SHOW ENGINE INNODB STATUS\G
- Для проверки статуса переменных сервера:
SHOW STATUS; SHOW VARIABLES;
Способ 2: исправить конкретный код ошибки
Таблица наиболее частых кодов ошибок MySQL с причинами и решениями:
| Код | Имя ошибки | Описание | Решение |
|---|---|---|---|
| 1040 | ER_CON_COUNT_ERROR | Too many connections — превышен лимит подключений | Увеличить max_connections в my.cnf: max_connections = 500; оптимизировать пул соединений в приложении; завершить лишние соединения: SHOW PROCESSLIST; затем KILL [id]; |
| 1044 | ER_DBACCESS_DENIED_ERROR | Access denied to database — отказано в доступе к базе данных | Выдать права: GRANT ALL PRIVILEGES ON dbname.* TO 'user'@'host'; затем FLUSH PRIVILEGES; |
| 1045 | ER_ACCESS_DENIED_ERROR | Access denied for user — неверный логин или пароль | Проверить логин/пароль в конфигурации приложения; сбросить пароль: остановить MySQL, запустить с --skip-grant-tables, выполнить UPDATE mysql.user SET authentication_string=... WHERE User='root'; |
| 1049 | ER_BAD_DB_ERROR | Unknown database — база данных не существует | Создать БД: CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; или проверить правильность имени в строке подключения |
| 1054 | ER_BAD_FIELD_ERROR | Unknown column — неизвестный столбец в запросе | Проверить имя столбца: DESCRIBE tablename;; убедиться, что в запросе нет опечаток; проверить алиасы таблиц |
| 1062 | ER_DUP_ENTRY | Duplicate entry — дублирование значения уникального ключа | Использовать INSERT IGNORE или INSERT ... ON DUPLICATE KEY UPDATE; найти дубликаты: SELECT col, COUNT(*) FROM table GROUP BY col HAVING COUNT(*) > 1; |
| 1064 | ER_PARSE_ERROR | You have an error in your SQL syntax — синтаксическая ошибка в запросе | Проверить синтаксис запроса; убедиться, что ключевые слова не используются как имена без обратных кавычек; проверить версию MySQL (синтаксис 8.x отличается от 5.7) |
| 1099 | ER_TABLE_NOT_LOCKED_FOR_WRITE | Таблица заблокирована на чтение — нельзя обновить | Снять блокировку: UNLOCK TABLES; или проверить транзакции: SHOW OPEN TABLES WHERE In_use > 0; |
| 1114 | ER_RECORD_FILE_FULL | Table is full — таблица или диск переполнен | Проверить свободное место на диске; для MyISAM — удалить ненужные данные; для InnoDB — увеличить innodb_data_file_path в my.cnf |
| 1146 | ER_NO_SUCH_TABLE | Table doesn’t exist — таблица не существует | Проверить имя таблицы: SHOW TABLES;; убедиться, что выбрана нужная БД: USE dbname;; восстановить из резервной копии при необходимости |
| 1153 | ER_NET_PACKET_TOO_LARGE | Packet bigger than max_allowed_packet — пакет превышает ограничение | Увеличить в my.cnf: max_allowed_packet = 64M; для текущей сессии: SET GLOBAL max_allowed_packet = 67108864; |
| 1194 | ER_CRASHED_ON_USAGE | Table marked as crashed — таблица повреждена (только MyISAM) | Восстановить таблицу: REPAIR TABLE tablename; или через утилиту: mysqlcheck -u root -p --repair dbname tablename |
| 1205 | ER_LOCK_WAIT_TIMEOUT | Lock wait timeout exceeded — превышено время ожидания блокировки | Увеличить innodb_lock_wait_timeout (по умолчанию 50 сек); найти и завершить блокирующий запрос: SHOW ENGINE INNODB STATUS\G → раздел TRANSACTIONS |
| 1213 | ER_LOCK_DEADLOCK | Deadlock found — взаимная блокировка транзакций | Повторить транзакцию (deadlock — нормальная ситуация в InnoDB); оптимизировать порядок обращения к таблицам; уменьшить размер транзакций |
| 1364 | ER_NO_DEFAULT_FOR_FIELD | Field doesn’t have a default value — поле не имеет значения по умолчанию | Добавить DEFAULT: ALTER TABLE t MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT ''; или передавать значение явно в запросе INSERT |
| 1406 | ER_DATA_TOO_LONG | Data too long for column — данные превышают размер поля | Увеличить размер поля: ALTER TABLE t MODIFY COLUMN col TEXT; или обрезать данные перед вставкой |
| 1451 | ER_ROW_IS_REFERENCED_2 | Cannot delete — запись используется внешним ключом | Сначала удалить зависимые записи; или временно отключить проверку: SET FOREIGN_KEY_CHECKS = 0; удалить, затем SET FOREIGN_KEY_CHECKS = 1; |
| 1452 | ER_NO_REFERENCED_ROW_2 | Cannot add or update — нарушение внешнего ключа при вставке | Убедиться, что связанная запись существует; или добавить её первой; проверить ссылочную целостность |
| 2002 | CR_CONNECTION_ERROR | Can’t connect to MySQL server — сервер недоступен (клиентская ошибка) | Проверить, запущен ли MySQL: systemctl status mysql; проверить host/port в строке подключения; убедиться, что MySQL слушает нужный интерфейс (bind-address в my.cnf) |
| 2006 | CR_SERVER_GONE_ERROR | MySQL server has gone away — соединение разорвано во время запроса | Увеличить wait_timeout и interactive_timeout в my.cnf; проверить max_allowed_packet; реализовать переподключение в приложении |
Способ 3: восстановить повреждённые таблицы
Таблицы MyISAM могут повреждаться при некорректном завершении работы MySQL. InnoDB восстанавливается автоматически при перезапуске.
- Проверить все таблицы базы данных:
mysqlcheck -u root -p --all-databases
- Исправить повреждённые таблицы:
mysqlcheck -u root -p --auto-repair --all-databases
- Или напрямую в MySQL:
CHECK TABLE tablename; REPAIR TABLE tablename;
Что делать, если ничего не помогло
- Проверьте журнал ошибок MySQL: обычно находится в
/var/log/mysql/error.log(Linux) или в директории данных MySQL (Windows). - Восстановите базу данных из резервной копии (mysqldump). Делайте бэкапы регулярно:
mysqldump -u root -p dbname > backup.sql - При ошибках InnoDB и невозможности запуска MySQL — используйте
innodb_force_recovery = 1в my.cnf для аварийного запуска и экспорта данных. - Для ошибок аутентификации в MySQL 8.x — учитывайте изменение плагина по умолчанию (caching_sha2_password вместо mysql_native_password). Для совместимости:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
FAQ
Ошибка 1045 при подключении — как сбросить пароль root MySQL?
Остановите MySQL (systemctl stop mysql), запустите с флагом --skip-grant-tables --skip-networking, подключитесь без пароля (mysql -u root), выполните:
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Перезапустите MySQL в обычном режиме.
Ошибка 1064 — как найти место ошибки синтаксиса?
MySQL указывает строку и позицию ошибки в сообщении. Обратите внимание на слово после «near ‘…»» — это место, где парсер споткнулся. Частые причины: использование зарезервированных слов (ORDER, GROUP, KEY) как имён без обратных кавычек; пропущенные запятые или кавычки; несовместимый синтаксис между версиями 5.7 и 8.x.
Что такое deadlock в MySQL и как его избежать?
Deadlock (ошибка 1213) — взаимная блокировка, когда транзакция A ждёт ресурс, захваченный транзакцией B, и наоборот. InnoDB автоматически разрешает deadlock, завершая одну из транзакций. Чтобы минимизировать: обращайтесь к таблицам в одном и том же порядке во всех транзакциях; уменьшайте время жизни транзакций; добавляйте retry-логику в приложение.
Ошибка 2002 — MySQL не запускается на Windows?
Проверьте, запущена ли служба: диспетчер задач → вкладка «Службы» → найдите MySQL80 или MySQL57. Если не запущена — запустите. Проверьте лог ошибок в директории данных (обычно C:\ProgramData\MySQL\MySQL Server 8.0\Data\). Частая причина — порт 3306 занят другим процессом.
Как правильно задать права пользователя MySQL?
Минимальные права для работы CMS (WordPress, Bitrix):
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON dbname.* TO 'user'@'localhost'; FLUSH PRIVILEGES;
Для просмотра текущих прав: SHOW GRANTS FOR 'user'@'localhost';