InnoDB: не удается открыть таблицу из внутреннего словаря данных InnoDB, хотя файл .frm для таблицы существует

#mysql #windows #xampp

#mysql #Windows #xampp

Вопрос:

Я запускаю Windows 10 с XAMPP и несколькими десятками сайтов Drupal, установленных на localhost. Все работает нормально в течение нескольких месяцев.

Сегодня утром я выполнил восстановление Windows из точки восстановления два дня назад, чтобы избавиться от нежелательного обновления Windows. После того, как я это сделал, мой MySQL перестал работать. Я попытался удалить файл ibdata1 (теперь я знаю, что это была плохая идея), но когда ситуация ухудшилась, я восстановил исходный ibdata1 файл, который я удалил. Все данные таблицы ( .frm и .ibd файлы) все еще находятся в C:xamppmysqldata . Теперь MySQL, по крайней мере, запустится, но все таблицы «исчезли»… Я могу загрузить phpMyAdmin в браузере, и когда я открываю базы данных слева, отображаются все таблицы… но когда я пытаюсь щелкнуть по одному, он сообщает мне «таблица не найдена».

В mysql_error.log есть несколько ошибок, таких InnoDB: Cannot open table mysql/slave_master_info from the internal data dictionary of InnoDB though the .frm file for the table exists. как URL, упомянутый в сообщении об ошибке, который предположительно сообщает вам, как решить эту проблему, но он неинформативен.

Я не думаю ibdata1 , что он поврежден … и все статьи, касающиеся восстановления данных, сложны до такой степени, что безумно несоразмерны проблеме. Ни у кого нет простого прописанного решения. Я неправильно гуглю? Это случалось со мной по крайней мере дважды раньше, и каждый раз проблема самопроизвольно разрешалась, прежде чем я мог начать следовать 10-часовым процедурам, которые я нашел в Интернете. К сожалению, не в этот раз. Конечно, я упускаю что-то простое. У меня были сотни и сотни таблиц в нескольких десятках баз данных, и кажется безнадежным пытаться найти схему для каждой из них и вручную подключить ее, что, похоже, предлагает большинство статей о восстановлении.

Разве база данных не должна просто знать, как читать файлы .frm и .ibd , и, вы знаете… работает? Кажется, что где-то неуместно только одно значение, и если бы я мог просто найти его, все просто «встало» бы на свои места.

Комментарии:

1. Так как подобные вещи происходили раньше, вы, конечно, должны были убедиться, что вы делали регулярные резервные копии всех этих ценных ресурсов (баз данных), верно ?

2. Никогда не знал, как это сделать. Проблема в том, что все данные находятся прямо там… почему он не может ее увидеть?

3. Я не могу отделаться от мысли, что после 2 предупреждений о том, что вы почти пропустили ГРОМКИЕ предупреждения, вы заслуживаете того, чтобы потерять лот, но давайте начнем с того, что вы опубликуете соответствующий раздел, то есть конец вашего mysql error log , чтобы мы могли видеть, о каких ошибках сообщает MYSQL

4. dl.dropboxusercontent.com/u/6621447/mysql.txt

5. Вы сказали, что у вас много баз данных. Только один из них сообщает об этих ошибках или все из них?

Ответ №1:

Что для нас сработало, так это эта ссылка (восстановление потерянных файлов ibd для каждой таблицы).

Короче говоря, вы делаете:

 ALTER TABLE ..... DISCARD TABLESPACE;
  

Для каждой затронутой таблицы.
Затем для каждой затронутой таблицы:

 ALTER TABLE .... IMPORT TABLESPACE; SHOW WARNINGS; 
  

Вы могли бы сделать это на той же схеме или создать новую схему в другой базе данных и скопировать все файлы *.ibd. В этом случае:

  • Создайте новую схему с определениями таблиц.
  • Удалите табличное пространство для всех таблиц.
  • Скопируйте новые файлы *.ibd в нужную папку новой схемы.
  • Удалите табличное пространство для всех таблиц.

ВАЖНО! Лучше, чтобы новая схема имела то же имя, что и старая.

Ответ №2:

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

https://dba.stackexchange.com/a/42932

Моей базой данных была InnoDB, поэтому возникла проблема с идентификатором, и при обновлении macos я получил это. Я процитирую основную часть:

У вас должен быть:

-ibdata1

-ib_logfile0

-ib_logfile1

-файлы.FRM из вашей папки mysql_database

-Новая установка MAMP / MAMP Pro, которую вы готовы уничтожить (при необходимости)

  1. Подключитесь по SSH к вашему веб-серверу (dev, production, без разницы) и перейдите в вашу папку mysql (моя была в / var / lib / mysql для установки Plesk в Linux)
  2. Сжать папку mysql
  3. Загрузите архивную папку mysql, которая должна содержать все базы данных MySQL, будь то MyISAM или InnoDB (вы можете удалить этот файл или переместить его в загружаемый каталог, если это необходимо)
  4. Установите MAMP (Mac, Apache, MySQL, PHP)
  5. Перейдите в /Applications/MAMP/db/mysql/
  6. Резервное копирование /Applications/MAMP/db/ mysql в zip-архив (на всякий случай)
  7. Скопируйте во все папки и файлы, включенные в архив папки mysql с рабочего сервера (среда mt Plesk в моем случае) ЗА ИСКЛЮЧЕНИЕМ ТОГО, ЧТО НЕ ПЕРЕЗАПИСЫВАТЬ:

    -/Приложения/MAMP/db/mysql/mysql/

    -/Applications/MAMP/db/mysql/mysql_upgrade_info

    -/Applications/MAMP/db/mysql/performance_schema

Ответ №3:

В моем случае я восстанавливал резервную копию (выполненную galera-arbitrator и xtrabackup. Используя первый, мы сделали снимок состояния, а с помощью последнего мы создали резервную копию физических данных) для Percona_XtraDB_Cluster. Итак, после размещения резервных копий данных в каталог /var/lib/mysql нового сервера mysql, мы выполнили следующий select запрос и получили ошибку.

 $ mysql -uroot -p$MYSQL_ROOT_PASSWORD -h<NEW_SERVER_HOST_NAME> -e 'show columns from <MY_DB>.<MY_TABLE>'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1146 (42S02) at line 1: Table 'playground.equipment' doesn't exist
  

И журнал сервера был:

 [Warning] InnoDB: Cannot open table <MY_DB>/<MY_TABLE> from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.
  

Мы просто перезапустили контейнер с новыми данными. Вот и все

Ответ №4:

Просто переименуйте slave_master_info.frm в slave_master_info.BAK и все. Перезапустите службу mysql.