Как восстановить таблицу InnoDB, файлы которых были перемещены
-
16-10-2019 - |
Вопрос
Таким образом, у меня есть тестовый DB -сервер, который был настроен на потоке репликации. Через имя оптимизация проходила через это быстро заполнило пространство на Datadir Slaves. MySQL покорно ждал еще немного места.
Этот DataDir - это файловая система, используемая только в качестве DataDir MySQL, поэтому больше не было ничего, чтобы освободить.
У меня была тестовая таблица 4 -гоподанного innodb, которая не была частью потока репликации, поэтому я решил, что попробую кое -что посмотреть, сработает ли это, и, будучи испытательной средой, я не слишком беспокоился, если все пойдет ужасно неправильно.
Вот шаги, которые я предпринял
- Промыл стол, который я собирался двигаться
- Поместил на него чтение блокировки (хотя ничего не писал, и это было не в потоке репликации)
- Скопировал .frm и .ibd в файловую систему с какой -то запасной комнатой
- Разблокировал стол
- Усеченная таблица - это освободило достаточно места для оптимизации, чтобы закончить, запустили репликацию снова двигаться вперед.
- Прекратите рабство/выключение MySQL
- Скопируйте файл из TMP обратно в Data Dir
- Перезагрузить MySQL
Ничто не появляется в журнале .err, все выглядит хорошо. Я подключаюсь и использую MyDB; И посмотрите таблицу, с которой я связывался в таблицах. Но если я попробую
select * from testtable limit 10;
Я получаю ошибку
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Из того, что я могу сказать до сих пор, я могу прочитать из всех остальных таблиц просто отлично, и репликация началась без каких -либо жалоб.
Есть ли что -нибудь, что я могу сделать, чтобы оправиться от этого момента? Я могу восстановить его с нуля, если это необходимо, но мне было любопытно, что другие думали об этом предприятии в целом. Было ли что -нибудь в серии шагов, которые я предпринял, что в конечном итоге оказалось бы с более безупречными результатами?
Что если это не тестовый сервер, я не мог бы просто «сделать это вживую» и посмотреть, что произойдет? Что бы мог временно освободить пространство на производственном рабыне, если бы мне это понравилось?
Решение
Самая большая вещь, которую большинство людей забывают о усеченном столе, это то, что Таблица усечения DDL, а не DML. Анкет В Innodb метаданные в IBDATA1 содержит пронумерованный список таблиц InnoDB. Использование таблицы усечения вызывает сдвиг внутренний идентификатор метаданных таблицы InnoDB. Это происходит потому, что таблица усечения эффективно делает следующее:
Пример: усечь таблицу 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, которые он направил таким же образом. Мне пришлось использовать другой сервер DB и играть в некоторые игры с добавлением и сброшением таблиц InnoDB, чтобы выследить правильный внутренний идентификатор метаданных.
Клиент нашел эту статью: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file Анкет Мы использовали это, и это очень помогло. Надеюсь, это поможет вам.
Другие советы
Я пережил с моим 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 polder в Windows c: xampp httdocs и скопируйте var mysql to c: xampp mysql data
Еще не последнее, я скопирую ib_logfile0, ib_logfile1, ibdata1 из моего резервного файла в Windows xampp C: xampp mysql data
Я обновляю http: // localhost/mywebsite
Вау, вау сделано ... это работает ...