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

Я изменил datadir установки MySQL, и после некоторых шагов он работал нормально. Каждая база, которую я имел, была перемещена правильно, кроме одной.

Я могу подключиться и использовать базу данных, даже SHOW TABLES возвращает мне все таблицы правильно, и файлы каждой таблицы существуют в каталоге данных mysql. Но когда я пытаюсь выбрать что-то там, он говорит, что таблица не существует. Но таблица существует, она даже показана в операторе 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

35 ответов

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

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

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

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

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

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

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

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

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

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

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
  1. остановить MySQL
  2. резервная папка mysql: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. скопировать папку базы данных со старой машины на /var/lib/mysql
  4. переопределить ib* (ib_logfile*, ibdata) из старой базы данных
  5. начать MySQL
  6. свалка базы данных
  7. mysqldump >dbase.mysql
  8. остановить службу MySQL
  9. Удалить /var/lib/mysql
  10. переименовать /var/lib/mysql-backup в /var/lib/mysql
  11. начать MySQL
  12. создать базу данных
  13. mysqldump < dbase.mysql

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

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 позволяет использовать юникод и непечатаемые символы в имени таблицы. Если вы создали свои таблицы, скопировав код создания из какого-либо документа / веб-сайта, есть вероятность, что у него где-то будет пространство с нулевой шириной.

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

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

$ sudo service mysql restart

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

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

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

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

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

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

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

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

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

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

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

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

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

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

SELECT * FROM `table`

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

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

Удачи.

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

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

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

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

  3. удалять ib_logfile0 а также ib_logfile1

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

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

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

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

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

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

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

  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;

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

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

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

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

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

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

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

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

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

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

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

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

Я переустановил свою ОС (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

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

В моем случае это было 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)

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

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

Это значило

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

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

RENAME TABLE ` Customer` TO `Customer`;

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

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

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

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

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

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

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

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

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

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

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

innodb-page-size=65536

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

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

Другие вопросы по тегам