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

Итак, у меня есть тестовый сервер db, который был настроен на поток репликации. По имени появилась оптимизация, которая быстро заполнила пространство на ведомых данных. Mysql покорно ждал еще немного места.

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

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

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

  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

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

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

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

10 голосов | спросил atxdba 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2011 19:36:23 +0400 2011, 19:36:23

2 ответа


11

Самое большое, что большинство людей забывают о 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 содержит внутри него исходный внутренний идентификатор метаданных. Простое размещение файла .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 . Мы использовали его, и это очень помогло. Надеюсь, это поможет вам.

ответил RolandoMySQLDBA 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2011 20:09:03 +0400 2011, 20:09:03
-2

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

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

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

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

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

ответил Armindo 24 AMpMon, 24 Apr 2017 07:40:04 +030040Monday 2017, 07:40:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132