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

215

Я изменил 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
  • 0
    Вы восстанавливаете базу данных из резервной копии? или вы просто скопировали файлы БД? у вас есть root-доступ к серверу mysql?
  • 0
    просто скопировал файлы! да у меня есть root-доступ ко всему
Показать ещё 11 комментариев
Теги:
exists
database-table

33 ответа

228

На всякий случай все еще заботятся:

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

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

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

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

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

  • 24
    Спас мою жизнь! Для других просто не перезаписывайте существующие файлы ib *, если вы пытаетесь скопировать в новую установку. Сделайте резервную копию существующего каталога mysql /, замените старый, который вы хотите восстановить, mysqldump all, затем восстановите новый mysql /. Затем вы можете импортировать mysqldumps правильно.
  • 1
    На Mac для репликации моей базы данных локально, в дополнение к копированию через файл ibdata (расположенный рядом с dir базы данных), мне пришлось chown _mysql:wheel dir базы данных, ibdata и все файлы в dir (используйте chown -R ... ). Точно так же разрешения были неверными внутри dir, поэтому для получения таблиц, отображаемых в chmod -R 660 databasename требовалось имя chmod -R 660 databasename .
Показать ещё 20 комментариев
37

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

  • 0
    Спасибо также исправил эту проблему для меня. Мой произошел после того, как моя машина отключилась из-за внезапной потери питания. После первой перезагрузки компьютера / запуска MySQL я получил ошибку. Затем я читаю этот ответ. Я остановил / запустил MySQL через Системные настройки, и это было исправлено.
  • 2
    sudo /usr/local/mysql/support-files/mysql.server restart
Показать ещё 5 комментариев
23

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

  • 3
    Это укусила меня Я вернул значение, перезапустил базу данных, экспортировал таблицы, установил значение обратно в 1, перезапустил базу данных, повторно импортировал таблицы, и все снова заработало.
22

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

  • 10
    +1 Имена полей не чувствительны к регистру, но имена таблиц. Распространенная ошибка и очень раздражающая.
  • 2
    пробовал оба пути!
Показать ещё 1 комментарий
14
  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
  • 0
    В моем случае мне также пришлось сделать: 10.5 удалить каталог <db_name> из / var / lib / mysql /
12

Запустите запрос:

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

  • 0
    очень полезный пост, спасибо! но все таблицы ASCII с правильной длиной имени
9

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

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

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

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

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

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

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

Перезагрузите mysql

$ sudo service mysql restart

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

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

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

SELECT * FROM `table`

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

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

Удачи.

  • 1
    Просто к сведению - таблица MyISAM, а не INNO
  • 1
    Также `называется обратным ударом
Показать ещё 1 комментарий
7

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

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Копировать idb файл

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Перезагрузка MySql

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

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

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

  • Остановить новый WAMP

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

  • Удалить ib_logfile0 и ib_logfile1

  • Запустите WAMP

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

  • 1
    Это стоило тысячи очков.
  • 0
    Я хотел бы, чтобы люди указывали, где находятся файлы, на которые они ссылаются ...
5

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

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

  • Остановить mySQL
  • Перенесите ib * файлы из /var/mysql в резервную копию
  • Удалить /var/mysql/{dbname}
  • Перезагрузка mySQL
  • Восстановить пустую базу данных
  • Восстановить файл дампа

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

  • 0
    Я предполагаю, что вы имеете в виду /var/lib/mysql вместо /var/mysql
  • 0
    Удаление каталогов базы данных и восстановление из резервной копии было единственным, что мне помогло.
5

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

3

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

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
  • 1
    Спасибо брат! В моем случае мне пришлось отключить foreign_key_checks и выполнить запрос выбора для исчезающей таблицы, после чего таблица снова стала нормальной. Я думаю, что есть некоторые нарушения внешнего ключа в строках данных, потому что у меня была прерванная программа до того, как возникла эта проблема.
  • 0
    Это спасло меня. Большое спасибо.
Показать ещё 1 комментарий
3

То, что сработало для меня, просто отбросило таблицу, хотя она не существовала. Затем я создал таблицу и заново заполнил сделанный ранее sql файл.

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

2
  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;
2

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

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

Решение:

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

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

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

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

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

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

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

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

Запустил службу mysql.

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

1

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

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

1

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

  • 1
    Спасибо, работал на себя.
1

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

1

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

1

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

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

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

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

1

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

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

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

1

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

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)

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

1

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

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

Вам не хватает символа на вашем столе, когда вы набираете его. Выполните следующее:

mysql> show tables;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             | Double click on TABLE_ONE and copy*
| TABLE_TWO             | (*You'd get the correct string)
| TABLE_THREE           |
+-----------------------+

mysql> SELECT * paste_your_copied_table;

Если таблицы отображаются в MySQL, то он существует. Это должно работать!

0

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

Это означало

a) запросы сломались

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

RENAME TABLE ` Customer` TO `Customer`;
0

В моем случае у меня было это без переноса данных или каких-либо манипуляций с файлами. Просто случилось одно прекрасное утро.

Так как мне любопытно, что мне удалось сбросить таблицу, используя mysqldump, несмотря на то, что MySQL иногда жаловался на то, что "таблица не существует", я разрешил ее, сбросив данные схемы + таблицы, затем DROP-ing the table, и повторно запустите CREATE, после чего следует импорт.

0

Если в названии таблицы есть период, она не будет SELECT * FROM poorly_named.table;

Используйте обратные ссылки, чтобы найти таблицу SELECT * FROM `poorly_named.table`;

0

У меня была та же проблема, но это было не из-за скрытого символа или "таблицы schroedinger". Проблема (как указано выше) появилась после восстановления. Я использую администратор MySQL версии 1.2.16. Когда восстановление должно быть выполнено, вы должны снять флажок ORIGINAL в целевой схеме и выбрать имя своей базы данных из раскрывающегося списка. После этого проблема была исправлена. По крайней мере, это была причина в моей базе данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню