MySQL> Таблица не существует. Но это делает (или должно)

261

Я изменил каталог данных установки MySQL, и все базы переместились правильно, кроме одной. Я могу подключить и USEбазу данных. SHOW TABLESтакже возвращает мне все таблицы правильно, и файлы каждой таблицы существуют в каталоге данных MySQL.

Тем не менее, когда я пытаюсь SELECTчто-то из таблицы, я получаю сообщение об ошибке, что таблица не существует. Тем не менее, это не имеет смысла, так как я смог показать ту же таблицу через SHOW TABLESутверждение.

Я предполагаю, что SHOW TABLESперечисляет существование файла, но не проверяет, поврежден файл или нет. Следовательно, я могу перечислить эти файлы, но не получить к ним доступ.

Тем не менее, это всего лишь предположение. Я никогда не видел этого раньше. Теперь я не могу перезапустить базу данных для тестирования, но все остальные приложения, которые ее используют, работают нормально. Но это только предположение, я никогда не видел этого раньше.

Кто-нибудь знает, почему это происходит?

Пример:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist
Джон Смит
источник
Вы восстанавливаете базу данных из резервной копии? или вы просто скопировали файлы БД? у вас есть root-доступ к серверу mysql?
alinoz
просто скопировал файлы! да, у меня есть root-доступ ко всему
johnsmith
Можете ли вы попробовать: mysql_fix_privilege_tables
alinoz
4
это таблицы innodb?
Пол Диксон
1
Да, все таблицы InnoDB. Мой плохой, что не сказал этого!
Джонсмит

Ответы:

263

На тот случай, если кому-то все равно

У меня была такая же проблема после копирования каталога базы данных напрямую с помощью команды

cp -r /path/to/my/database /var/lib/mysql/new_database

Если вы сделаете это с базой данных, которая использует InnoDBтаблицы, вы получите эту безумную ошибку «таблица не существует», упомянутую выше.

Проблема в том, что вам нужны ib*файлы в корне каталога данных MySQL (например ibdata1, ib_logfile0и ib_logfile1).

Когда я копировал те, это работало на меня.

Майк Дакр
источник
27
Спас мою жизнь! Для других просто не перезаписывайте существующие файлы ib *, если вы пытаетесь скопировать в новую установку. Сделайте резервную копию существующего каталога mysql /, замените старый, который вы хотите восстановить, mysqldump all, затем восстановите новый mysql /. Затем вы можете импортировать mysqldumps правильно.
Мэтью
1
На Mac для репликации моей базы данных локально, в дополнение к копированию по файлу ibdata (расположенному рядом с dir базы данных), мне нужно было chown _mysql:wheelуказать имя базы данных dir, ibdata и все файлы в dir (использовать chown -R ...). Точно так же разрешения были неправильными внутри chmod -R 660 databasenameдиректории, поэтому были необходимы, чтобы таблицы отображались в базе данных.
Дилан Валаде
4
Спасибо майк Просто чтобы уточнить, вам нужно будет перезапустить службу MySQL, чтобы это заработало. По крайней мере, я сделал, и слава богу, это сработало. Там хранится много данных!
Ник Мартин
15
ПРИМЕЧАНИЕ: не забудьте использовать chown!!! Итак, все после cpиспользования этой команды ->chown mysql:mysql /var/lib/mysql/ -R
K-Gun
1
ПРИМЕЧАНИЕ 2: Не забудьте применить соответствующее разрешение. В моем случае sudo chmod -R 600 /var/lib/mysql
Август
45

Для меня в Mac OS (установка MySQL DMG) простой перезапуск сервера MySQL решил проблему. Я предполагаю, что гибернация вызвала это.

