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

> Сайт: allerrorcodes.ru · Факты сверены: 28.09.2026 · Обновлено: 28.09.2026 · Адрес: https://allerrorcodes.ru/mysql/

## Коротко

- Код ошибки MySQL — число (1045, 2002 и другие) с официальной формулировкой в справочнике dev.mysql.com.
- Главная причина большинства — неверные учётные данные, лимиты подключений или ошибка синтаксиса запроса.
- Первое действие — найти точный код через SHOW ERRORS или perror, затем свериться с таблицей ниже.
- Останавливайтесь и делайте резервную копию перед восстановлением таблиц или использованием innodb_force_recovery.

## Паспорт ошибки

| Параметр | Значение |
| --- | --- |
| Формат кода | число: серверные 1000+, клиентские 2000–2059; у каждого есть символьное имя и SQLSTATE |
| Где искать точно | dev.mysql.com Server/Client Error Message Reference, команда SHOW ERRORS, утилита perror |
| Актуальные версии | MySQL 8.4 LTS и 9.x — коды из таблицы совпадают для 5.7, 8.0, 8.4, 9.x |
| Самая частая причина 1045/2002 | неверный логин/пароль или сервер не запущен/недоступен по адресу |
| Первое действие | найти точный номер (SHOW ERRORS/журнал), сверить с официальным справочником по номеру |
| Риск | команды из таблицы не удаляют данные, кроме явных DELETE/DROP — их отмечено отдельно |
| Когда нужен специалист | повреждение InnoDB с innodb_force_recovery, потеря пароля root на проде, деградация после deadlock в высоконагруженной БД |

