Вчера я выгрузил свои базы данных MySQL в файл SQL и переименовал файл ibdata1. Затем я пересоздал его, импортировал файл SQL и переместил новый файл ibdata1 в свой каталог данных MySQL, удалив старый.
Я делал это раньше без проблем, однако в этот раз что-то не так. Когда я проверяю базы данных (личные, не MySQL config), они все там, но они пустые... как бы. В каталоге данных все еще есть файлы .ibd с правильным содержимым, и я могу просматривать таблицусписокв базах данных, но не в самих таблицах. (У меня включена опция «файл на таблицу», и я использую InnoDB по умолчанию для всего.)
Например, сURL-адресабаза данных и ееURL-адресаtable, я могу успешно открыть mysql.exe или phpMyAdmin и use urls;
. Я даже могу show tables;
увидеть ожидаемую таблицу, но затем, когда я пытаюсь describe urls;
или select * from urls;
, он жалуется, что таблица не существует (хотя онатолькоперечислил его). (Администратор MySQL перечисляет базы данных, но даже не перечисляет таблицы, он указывает, что базы данных полностью пусты.)
Проблема в том, что я уже удалил файл SQL (и не могу восстановить его даже после очистки жесткого диска). Поэтому я пытаюсь найти способ восстановить эти базы данных/таблицы. Я не могу использовать функцию восстановления таблиц, так как она жалуется, что таблица не существует, и я не могу сделать дамп, так как она снова жалуется, что таблицы не существуют.
Как я уже сказал, сами данные все еще присутствуют в файлах .ibd, и имена таблиц присутствуют. Мне просто нужен способ заставить MySQL распознать, что таблицы существуют в базах данных (я могу найти имена столбцов соответствующих таблиц в файле ibdata1 с помощью шестнадцатеричного редактора).
Есть идеи, как я могу исправить этот тип порчи? Я не против засучить рукава, покопаться и предпринять кучу шагов, чтобы исправить это.
Большое спасибо.
решение1
Ну, я перепробовал кучу всего и исследовал кучу команд, переключателей и структур (неудивительно, что документация MySQL оказалась наиболее полезной, хотя и обширной — иголка/стог сена). В конце концов некоторые из моих трюков сработали (оказалось, что другие придумали те же трюки, хотя я не видел двух основных частей — восстановление структуры таблицы и восстановление данных — в одном месте, поэтому я публикую их вместе здесь).
Мне пришлось пересоздать файл IBDATA1. К сожалению, при запуске демон обнаруживает базы данных (каталоги), но не считывает таблицы Innodb внутри (файлы IBD/FRM). Поэтому я сделал следующее:
- Очистите каталог данных (или переместите исходный и создайте пустой)
- Запустите демон и дайте ему создать новый пустой файл IBDATA1.
- Импортируйте системные таблицы с помощью скриптов SQL в
…\MySQL\share
- Создайте фиктивную базу данных и таблицу с тем же именем.
- Скопируйте исходный файл FRM
- Используйте либо,
DESCRIBE
либо лучше,SHOW TABLE CREATE
чтобы извлечь структуру таблицы - Далее я использовал
DISCARD TABLESPACE
на столе - Скопировано поверх исходного файла IBD
- Затем я использовал
IMPORT TABLESPACE
- Наконец, я перезапустил демон с помощью
innodb-force-recovery=6
- И я побежал
mysqldump
извлекать структуры и данные
Конечно, не всегда все было гладко. Некоторые таблицы были в порядке, но некоторые требовали удаления таблицы и базы данных после SHOW TABLE CREATE
, и использования этого для повторного создания таблицы перед попыткой импорта данных. Другие даже не работали так далеко, и мне пришлось вручную получать комментарии и имена столбцов из файла FRM с помощью шестнадцатеричного редактора (хотя выяснение того, какие типы данных и атрибуты, ключи и т. д. были дерьмовыми). Кроме того, было много — слишком много — перезапусков демона и клиента.
(Я все еще ищу инструмент, который будет напрямую анализировать файлы FRM/IBD (или хотя бы отображать структуру таблиц из файла FRM), но, похоже, никто не удосужился «обратно разработать» их, хотя исходный код открыт, а форматы файлов общедоступны. Похоже, все довольствуются использованием официальных инструментов MySQL, тем самым создавая прекрасную возможность для фирм, занимающихся восстановлением данных, и фирменных/коммерческих инструментов.)
Ключевым моментом было всегда работать с абсолютным минимумом (например, только с каталогом MYSQL, т. е. системными таблицами). К сожалению, хотя это и означало, что все будет проще и легче работать, это также означало восстановление одной таблицы за раз, что не было большой проблемой для меня, но для некоторых людей это могло быть.
В любом случае, из множества страниц восстановления MySQL в Интернете, которые я видел за последние пару дней, несколько были довольно полезными, и я добавлю их, как только прочешу свою историю, чтобы их откопать.
Надеюсь, это поможет другим в похожей ситуации.
решение2
Возможность перечислить все таблицы и базу данных обычно означает, что файлы *.frm там есть. Это не значит, что для них есть какие-либо данные. Вы пробовали запустить свой процесс mysqldпринудительное восстановление innodb? Если нет, попробуйте, или да, что говорит журнал mysql при запуске?
После этого: никогда, никогда больше не пытайтесь использовать резервные копии подобным образом.