Мартин
источник
Спасибо также исправил эту проблему для меня. Мой произошел после того, как моя машина отключилась из-за внезапной потери питания. После первого перезапуска машины / запуска MySQL я получил ошибку. Затем я читаю этот ответ. Я остановил / запустил MySQL через Системные настройки, и это было исправлено.
Джефф Эванс
2
sudo /usr/local/mysql/support-files/mysql.server restart
Laffuste
Точно так же. Я столкнулся с этим после обновления до macOS Sierra 10.12.6. Не уверен, что есть причинно-следственная связь, но время кажется подозрительным.
Дейв Маллиган
Спасибо, работал в некоторой степени; я перезапустил службу mysql (5.6, windows), затем запустился. check table TABLE_ONE;У меня возникли ошибки: «ошибка раздела p2 возвращена», «idx_blah_1 помечен как поврежденный» и «idx_blah_2 помечен как поврежденный». Теперь я вернулся к работе optimize table TABLE_ONE;и получаю сообщение об ошибке «Таблица« database.TABLE_ONE »не существует».
Омар
Запуск MySLQ на Мохаве. Перезапуск через панель системных настроек не сработал. Мне пришлось перезагрузить через командную строку.
Cortex
30

Я получаю эту проблему, когда случай для имени таблицы, которую я использую, выключен. Таким образом, таблица называется 'db', но я использовал 'DB' в операторе выбора. Убедитесь, что дело такое же.

dkinzer
источник
13
+1 Имена полей не чувствительны к регистру, но имена таблиц. Распространенная ошибка и очень раздражающая.
GolezTrol
27

Эта ошибка может также возникнуть при установке lower_case_table_namesна 1, а затем пытается доступ к таблицам , которые были созданы со значением по умолчанию для этой переменной. В этом случае вы можете вернуть его к предыдущему значению, и вы сможете прочитать таблицу.

golimar
источник
4
Это укусила меня Я вернул значение, перезапустил базу данных, экспортировал таблицы, установил значение обратно в 1, перезапустил базу данных, повторно импортировал таблицы, и все снова заработало.
wmarbut
17
  1. остановить MySQL
  2. резервная копия папки mysql: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. скопировать папку базы данных со старой машины на /var/lib/mysql
  4. переопределить ib * (ib_logfile *, ibdata) из старой базы данных
  5. начать mysqld
  6. свалка базы данных
  7. mysqldump >dbase.mysql
  8. остановить службу MySQL
  9. удалять /var/lib/mysql
  10. переименовать /var/lib/mysql-backupв/var/lib/mysql
  11. начать mysqld
  12. создать базу данных
  13. mysqldump < dbase.mysql
