Коды ошибок MySQL — расшифровка и способы устранения

Справочник наиболее частых кодов ошибок MySQL: 1040, 1044, 1045, 1064, 1146, 1213 и другие — с описанием причин, SQL-командами для исправления и практическими советами.
MySQL Windows

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

  1. Расположение журнала ошибок обычно указано в конфигурации:
    SHOW VARIABLES LIKE 'log_error';
  2. Или просмотрите последние ошибки прямо в MySQL:
    SHOW ENGINE INNODB STATUS\G
  3. Для проверки статуса переменных сервера:
    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 восстанавливается автоматически при перезапуске.

  1. Проверить все таблицы базы данных:
    mysqlcheck -u root -p --all-databases
  2. Исправить повреждённые таблицы:
    mysqlcheck -u root -p --auto-repair --all-databases
  3. Или напрямую в 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';

Алексей Герзанов aka Gerzoid
Алекс Гезанов

Работаю в сервисном центре по ремонту и обслуживанию бытовой техники. За более чем 10 лет трудовой деятельности, я сталкивался с решением большого количества проблем в работе ОС Windows, периферийных устройств, бытовой техники, игровых консолей Playstation и т. д.

Добавить комментарий