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

dba.stackexchange https://dba.stackexchange.com/questions/6268

  •  16-10-2019
  •  | 
  •  

Вопрос

Таким образом, у меня есть тестовый DB -сервер, который был настроен на потоке репликации. Через имя оптимизация проходила через это быстро заполнило пространство на Datadir Slaves. MySQL покорно ждал еще немного места.

Этот DataDir - это файловая система, используемая только в качестве DataDir MySQL, поэтому больше не было ничего, чтобы освободить.

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

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

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

Вау, вау сделано ... это работает ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top