user1772382
источник
В моем случае мне также пришлось сделать: 10.5 удалить каталог <db_name> из / var / lib / mysql /
Тони Технический
это не работает. :( таблицы 'tablename.wp_posts' не существует
Джахирул Ислам Мамун
14

Пожалуйста, запустите запрос:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

К сожалению, MySQL позволяет использовать юникод и непечатаемые символы в имени таблицы. Если вы создали свои таблицы, скопировав код создания из какого-либо документа / веб-сайта, есть вероятность, что у него где-то будет пространство с нулевой шириной.

DEV-нуль-обитатель
источник
очень полезный пост, спасибо! но все таблицы ASCII с правильной длиной имени
johnsmith
12

Я только что провел три дня в этом кошмаре. В идеале у вас должна быть резервная копия, которую вы можете восстановить, а затем просто удалить поврежденную таблицу. Такого рода ошибки могут привести к тому, ibdata1 вырастить огромный (100GB + в размере скромных таблиц)

Если у вас нет последней резервной копии, например, если вы полагались на mySqlDump, то ваши резервные копии, вероятно, молча сломались в какой-то момент в прошлом. Вам нужно будет экспортировать базы данных, что, конечно, вы не можете сделать, потому что вы получите ошибки блокировки при запуске mySqlDump.

Итак, в качестве обходного пути, перейдите /var/log/mysql/database_name/и удалите table_name. *

Затем немедленно попытайтесь сбросить стол; делать это теперь должно работать. Теперь восстановите базу данных в новую базу данных и восстановите отсутствующие таблицы. Затем сбросьте битую базу данных.

В нашем случае мы также постоянно получали mysql has gone awayсообщения через произвольные интервалы во всех базах данных; После того, как поврежденная база данных была удалена, все вернулось в нормальное состояние.

Энди
источник
Спасибо, Энди, я понял, с какой проблемой я столкнулся. Я перенес ibdata1 с диска C на диск D, чтобы сэкономить место на диске C. К счастью, после прочтения ваших комментариев я получил ibdata1 (вместе с файлом ib_logfile1. И файлом ib_logfile0) на диске D. Теперь посмотрим, откуда я переместил эти файлы и восстановил их там. Тогда, надеюсь, мои столы вернутся.
AKS
Как вы «немедленно пытаетесь сбросить стол»? У меня та же проблема, нет резервных копий, поэтому я ищу способ получить структуру таблицы хотя бы, но если вы удалите файлы из каталога, то все просто исчезнет?
mmvsbg
Это сделал это! Спасибо,
jstuardo
11

Я не знаю причину, но в моем случае я решил отключить и включить проверку внешних ключей

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
Бруно Капони
источник
4
Спасибо брат! В моем случае мне пришлось отключить foreign_key_checks и выполнить запрос выбора для исчезающей таблицы, после чего таблица снова стала нормальной. Я думаю, что есть некоторые нарушения внешнего ключа в строках данных, потому что у меня была прерванная программа до того, как возникла эта проблема.
Эгист Ли
Еще не удалось выяснить, почему именно, но это также решило мою проблему
Мирослав Гламузина
11

У меня была такая же проблема, и я искал 2-3 дня, но решение для меня было действительно глупым.

Перезапустите MySQL

$ sudo service mysql restart

Теперь таблицы становятся доступными.

Сирадж Алам
источник
1
Полностью сработал для меня, хотя моя команда была немного другой: $ sudo /usr/local/mysql/support-files/mysql.server restart
KirstieBallance
Это должно быть в верхней части списка вещей, чтобы попробовать, я думаю. Стоит выстрел, и в моем случае это сработало.
Coroos
7

Хорошо, это будет звучать довольно абсурдно, но пошути меня.
Для меня проблема была решена, когда я изменил свое утверждение на это:

SELECT * FROM `table`

Я сделал два изменения
1.) Сделал имя таблицы строчными - я знаю !!
2.) Использовал определенный символ кавычки = ` : это ключ над вашей вкладкой

Решение звучит абсурдно, но оно сработало, и сегодня субботний вечер, и я работаю с 9 утра - так что я возьму это :)

Удачи.

PlanetUnknown
источник
1
Просто к сведению - таблица MyISAM, а не INNO
PlanetUnknown
1
Также `называется обратным ударом
Гари
7

У меня была эта проблема после обновления WAMP, но не было резервной копии базы данных.

Это сработало для меня:

  1. Стоп новый WAMP

  2. Скопируйте нужные вам каталоги базы данных и файл ibdata1 из старой установки WAMP

  3. Удалить ib_logfile0иib_logfile1

  4. Запустить WAMP

Теперь вы сможете создавать резервные копии своих баз данных. Однако после перезапуска вашего сервера у вас все равно будут проблемы. Так что теперь переустановите WAMP и импортируйте ваши базы данных.

икей говорит восстановить монику
источник
Я хотел бы, чтобы люди указывали, где находятся файлы, на которые они ссылаются ...
MagentoAaron
Получил здесь из образа Docker MySQL, не имея читаемых таблиц. Можно подтвердить, что остановка изображения, удаление этих файлов и перезапуск дали доступ снова.
Энтони Харли
7

Попробуйте выполнить sql запрос, чтобы отбросить табличное пространство перед копированием idb-файла:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Скопировать idb-файл

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Перезапустите MySql

