Как восстановить таблицу InnoDB, файлы которой были перемещены


13

Итак, у меня есть тестовый сервер БД, который был настроен в потоке репликации. Над именем произошла оптимизация, которая быстро заполнила пространство в dadadir рабов. Mysql покорно ждал еще места.

Этот datadir - файловая система, используемая ТОЛЬКО как datadir mysql, поэтому больше ничего не нужно было освобождать.

У меня была тестовая таблица innodb на 4 гигабайта, которая не была частью потока репликации, поэтому я решил попробовать кое-что, чтобы проверить, сработает ли она, и, будучи тестовой средой, я не слишком волновался, если что-то пошло не так.

Вот шаги, которые я предпринял

  1. Покраснел стол, который я собирался переместить
  2. Установил на него блокировку чтения (хотя в него ничего не записывалось и его не было в потоке репликации)
  3. Скопировал .frm и .ibd в файловую систему с некоторой запасной комнатой
  4. Разблокировал стол
  5. Урезал эту таблицу - это освободило достаточно места для завершения оптимизации, чтобы репликация снова начала пыхтеть.
  6. Остановить подчинение / отключение MySQL
  7. Скопируйте файл из tmp обратно в каталог данных
  8. Перезапустите MySQL

В журнале .err ничего не отображается, все выглядит хорошо. Я подключаюсь и использую mydb; и увидеть таблицу, с которой я возился в выставочных таблицах. Но если я попробую

select * from testtable limit 10;

Я получаю ошибку

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

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

Могу ли я что-нибудь сделать, чтобы восстановиться после этого? Я могу восстановить его с нуля, если это будет необходимо, но мне было любопытно, что другие думают об этом предприятии в целом. Было ли в серии шагов, которые я предпринял, что-нибудь, что привело бы к безупречным результатам?

Что если бы это был не тестовый сервер, я не мог бы просто «сделать это вживую» и посмотреть, что произойдет? Как лучше всего временно освободить место на рабочем рабе, если мне это понравится?

Ответы:


15

Самая большая вещь, которую большинство людей забывают о TRUNCATE TABLE, это то, что TRUNCATE TABLE - это DDL, а не DML . В InnoDB метаданные в ibdata1 содержат нумерованный список таблиц InnoDB. Использование TRUNCATE TABLE приводит к смещению внутреннего идентификатора метаданных таблицы InnoDB. Это происходит потому, что TRUNCATE TABLE эффективно выполняет следующее:

Пример: усечение таблицы InnoDB с именем mydb.mytb

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

Таким образом, новый mytb будет иметь другой внутренний идентификатор метаданных.

Когда вы скопировали файл .ibd в другое место, в нем содержится исходный внутренний идентификатор метаданных. Простое возвращение файла .ibd не приводит к согласованию внутреннего идентификатора метаданных с идентификатором из ibdata1.

То, что вы должны были сделать, это:

Скопируйте файл .ibd таблицы InnoDB. Затем запустите это

ALTER TABLE tablename DISCARD TABLESPACE;

Чтобы вернуть его позже, скопируйте файл .ibd обратно в datadir и затем запустите

ALTER TABLE tablename IMPORT TABLESPACE;

Это позволило бы сохранить внутренний идентификатор метаданных.

Убедитесь, что .frm всегда присутствует.

Однажды я помог клиенту восстановить те же 30 таблиц InnoDB, которые он использовал. Мне пришлось использовать другой сервер БД и играть в некоторые игры с добавлением и удалением таблиц InnoDB, чтобы найти правильный внутренний идентификатор метаданных.

Клиент нашел эту статью: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Мы использовали это, и это очень помогло. Я надеюсь, что это поможет вам.


1
У меня есть 2 базы данных, где все таблицы говорят Table 'X' doesn't exist in engine. Нужно ли выполнять описанный выше метод для каждой таблицы или есть более эффективные способы исправить это?
Папанито

-2

Я испытал свой Mac, прежде чем продавать другу, просто скопируйте папку XAMPP только на мой жесткий диск. (НЕ УСПЕХ) К сожалению, это доставляло мне неприятности, потому что я попробовал следующие шаги: - Я установил свежий XAMPP и скопировал целые \ httdocs и var \ mysql на мой новый Mac, эти db только с .frm и .ibd, НЕ РАБОТАЕТ, я по-прежнему не могу получить доступ к таблицам внутри PHPMyAdmin ... - Я попытался установить ту же версию xampp и повторить описанные выше шаги, но по-прежнему НЕ РАБОТАЕТ. - решил пойти спать.

(УСПЕХ) - Сегодня утром я принес свой резервный диск и попробовал с Windows 7. - Установите свежую последнюю версию XAMPP для Windows, c: \ xampp - У меня есть один из веб-сайтов (папок) из моей резервной копии \ httdocs и соответствующая папка базы данных внутри \ var \ mysql ГОТОВ в моем Windows 7, я просто хочу попробовать с одним веб-сайтом, а затем попробовать остальные, потому что у меня есть много проектов внутри httdocs \ и \ var \ mysql - я копирую упомянутую папку httdocs \ в windows c: \ xampp \ httdocs и скопируйте \ var \ mysql в c: \ xampp \ mysql \ data

НЕ ПОСЛЕДНИЙ ДАЛЕЕ Я копирую ib_logfile0, ib_logfile1, ibdata1 из моего файла резервной копии в windows xampp c: \ xampp \ mysql \ data

Я обновляю http: // localhost / mywebsite

WOW WOW DONE ... это работает ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.