Відновлення таблиць MySQL з файлів .ibd, .frm та mysqllogbin


10

З якої - то причини, коли я намагаюся відкрити мої таблиці, які зберігаються в .frmі .ibdфайли (будь то на MySQL або PHPMyAdmin) він дає мені помилку синтаксису, або він говорить , що не існує.

Я прочитав інший пост, який мав подібну проблему до цього, але не знаю, як перевірити, чи innodb_file_per_tableввімкнено, і я взагалі просто розгублений. Я також перетворив копію свого mysql-bin.000002файлу в txt-файл, щоб побачити, що дані з моєї бази даних не повністю втрачені.

База даних була створена минулого року. У мене є 6 таких mysql-bin.00000файлів, але чомусь .000002найбільший. Зараз у мене є файли .ibdта .frmфайли для всіх моїх баз даних, але я в збитті щодо того, як я можу відновити його назад у MySQL або принаймні щось, що я можу прочитати.

Я використовую WampServer 2.4 та MySQL 5.6.12 на Windows 2003 Server. Також я повинен завантажити плагін в InnoDB?


Ні, він був створений минулого року. У мене є 6 таких файлів mysql-bin.00000, але чомусь .000002 є найбільшим. Зараз у мене є файли .ibd та .frm для всіх моїх баз даних, але я втрачений, як я можу відновити його назад у MySQL або хоча б щось, що я можу прочитати.
перевезти

Відповіді:


20

Нарешті я зрозумів і вирішив свою проблему через безліч спроб та помилок. Для тих, хто не має свого оригінального файлу ibdata1 і має лише свої .frm та .ibd файли, ось як я відновив свої дані.

  1. Завантажте та встановіть утиліти MySQL за адресою -> http://dev.mysql.com/downloads/utilities .
  2. Зайдіть у свою команду / термінал, щоб відкрити утиліту MySQL, mysqlfrm, і використовуйте її для пошуку структури вашої таблиці, яку потрібно відновити. Як я це зробив, чи вводив мене до файлу mysqlfrm, а потім вводив "mysqlfrm --server = користувач: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". Файл .txt повинен бути збережений у тій самій папці, де зберігаються ваші утиліти, якщо ви не вказали, куди ви хочете.
  3. У текстовому файлі ви побачите оператори CREATE TABLE, які містять усі стовпці та інформацію (в основному, оригінальну структуру) вашої таблиці. Скопіюйте цей CREATE заяву з усією цією інформацією.
  4. У вашій команді MySQL створіть нову базу даних (СТВОРИТИ ДАТАБАСУ_ ім'я_бази). Зробіть це те саме ім'я, що і ваше оригінальне ім'я бази даних.
  5. Створіть нову таблицю всередині нової бази даних - вона не повинна бути такою ж назвою, як папка. Ви можете створити нову таблицю всередині командного рядка, але я створив свою таблицю в PhpMyAdmin, вільному програмному інструменті, який обробляє адміністрування MySQL через Інтернет. Я просто натиснув на базу даних на PhpMyAdmin, потім на таблицю SQL, і вставив структуру таблиці з №3. (Як бічна примітка, я завжди отримував помилки, якщо в командному рядку я називав свої таблиці "таблицею", тому намагаюся уникати цього імені).
  6. У команді MySQL увійдіть у свою базу даних та введіть "ALTER TABLE table_name DISCARD TABLESPACE", який фактично видалить .ibd файл цієї таблиці.
  7. Скопіюйте оригінальну таблицю (таблицю, яку ви хочете відновити) .ibd-файлу у новоствореній таблиці, щоб замінити щойно видалений файл .ibd. Змініть свій початковий .ibd файл на новостворене ім'я таблиці. Це буде імітувати старий .ibd файл, який ви щойно видалили. Ви можете знайти цю папку в папці даних MySQL під новоствореною папкою бази даних на вашому комп’ютері.
  8. Поверніться до своєї команди MySQL, увійдіть у вашу базу даних та введіть "ALTER TABLE table_Name IMPORT TABLESPACE." Ви отримаєте "попередження" (1) твердження про помилку, але просто проігноруйте це.
  9. І зробили! якщо ви спробуєте отримати доступ до своєї нової таблиці, вона повинна містити всі дані зі старої таблиці.

Я сподіваюся, що це допомогло, і повідомте мене, якщо у вас є питання або коментарі! Також перегляньте http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file, щоб дізнатись більше.


Чудові інструкції, але вона працює лише з MySQL 5.6 ! На 5.5 ви отримаєте помилку Got error -1 from storage engineпід час запуску IMPORT TABLESPACE. Але для мене MySQL 5.6 працював для таблиць, створених за допомогою MySQL 5.5, тому все добре;). Якщо вам застрягло 5,5, вам доведеться слідувати інструкціям у посиланні хрискалендера, яке ви створювали.
ostrokach

@carment Я дотримувався ваших інструкцій, але зіткнувся з ERRPR: намагаюся отримати доступ до сторінки № 1767006713 у просторі 13635, ім'я простору <dbname> / <tblname>, яке знаходиться поза межами простору таблиць. Чи можете ви мені керувати, що я можу зробити?
Мохіт Мехта

Це просто заощадило мені купу часу на відтворення столу. Метод все ще працює у 2016 році, на MySQL 5.7.17
Енді Мерсер,

@ostrokach, здається, це тому, що ви цього не innodb_file_per_tableввімкнули.
Іван

Ви просто .. врятували мене після дуже довгої дороги, дякую!
Amr SubZero

4

Основний файл даних InnoDB - зазвичай названий ibdata- важливий для вас MySQL, щоб ви могли зрозуміти ваші .ibd файли.

Якщо вам потрібно переміщувати дані між серверами, використовуючи двійкові файли, вам слід зупинити MySQL чисто та перенести всі файли даних, включаючи файли ibdata , між каталогами.

Більш надійним механізмом переміщення даних між серверами в Windows було б використання ( mysqldump) або експорт бази даних з PHPMyAdmin (або подібного інструменту).

Якщо бінарний журнал увімкнено весь час роботи вашого сервера (на основі коментарів, це може бути не так), ви також можете використовувати mysqlbinlogдля відновлення кожного запущеного на сервері оператора SQL з файлів mysql-bin , і відтворити таким чином базу даних. У файлах mysql-bin повинні бути часові позначки unix, які допоможуть вам визначити, як далеко вони проходять.

Якщо ви втратили свої оригінальні файли бази даних, і все, що вам залишилося, - це окремі файли.

MySQL 5.6 має деякі нові функції для переміщення файлів даних InnoDB .ibd ( переносяться табличні ), але це зажадає деяких зусиль і при досить невеликої бази даних, це буде набагато легше передавати дані з використанням mysqldump.


0

Відповідь Wiki, сформована з коментарів запитань від akuzminsky


Якщо ви бачите *.ibdфайли, то innodb_file_per_tableє ON, інакше всі таблиці були б уibdata1 .

Якщо він говорить, що таблиці не існує, то таблиця відсутня у словнику InnoDB. Спробуйте скинути всі таблиці в окремі скиди sql (одна таблиця - один файл). Ті таблиці, які ви не можете скинути, ви можете відновити за допомогою інструментарію відновлення TwinDB .

Бінарних пакетів поки немає. Ви повинні отримати вихідний код від GitHub і скомпілювати його. Дивіться інструкції у словнику відновлення InnoDB . Це досить просто:

git clone git@github.com:twindb/undrop-for-innodb.git

і потім

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