MySQL> Таблиця не існує. Але це (або повинно)


261

Я змінив datadir інсталяції 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

Ви відновили базу даних із резервної копії? або ви просто скопіювали файли db? у вас є кореневий доступ до сервера mysql?
— alinoz

просто скопіювали файли! так, у мене є кореневий доступ до всього
— johnsmith

ви можете спробувати: mysql_fix_privilege_tables
— alinoz

4
це таблиці innodb?
— Пол Діксон

1
Так, усі таблиці є InnoDB. Моє погано, що я не сказав цього!
— johnsmith

Відповіді:


263

Про всяк випадок, коли хтось все-таки переймається

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

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

Якщо ви зробите це з базою даних, яка використовує InnoDBтаблиці, ви отримаєте цю шалену помилку "таблиця не існує", згадану вище.

Проблема полягає в тому, що вам потрібні ib*файли в корені даних MySQL datadir (наприклад ibdata1, ib_logfile0і ib_logfile1).

Коли я скопіював ті, то це працювало на мене.


27
Врятувало мені життя! Для будь-кого іншого просто не забудьте перезаписати наявні файли ib *, якщо ви намагаєтесь скопіювати нову установку. Створіть резервну копію існуючого mysql / каталогу, замініть старий, який ви хочете відновити, mysqldump все, а потім відновіть новий mysql /. Тоді ви можете імпортувати mysqldumps належним чином.
— Матвій

1
На Mac для копіювання моєї бази даних локально, на додаток до копіювання файлу ibdata (розташованого поруч із dir базою даних), я мав до chown _mysql:wheelімені бази даних dir, ibdata та всіх файлів у dir (використання chown -R ...). Аналогічно, дозволи були невірними всередині dir, тому 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 через System Preferences, і це було виправлено.
— Джефф Еванс

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;та отримую помилку "Таблиця" База даних. TABLE_ONE "не існує".
— Омар

Запуск MySLQ на Mojave. Перезапуск через панель налаштувань системи не працював. Мені довелося перезапустити командний рядок.
— Cortex

30

Цю проблему я отримую, коли справа для імені таблиці, яку я використовую, вимкнена. Отже, таблиця називається 'db', але я використовував 'DB' у операторі select. Переконайтесь, що справа однакова.


13
+1 Імена полів не відрізняються від регістру, але назви таблиць є. Поширена помилка, і дуже дратує.
— GolezTrol

27

Ця помилка може також виникнути при установці lower_case_table_namesна 1, а потім намагається доступ до таблиць , які були створені із значенням за замовчуванням для цієї змінної. У такому випадку ви можете повернути його до попереднього значення, і ви зможете прочитати таблицю.


4
Це мене трохи вкусило. Я повернув значення, перезапустив базу даних, експортував таблиці, повернув значення до 1, перезапустив базу даних, повторно імпортував таблиці і все знову працював.
— wmarbut

17
  1. зупинити mysqld
  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

У моєму випадку я також повинен був зробити: 10.5 видалити каталог <db_name> з-під / var / lib / mysql /
— Tony the Tech

не працює. :( таблиця '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 дозволяє використовувати символи unicode та недруковані у назві таблиці. Якщо ви створили таблиці, скопіювавши код створення з якогось документа / веб-сайту, є ймовірність, що він десь має нульову ширину.


дуже корисний пост, дякую! але всі таблиці є ASCII з правильною довжиною імені
— johnsmith

11

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

Якщо у вас немає недавнього резервного копіювання, наприклад, якщо ви покладалися на mySqlDump, ваші резервні копії, ймовірно, мовчки зламалися в якийсь момент минулого. Вам потрібно буде експортувати бази даних, що, звичайно, ви не можете зробити, тому що ви отримаєте помилки блокування під час роботи mySqlDump.

Отож, як вирішення, перейдіть до /var/log/mysql/database_name/та видаліть ім'я таблиці. *

Потім негайно спробуйте скинути стіл; зараз це має працювати. Тепер відновіть базу даних до нової бази даних та відновіть відсутні таблиці (и). Потім скиньте зламану базу даних.

У нашому випадку ми також постійно отримували mysql has gone awayповідомлення з випадковими інтервалами у всіх базах даних; після видалення пошкодженої бази даних все повернулося до норми.


Дякую Енді, я зрозумів проблему, з якою я стикаюся. Я перемістив ibdata1 з somehwere у 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 перезапуск
— KirstieBallance

Це, мабуть, знаходиться у верхній частині списку речей, які я можу спробувати. Варто пострілу, і в моєму випадку воно спрацювало.
— Coroos

7

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

SELECT * FROM `table`

Я вніс дві зміни
1.) Зробив назву таблиці в малому регістрі - я знаю !!
2.) Використовується специфічний символ цитати = ` : Це ключ над TAB

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

Удачі.


1
Просто FYI - Таблиця MyISAMі не INNO
— PlanetUnknown

1
Також `називається бейтік
— Gary

7

У мене була ця проблема після оновлення WAMP, але не було резервного копіювання бази даних.

Це працювало для мене:

  1. Зупиніть новий WAMP

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

  3. Видалити ib_logfile0таib_logfile1

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

Тепер ви маєте можливість робити резервні копії ваших баз даних. Однак після того, як ваш сервер знову перезапуститься, у вас все ще будуть проблеми. Тож тепер перевстановіть WAMP та імпортуйте свої бази даних.


Я хотів би, щоб люди вказували, де знаходяться файли, на які вони посилаються ...
— MagentoAaron

Отримав сюди зображення докера mysql, що не має читабельних таблиць. Можна підтвердити, що зупинка зображення, видалення цих файлів та перезапуск дали знову доступ.
— Ентоні Харлі

7

Спробуйте запустити запит sql, щоб відкинути простір таблиць перед копіюванням idb-файлу:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Скопіюйте idb-файл

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Перезапустіть MySql


Ви врятували мене :)
— l00k

@ I0pan Я спробував ті ж кроки, що й згадувався. Але після ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; вона показує таблицю не існує. Але це так :(
— Syed Asad Abbas Zaidi

5

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


5

Те, що працювало для мене, - це просто відкинути стіл, хоча він ще не існував. Потім я створив таблицю і переселився з дампа sql, зробленого раніше.

Повинна бути якась метабаза імен таблиць, і вона, швидше за все, все ще існувала там, поки я не скинув її.


Я створив процедуру, зрозумів, що це потрібно для перегляду. Тому я перейменував цю процедуру з деякими 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;

2

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

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

Почався сервіс mysql.

Потім сервер працює.


2

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

Ось рішення, більшість з яких потребує перезавантаження mysql.

  • Відтворення файлів журналу ( Видалити та перезапустити mysql )
  • Змініть розмір файлів журналу (MySql 5.6+ поновлює файл для вас)
  • Якщо ви робите певний тип міграції даних, переконайтеся, що ви правильно перемістили потрібний файл і дали йому дозволи, як уже заявили інші
  • Перевірте дозволи на свої дані та файли журналів, що mysql є власником обох
  • Якщо все інше не вдасться, вам, ймовірно, доведеться відтворити базу даних

2

Ось ще один сценарій (оновлення версії) :

Я перевстановив ОС (Mac OS El Captain) і встановив нову версію mysql (використовуючи домашню мову). Встановлена ​​версія (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)
— Falk

2

У моєму випадку я визначив тригер на столі, а потім намагався вставити рядок у таблицю. схоже, якось тригер був помилковим, а значить вставка давала помилку, таблиця не існує.


1
Це працює для мене! Перевірив кожен тригер і виявив, що один тригер потрібно вдосконалити, і він працював!
— Paresh

1

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


Вкладка, що доповнює, не допомагає, і я не можу показати створення таблиці, оскільки таблиця "не існує". from the hell
— johnsmith

1

Точна проблема з імпортом резервного копіювання TimeMachine. Моє рішення полягало в тому, щоб зупинити MySQL-сервер і виправити дозволи на читання-запис у файлах ib *.


1

Ще одну відповідь, на яку я думаю, варто винести сюди (бо я прийшов сюди з тією самою проблемою, і це виявилося для мене відповіддю):

Переконайтесь, що ім'я таблиці у вашому запиті написано точно так само, як у базі даних.

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


1

У моєму випадку, коли я імпортував експортований файл sql, я отримував помилку, як таблиця не існує для запиту створення таблиці.

Я зрозумів, що в імені моєї бази даних є підкреслення, і перед цим mysql проставляє символ втечі.

Тож я усунув цю підкреслення в імені бази даних, і все спрацювало.

Сподіваюся, що це допоможе і комусь іншому.


1

Мій стіл якимось чином було перейменовано на ' Customers'тобто з провідним простором

Це означало

а) запити порушено

б) таблиця не з’явилася там, де очікувалося, в алфавітному порядку моїх таблиць, що в моїй паніці означало, що я її не бачу!

RENAME TABLE ` Customer` TO `Customer`;

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)

Не використовуйте пробіли в квадратних позначках. Дякую моєму колезі Яну.


1

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


1

Скопіюйте лише ibdata1файл зі старого каталогу даних. Не копіюйте ib_logfile1та не ib_logfile0файли. Це призведе до того, що MySQL більше не запускається.


1

Сьогодні вирішилася така ж проблема. Це питання mysql "Ідентифікатор чутливості до регістру".

Перевірте відповідний файл даних. Цілком імовірно, що ім'я файлу є нижчим регістром у файловій системі, але ім'я таблиці, вказане в команді "показати таблиці", є великим регістром. Якщо системна змінна " 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, плагін-dir та порт #, залежно від вашої нової установки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.