Як відновити таблицю InnoDB, файли якої переміщувались


13

Тож у мене є тестовий db-сервер, який був налаштований у потоці реплікації. Над назвою пройшла оптимізація, яка швидко заповнила простір у файлах datadir. Mysql покірно чекав ще місця.

Цей datadir є файловою системою, яка використовується ТІЛЬКИ в якості datadir mysql, щоб звільнити більше нічого.

У мене була 4 тестова таблиця innodb тесту, яка не була частиною потоку реплікації, тому я зрозумів, що я спробую щось перевірити, чи не спрацює це, і будучи тестовим середовищем, я не надто переживав, якщо все піде жахливо не так.

Ось такі кроки я зробив

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

У журналі .err нічого не відображається, речі виглядають добре. Я підключаю і використовую mydb; і дивіться таблицю, з якою я возився, у шоу-таблицях. Але, якщо я спробую

select * from testtable limit 10;

Я отримую помилку

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

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

Чи можу я щось зробити, щоб відновитися після цього? Я можу відновити його з нуля, якщо потрібно, але було цікаво, що думають інші про це підприємство взагалі. Чи було щось про серію кроків, які я зробив, які б закінчилися б / бездоганнішими результатами?

Що робити, якщо це не тестовий сервер, я не міг би просто "зробити це" і подивитися, що відбувається? Який найкращий спосіб тимчасово звільнити місце у виробничому рабі, якби мені це сподобалось?

Відповіді:


15

Найбільше, що більшість людей забуває про таблицю TRUNCATE, це те, що таблиця TRUNCATE - це 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 . Ми його використали, і це дуже допомогло. Сподіваюся, це допоможе тобі.


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, я просто хочу спробувати з одним веб-сайтом, а потім спробувати решта, тому що в мене є багато проектів https \ і \ var \ mysql - я копіюю згадку httdocs \ папку у Windows c: \ xampp \ httdocs і скопіюйте \ var \ mysql у дані c: \ xampp \ mysql \

НЕ ОСТАННІ Я все-таки копіюю ib_logfile0, ib_logfile1, ibdata1 зі свого резервного файлу у Windows xampp c: \ xampp \ mysql \ data

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

WOW WOW зробив ... це працює ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.