В MySQL Table нет ошибки, но она существует
Кто-нибудь знает, при каких условиях вы можете получить ошибку 1146: Table '<database>.<table>' doesn't exist
, когда ваша таблица действительно существует?
Я использую тот же код на 5 серверах, только тот, который я недавно арендовал, показывает эту ошибку, поэтому я подозреваю, что это могут быть настройки или установка какой-либо ошибки. Я могу выполнить свою инструкцию sql из командной строки. Я тоже, очевидно, вижу таблицу из командной строки. Я не получаю никаких ошибок при подключении (я использую mysqli, btw).
Любая помощь будет оценена.
точный запрос:
$sql = "SELECT DISTINCT(mm_dic_word) AS word FROM spider.mm_dictionary WHERE mm_dic_deleted=0";
Ответы
Ответ 1
В принципе, я считаю, что проблема, с которой я столкнулся, связана с различием длин хэш-кода. В моем случае у меня появился новый сервер, на нем был полный дамп mysql, который также передавал пароли и информацию о пользователе. Новый сервер уже был инициализирован корневым пользователем с хэш-длиной 16char, но мой старый сервер использовал более длинные длины хэшей 32 char.
Мне пришлось зайти в my.conf, чтобы установить старые настройки паролей в 0 (другой разумный каждый раз, когда я пытался обновлять базу данных, новое обновление было 16 символов в длину). Затем я обновил все пароли, чтобы они были одинаковыми с помощью команды UPDATE mysql.user SET password=PASSWORD('password here');
, затем я сбросил привилегии.
Очевидно, что каждый пользователь с одним и тем же паролем - действительно плохая идея, поэтому я поменял их один за другим после того, как подтвердил, что он работает.
Я набрал запись в блоге, которая затрагивает некоторые другие вещи, которые я сделал, которые не работали здесь, прежде чем я столкнулся с этим решение (на случай, если один или несколько из этих изменений повлияли на мои результаты), однако я думаю, что вышеупомянутое решение будет полным... но я не пытался воспроизвести ошибку, поэтому я не могу быть на 100% уверен.
Ответ 2
Это произошло со мной, и через некоторое время я нашел ответ в статье в блоге и захотел поместить его здесь.
Если вы скопируете каталог данных MySQL с /var/lib/mysql
до /path/to/new/dir
, но только скопируйте папки базы данных (т.е. mysql
, wpdb
, ecommerce
и т.д.) И у вас есть таблицы innodb, ваш innodb таблицы будут отображаться в "show tables", но запросы на них (select
и describe
) не будут выполнены с ошибкой Mysql error: table db.tableName doesn't exist
. Вы увидите файл .frm
в каталоге db и задаетесь вопросом, почему.
Для таблиц innodb важно скопировать файлы ib*
, которые в моем случае были ibdata1
, ib_logfile0
и ib_logfile1
. Как только я сделал передачу, чтобы скопировать их, все сработало, как ожидалось.
Если ваш файл my.cnf содержит "innodb_file_per_table", файл .ibd будет присутствовать в каталоге db, но вам все равно нужны файлы ib *.
Ответ 3
Использование mysqlcheck было бы в порядке в этом случае, поэтому вы можете отказаться от проблем со столами и восстановить их, если они были заменены.
Ответ 4
Может ли быть, что ваш один сервер - это linux box? Mysql чувствителен к регистру на linux, но нечувствителен к окнам.
Ответ 5
У меня было такое поведение один раз. Позже я обнаружил, что драйвер JDBC, который я использовал, изменил мой запрос на нижний регистр, поэтому я не смог связаться с моей базой данных (с использованием смешанных букв), хотя мой код использовал правильные смешанные буквы.
Ответ 6
Если вы вошли в систему как человек, у которого нет разрешения на просмотр этой базы данных/таблицы, вы, вероятно, получите этот результат. Вы используете тот же логин в командной строке, что и в mysqli?
Ответ 7
Это может быть связано с таблицами InnoDB и MyISAM. Если вы скопируете файлы базы данных, MyISAM будет в порядке, и InnoDB появится, но не сработает.
Ответ 8
Я видел это в системе centos 6.4 с mysql 5.1 и файловой системой xfs.
Таблицы показывают с помощью "show tables", но выбор или описание не выполняется с табличным отсутствующим сообщением, как вы описали. Файлы там, где я их ожидаю.
Система работала отлично в течение нескольких месяцев, а затем после перезагрузки службы mysqld после изменения /etc/my.cnf, чтобы установить table_cache на 512 вместо 256, она пошла боком.
Согласно arcconf, контроллер рейда считает, что все в порядке. xfs_check ничего не находит. системный список событий IPMI понятен. dmesg показывает некоторые жалобы iptables на отслеживание соединений и удаление пакетов, поэтому мы, возможно, были DOS'd, но поскольку на сервере нет ничего действительно запущенного снаружи, я не вижу, как это может повлиять на целостность данных mysql?
Я закончил продвигать ведомый, чтобы освоить и перезагрузить систему, и теперь мне интересно, что могло вызвать ошибку, и если выбор xfs на centos 6.4 по-прежнему является стабильным выбором, или если виновником был mysql 5.1.
О да, и никогда не меняйте запущенную систему:)
Ответ 9
Mac OS X?
STOP, ничего не возвращайте...
У меня была эта проблема пару раз на Mavericks. MySQL больше не включен, но моя установка по сути такая же, как вы, вероятно, найдете на Snow Leopard, а не в MAMP или что-то в этом роде.
После миграции с одного компьютера на другой у меня возникла эта проблема. Это было результатом того, что панель управления MySQL запускает mysqld, а не запускает ее в командной строке. (При переносе эта несколько устаревшая панель управления забывает, что вы сказали ей НЕ запускать при загрузке.)
Посмотрите на процессы (верхний или монитор активности), в моей системе: если владелец является root, он запускается запущенным и не работает должным образом; правильный процесс будет иметь _mysql как владельца.
Иногда у меня есть оба процесса, работающие бок о бок!
Как ни странно, вы можете делать все, включая использование mysql через командную строку. Однако, несмотря на то, что перечислены таблицы innodb, они генерируют ошибку при отсутствии запросов.
Это, похоже, проблема с владением, которая может применяться и к другим системам.