l0pan
источник
Вы спасли меня :)
l00k
@ I0pan Я попробовал те же шаги, что и упомянутые. Но после ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; это показывает, что таблица не существует. Но это так :(
Сайед Асад Аббас Заиди
5

После переустановки MySQL у меня возникла такая же проблема, кажется, что во время установки некоторые файлы конфигурации, которые хранят данные о файлах журналов InnoDB, эти файлы ib_logfile * (они являются файлами журналов, верно?), Перезаписываются. Чтобы решить эту проблему, я просто удалил файлы ib_logfile *.

JCM
источник
5

Что сработало для меня, так это просто уронить стол, хотя его не было. Затем я заново создал таблицу и заново заполнил ее из дампа SQL, сделанного ранее.

Должна быть некоторая метабаза имен таблиц, и, скорее всего, она все еще существовала там, пока я ее не отбросил.

Zoobra McFly
источник
Я создал процедуру, понял, что это должно быть представление. Поэтому я переименовал процедуру с некоторыми zzz в конце, чтобы иметь ее для справки и создал вид с тем же именем. Не удалось получить SELECT, чтобы увидеть это, получил эту ошибку. <br> Скопировал код в текстовый файл, удалил как представление, так и процедуру. Воссоздали вид и все было хорошо. <br> Так что да - семь лет спустя - в некоторых крайних случаях все еще происходит какое-то действие с призраком / кэшированным именем.
Роджер Крюгер
5

Была похожая проблема с призрачной таблицей. К счастью, был дамп SQL до сбоя.

В моем случае мне пришлось:

  1. Остановите MySQL
  2. Переместить ib * файлы из /var/mysqlрезервной копии в резервную
  3. Удалить /var/mysql/{dbname}
  4. Перезапустите MySQL
  5. Воссоздать пустую базу данных
  6. Восстановить файл дампа

ПРИМЕЧАНИЕ. Требуется файл дампа.

Оли Стокман
источник
Я думаю, что вы имеете в виду /var/lib/mysqlвместо/var/mysql
knocte
Удаление каталогов базы данных и восстановление из резервной копии было единственным, что мне помогло.
Яно
3
  1. Сделать mysqldump в базу данных:

    mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
  2. Восстановить базу данных

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql

Теперь все таблицы в базе данных были полностью восстановлены. Пытаться..

SELECT * FROM dbname.tablename;
Zaw Htoon
источник
2

Я установил MariaDB на новый компьютер, остановил службу Mysql и переименовал папку данных в данные. Я решил свою проблему, скопировав только Mysql \ data \ table_folders и ibdata1 из сбойной папки данных HD MySql в новую установленную папку данных mysql.

Я пропустил ib_logfile0 и ib_logfile1 (в противном случае сервер не запустил службу)

Запущен MySQL сервис.

Затем сервер работает.

Тони
источник
2

Похоже, что проблема связана (по крайней мере, в моем и нескольких других) с неверными (поврежденными?) Файлами журнала innodb. Вообще говоря, их просто нужно воссоздать.

Вот решения, большинство из которых требуют перезапуска mysql.

  • Воссоздайте свои файлы журнала ( Удалите и перезапустите mysql )
  • Измените размер ваших файлов журнала (MySql 5.6+ восстановит файл для вас)
  • Если вы выполняете какой-либо тип миграции данных, убедитесь, что вы правильно перенесли нужный файл и дали ему разрешения, как уже заявили другие
  • Проверьте разрешения ваших данных и файлов журналов, что mysql является владельцем обоих
  • Если ничего не помогает, вам, вероятно, придется заново создать базу данных.
SeanDowney
источник
2

Вот еще один сценарий (обновление версии) :

Я переустановил свою ОС (Mac OS El Captain) и установил новую версию mysql (используя homebrew). Установленная версия (5.7) оказалась новее, чем моя предыдущая. Затем я скопировал таблицы, включая файлы ib *, и перезапустил сервер. Я мог видеть таблицы в MySQL Workbench, но когда я попытался что-то выбрать, я получил «Таблица не существует».

Решение:

  1. остановите сервер MySQL, например, mysql.server stopилиbrew services stop mysql
  2. запустить сервер с помощью mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/(при необходимости измените путь)
  3. запустить mysql_upgrade -u root -p password(в другом окне терминала)
  4. выключить работающий сервер mysqladmin -u root -p password shutdown
  5. перезагрузите сервер в обычном режиме mysql.server startилиbrew services start mysql

Соответствующие документы здесь .

Роман Кутлак
источник
Очень много пробовал, но это было единственное, что мне очень помогло после того, как я перешел на новый сервер со всеми моими базами данных. Спасибо! (Ubuntu 16.04)
Фальк
2

В моем случае я определил триггер для таблицы, а затем пытался вставить строку в таблицу. похоже, что каким-то образом триггер был ошибочным, и, следовательно, вставка выдавала ошибку, таблица не существует.

Йогеш Кумар Гупта
источник
1
Это работает для меня! Проверил каждый триггер и нашел, что один триггер нуждается в улучшении, и это сработало!
Пареш
1

Возможно, у вас есть скрытый символ в имени таблицы. Те не появляются, когда вы делаете шоу таблицы. Можете ли вы сделать «SHOW CREATE TABLE TABLE_ONE» и завершить вкладку «TABLE_ONE» и посмотреть, вставит ли она какие-нибудь скрытые символы. Кроме того, вы пытались сбросить и переделать таблицы. Просто чтобы убедиться, что ничего не случилось с привилегиями и что нет скрытых персонажей.

Hoopdady
источник
Заполнение вкладок не помогает, и я не могу показать создание таблицы, потому что таблица "не существует". из ада
Джонсон
1

Точно такая же проблема после импорта резервной копии TimeMachine. Мое решение состояло в том, чтобы остановить сервер MySQL и исправить разрешения на чтение и запись для файлов ib *.

user3415481
источник
1

Еще один ответ, который, я думаю, стоит упомянуть здесь (потому что я пришел сюда с той же проблемой, и это оказалось ответом для меня):

Дважды убедитесь, что имя таблицы в вашем запросе написано точно так же как в базе данных.

Вроде бы что-то новенькое, но такие вещи, как «пользователь» против «пользователи», могут сбить с толку людей, и я подумал, что было бы полезным найти ответ в этом списке. :)

vazor
источник
1

В моем случае, когда я импортировал экспортированный файл sql, я получил сообщение об ошибке, например, что таблица не существует для запроса создания таблицы.

Я понял, что в имени моей базы данных есть подчеркивание, и mysql помещал escape-символ как раз перед этим.

Таким образом, я удалил это подчеркивание в имени базы данных, все получилось.

Надеюсь, это поможет кому-то еще.

Онур Кучукчече
источник
1

Мой стол был как-то переименован в ' Customers'ie с пробелом

Это значило

а) запросы разбиты

б) таблица не появилась там, где ожидалось, в алфавитном порядке моих таблиц, что в панике означало, что я ее не вижу!

RENAME TABLE ` Customer` TO `Customer`;
zzapper
источник
1

В моем случае это было SQLCA.DBParm параметр.

я использовал

SQLCA.DBParm = "Databse = "sle_database.text""

но это должно быть

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

Объяснение:

Вы собираетесь объединить три строки:

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

Не используйте пробелы в четвертях. Спасибо моему коллеге Яну.

Marek
источник
1

Перейдите: xampp\mysql\data\dbname
внутри dbname есть файл tablename.frm и tablename.ibd.
удалите его и перезапустите mysql и попробуйте снова.

Абу Суфиан
источник
1

Скопируйте только ibdata1файл из старого каталога данных. Не копируйте ib_logfile1или ib_logfile0файлы. Это приведет к тому, что MySQL больше не будет запускаться.

Плабон Датта
источник
1

Пришла сегодня такая же проблема. Это mysql «Чувствительность к регистру идентификатора».

Пожалуйста, проверьте соответствующий файл данных. Весьма вероятно, что имя файла в файловой системе в нижнем регистре, а имя таблицы, указанное в команде «show tables», в верхнем регистре. Если системная переменная " lower_case_table_names" равна 0, запрос возвратит "таблица не существует", потому что сравнения имен чувствительны к регистру, когда " lower_case_table_names" равно 0.

Хадсон Лян
источник
1

У меня была такая же проблема в Windows. В дополнение к копированию файлов ib * и каталога mysql в каталоге данных thd мне также пришлось сопоставить файл my.ini.

В файле my.ini из моей предыдущей установки не было следующей строки:

innodb-page-size=65536

Но моя новая установка сделала. Возможно, потому что у меня не было этой опции в старом установщике. Я удалил это и перезапустил службу, и таблицы работали как ожидалось. Вкратце, убедитесь, что новый файл my.ini является точной копией старого, за исключением datadir, plugin-dir и port #, в зависимости от вашей новой установки.

Раджеш Тэннан
источник