#Что означает ошибка
Table doesn't exist
Ошибка MySQL 1146 «Table doesn't exist» означает, что запрос обращается к таблице, которой нет в выбранной базе. Причины: запрос выполняется в другой базе, таблица не создана или удалена, регистр имени не совпадает (на Linux имена таблиц чувствительны к регистру) или файлы таблицы InnoDB повреждены.
Начните с проверки текущей базы и списка таблиц.
Потом сверьте регистр и префиксы.
Таблица не найдена: неверная база, регистр имени в Linux или не применены миграции. Проверьте USE и SHOW TABLES.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Не та базаUSE. | 1146. | Выберите. |
| Регистр имениLinux. | 1146. | Исправьте. |
| Нет миграцийСхема. | 1146. | Примените. |
| Повреждена таблицаInnoDB. | 1146. | Восстановите. |
#Пошаговое решение
- Проверьте базуВ phpMyAdmin сначала выберите слева именно базу, используемую приложением, затем откройте вкладку «SQL» и выполните
SELECT DATABASE();. В MySQL CLI после входа выполните ту же команду. Если результатNULLили имя не то, выберите правильную базу черезUSE имя_базы;(имя берите из конфигурации проекта) и повторите исходный запрос без изменения таблиц. - Найдите таблицуВо вкладке «Структура» выбранной базы посмотрите фактические имена таблиц. В SQL можно выполнить
SHOW TABLES;или прочитатьinformation_schema.tables, не изменяя данные. Если предполагаемая таблица отсутствует, не создавайте пустую таблицу с таким именем наугад: проверьте, завершились ли миграции и импорт первоначальной схемы. - Сверьте регистр и префиксСверьте точное написание, регистр букв и префикс имени таблицы с SQL приложения. На Linux имена таблиц нередко чувствительны к регистру, а WordPress и другие системы используют настраиваемый префикс. Исправьте имя в запросе или соответствующей конфигурации, не переименовывая рабочие таблицы без резервной копии и учёта внешних ключей.
- Проверьте импорт дампаЕсли ошибка появилась после переноса, откройте журнал импорта в панели базы или вывод
mysqlи выясните, на какомCREATE TABLE/INSERTпроцесс остановился. Проверьте, соответствует ли дамп выбранной базе и достаточно ли места. Перед повторным импортом сохраните текущее состояние и используйте отдельную тестовую базу: повторный импорт поверх действующей базы может дублировать данные. - Проверьте журнал MySQLЕсли таблица видна, но обращение к ней по-прежнему вызывает ошибки, проверьте полное сообщение MySQL и журнал службы (
journalctl -u mysqlили журнал хостинга). Для InnoDB не применяйтеREPAIR TABLEкак универсальное лечение: выясните, не повреждены ли файлы, есть ли резервная копия и не требуется ли восстановление всего экземпляра. Повторно выполните безопасный SELECT после исправления причины.
#Проверка
Выполните SELECT DATABASE(); и SHOW TABLES LIKE '%имя%';. Если таблицы нет, проверьте, подключаетесь ли вы к нужной базе (параметры DB_NAME в конфиге приложения). Для CMS проверьте префикс таблиц (wp_, jos_). Выведите все таблицы всех баз: SELECT table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%имя%';.
#Регистр и перенос
На Linux имена таблиц чувствительны к регистру (lower_case_table_names=0), а на Windows нет: после переноса с Windows на Linux таблица Users не равна users. Переименуйте: RENAME TABLE Users TO users; или задайте lower_case_table_names=1 до инициализации сервера. Убедитесь, что дамп импортирован полностью: mysql -u user -p db < dump.sql и проверьте логи импорта.
#Повреждения
Если таблица есть в SHOW TABLES, но запрос даёт 1146, а в журнале Table ... doesn't exist in engine, файлы InnoDB повреждены или словарь не соответствует файлам. Остановите приложение, сделайте копию каталога данных, проверьте journalctl -u mysql и восстановите из резервной копии. Для MyISAM выполните REPAIR TABLE имя;. Режим innodb_force_recovery (1–3) позволяет выгрузить данные с помощью mysqldump.
SELECT DATABASE();SELECT table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%users%';