Код ошибки MySQL — это число вида **1045** или **2002**, которое сервер или клиент возвращают при сбое запроса или подключения. Серверные ошибки (1000–1999 и выше) описаны в официальном [Server Error Message Reference](https://dev.mysql.com/doc/mysql-errors/9.7/en/server-error-reference.html), клиентские (2000–2059) — в [Client Error Message Reference](https://dev.mysql.com/doc/mysql-errors/9.7/en/client-error-reference.html). Ниже — как быстро понять, что означает ваш код, и разбор самых частых ошибок с готовыми командами.

*Смотрите также: [расшифровка кодов ошибок PostgreSQL](https://allerrorcodes.ru/postgresql/).*

## Как найти значение своего кода ошибки MySQL

У каждой ошибки MySQL три идентификатора: числовой код (например, **1045**), символьное имя (**ER_ACCESS_DENIED_ERROR**) и строка SQLSTATE (например, **28000**). Приложения обычно показывают либо число, либо текст — иногда оба.

1. Если код известен — откройте официальный справочник по ссылке выше и найдите его по номеру (Ctrl+F).
2. Если код неизвестен, а есть только текст ошибки на английском — расшифровать его локально поможет утилита `perror`, входящая в дистрибутив MySQL: ``` perror --mysql-errno 1045 ```
3. Если в консоли MySQL произошла ошибка и нужны подробности — выполните: ``` SHOW ERRORS; SHOW WARNINGS; ```
4. Расположение файла журнала ошибок сервера: ``` SHOW VARIABLES LIKE 'log_error'; ``` По умолчанию на Linux — `/var/log/mysql/error.log`, на Windows — в каталоге данных MySQL.

> Версии MySQL 5.7, 8.0, 8.4 (LTS) и 9.x используют одни и те же числовые коды для большинства ошибок — таблица ниже актуальна для всех них. При переходе с 5.7 на 8.x часть ошибок 1064 (синтаксис) и 1406 (длина данных) может появиться из-за изменившихся режимов SQL по умолчанию.

## Причины появления ошибок MySQL

- Неверные учётные данные подключения (логин, пароль, хост).
- Превышение лимитов подключений или ресурсов сервера.
- Ошибки синтаксиса SQL-запросов.
- Нарушения целостности данных (дублирование ключей, NULL в NOT NULL полях).
- Повреждённые таблицы (в основном движок MyISAM).
- Недостаточно прав у пользователя БД.
- Переполнение дискового пространства.
- Взаимные блокировки (deadlock) в транзакциях InnoDB.

## Частые серверные ошибки MySQL (1000–1999)

| Код | Имя | Официальное сообщение | Что делать |
| --- | --- | --- | --- |
| **1040** | ER_CON_COUNT_ERROR | Too many connections | Увеличить `max_connections` в `my.cnf`; найти и завершить зависшие соединения: `SHOW PROCESSLIST;`, затем `KILL id;` |
| **1044** | ER_DBACCESS_DENIED_ERROR | Access denied for user to database | Выдать права: `GRANT ALL PRIVILEGES ON dbname.* TO 'user'@'host'; FLUSH PRIVILEGES;` |
| **1045** | ER_ACCESS_DENIED_ERROR | Access denied for user (using password: yes/no) | Проверить логин/пароль в конфигурации приложения; при утере пароля root — запустить сервер с `--skip-grant-tables` и сменить пароль (см. FAQ) |
| **1049** | ER_BAD_DB_ERROR | Unknown database | Создать БД: `CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` или проверить имя в строке подключения |
| **1054** | ER_BAD_FIELD_ERROR | Unknown column ‘x’ in ‘y’ | Проверить имя столбца: `DESCRIBE tablename;`; частая причина — опечатка или отсутствующий алиас таблицы в JOIN (например, `Unknown column 'company.id' in 'on clause'`) |
| **1062** | ER_DUP_ENTRY | Duplicate entry for key | Использовать `INSERT IGNORE` или `INSERT ... ON DUPLICATE KEY UPDATE`; найти дубликаты: `SELECT col, COUNT(*) FROM t GROUP BY col HAVING COUNT(*) > 1;` |
| **1064** | ER_PARSE_ERROR | SQL syntax error near ‘…’ | Проверить синтаксис в месте, указанном после «near»; частая причина — зарезервированное слово без обратных кавычек |
| **1099** | ER_TABLE_NOT_LOCKED_FOR_WRITE | Table was locked with a READ lock | `UNLOCK TABLES;` или проверить активные блокировки: `SHOW OPEN TABLES WHERE In_use > 0;` |
| **1114** | ER_RECORD_FILE_FULL | The table is full | Проверить свободное место на диске; для MyISAM — освободить место, для InnoDB — увеличить `innodb_data_file_path` |
| **1146** | ER_NO_SUCH_TABLE | Table doesn’t exist | Проверить имя таблицы: `SHOW TABLES;`; убедиться, что выбрана нужная БД: `USE dbname;` |
| **1153** | ER_NET_PACKET_TOO_LARGE | Got a packet bigger than max_allowed_packet | Увеличить в `my.cnf`: `max_allowed_packet = 64M`; для текущей сессии: `SET GLOBAL max_allowed_packet = 67108864;` |
| **1194** | ER_CRASHED_ON_USAGE | Table is 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`; найти блокирующий запрос: `SHOW ENGINE INNODB STATUS\G` → раздел TRANSACTIONS |
| **1213** | ER_LOCK_DEADLOCK | Deadlock found when trying to get lock | Повторить транзакцию — deadlock — штатная ситуация InnoDB; обращаться к таблицам в одном порядке во всех транзакциях |
| **1364** | ER_NO_DEFAULT_FOR_FIELD | Field doesn’t have a default value | `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 a parent row: foreign key constraint fails | Удалить сначала зависимые записи; или временно: `SET FOREIGN_KEY_CHECKS = 0;` удалить, затем `SET FOREIGN_KEY_CHECKS = 1;` |
| **1452** | ER_NO_REFERENCED_ROW_2 | Cannot add a child row: foreign key constraint fails | Убедиться, что связанная запись существует, или добавить её первой |

## Клиентские ошибки (2000–2059)

| Код | Имя | Официальное сообщение | Что делать |
| --- | --- | --- | --- |
| **2002** | CR_CONNECTION_ERROR | Can’t connect to local MySQL server through socket | Проверить, запущен ли сервер: `systemctl status mysql`; проверить host/port в строке подключения и параметр `bind-address` |
| **2006** | CR_SERVER_GONE_ERROR | MySQL server has gone away | Увеличить `wait_timeout` и `interactive_timeout`; проверить `max_allowed_packet`; добавить переподключение в приложении |

## Что означает голое «MySQL Error!» без номера

Старые самописные сайты и движки (в том числе DataLife Engine) иногда выводят собственный текст вида «MySQL Error! … Error number: 1 The error returned was: Connection refused» — это **не официальный код MySQL 1**, а необработанный системный номер ошибки соединения (errno операционной системы), который скрипт сам подставил в сообщение. Он соответствует ситуации клиентской ошибки 2002 (CR_CONNECTION_ERROR): сервер MySQL не запущен, слушает не тот порт/адрес или заблокирован файрволом. Проверьте, что служба MySQL работает, и что host/port в конфигурации сайта совпадают с реальными.

## Восстановление повреждённых таблиц

Таблицы MyISAM могут повреждаться при некорректном завершении работы MySQL. InnoDB восстанавливается автоматически при перезапуске.

1. Проверить все таблицы: ``` mysqlcheck -u root -p --all-databases ```
2. Исправить повреждённые: ``` mysqlcheck -u root -p --auto-repair --all-databases ```
3. Или напрямую в консоли: ``` CHECK TABLE tablename; REPAIR TABLE tablename; ```

## Что делать, если ничего не помогло

- Проверьте журнал ошибок MySQL (путь — см. раздел выше).
- Восстановите базу из резервной копии: `mysqldump -u root -p dbname > backup.sql` — делайте бэкапы регулярно, а не только при сбое.
- При ошибках InnoDB и невозможности запуска сервера — временно включите `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';`

> Ошибки вида `DB::Exception` с кодом «code: 392», «code: 6», «code: 207» — это не MySQL, а сервер **ClickHouse**. У ClickHouse собственная нумерация ошибок и протокол на порту 9000 — ищите расшифровку в официальной документации ClickHouse, а не в справочнике MySQL.

## Частые вопросы

### Ошибка 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/9.x.

### Что такое deadlock (1213) и как его избежать?

Взаимная блокировка — транзакция A ждёт ресурс, занятый транзакцией B, и наоборот. InnoDB разрешает её автоматически, отменяя одну из транзакций. Чтобы снизить частоту: обращайтесь к таблицам в одном порядке во всех транзакциях, уменьшайте их длительность, добавьте повтор запроса при получении этой ошибки.

### Ошибка 2002 — MySQL не запускается на Windows?

Проверьте в диспетчере служб, запущена ли служба MySQL80/MySQL84. Посмотрите журнал ошибок в каталоге данных (обычно `C:\ProgramData\MySQL\MySQL Server 8.0\Data\`). Частая причина — порт 3306 занят другим процессом.

### Коды ошибок одинаковы в MySQL и MariaDB?

Для основных серверных ошибок (1000–2000-е, в том числе все из таблицы выше) — да, MariaDB сохраняет совместимость с нумерацией MySQL. Собственные ошибки MariaDB (начиная с 4000-х номеров) в справочнике MySQL не ищите — там отдельная документация MariaDB.

### Как правильно задать права пользователя MySQL?

Минимальный набор для CMS (WordPress, Bitrix, DLE):

```
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON dbname.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
```

Посмотреть текущие права: `SHOW GRANTS FOR 'user'@'localhost';`

## Источники

- [MySQL Server Error Message Reference (официальный)](https://dev.mysql.com/doc/mysql-errors/9.7/en/server-error-reference.html)
- [MySQL Client Error Message Reference (официальный)](https://dev.mysql.com/doc/mysql-errors/9.7/en/client-error-reference.html)

## Ещё по теме

- [Не устанавливается обновление Windows: причины и как исправить](https://allerrorcodes.ru/kb5008212/): Обновление зависло или выдаёт ошибку — сначала запустите встроенное средство устранения неполадок Windows Update (в Windows 11: «Параметры» → «Система» → «Устранение неполадок»; в Windows 10: «Параметры» → «Обновление и безопасность» → «Устранение неполадок»).
- [Не работает кнопка Пуск в Windows 10 и 11 — причины и решение](https://allerrorcodes.ru/chto-delat-esli-ne-rabotaet-knopka-pusk-v-windows-10/): Меню «Пуск» в Windows 10 и 11 — отдельное UWP-приложение StartMenuExperienceHost; когда оно не установлено или не запускается для вашего пользователя, кнопка не реагирует.
- [Ошибка 0x80072F8F в Windows 10 и 11 — причины и способы исправления](https://allerrorcodes.ru/ustranenie-oshibki-obnovleniya-windows-0x80072f8f/): 0x80072F8F — ошибка SSL-соединения с серверами Microsoft: система не может проверить сертификат сервера.
- [Google Chrome не запускается в Windows 10 и 11 — причины и решение](https://allerrorcodes.ru/pochemu-ne-zapuskaetsya-google-chrome-v-windows/): Если Chrome не реагирует на запуск — вероятно, в фоне уже висит зависший процесс chrome.exe; завершите все его процессы в Диспетчере задач и запустите снова.
