Потерянные Frm файлы, восстанавливающие данные из ibdata
Я работал с базой данных mysql innodb. Когда я работал с mysqlworkbench случайно, все файлы.frm были удалены из папки данных mysql, но у меня все еще есть файл ibdata в папке данных. Я не использовал innodb_file_per_table означает, что все мои данные таблиц innodb были в одном файле ibdata.
К сожалению, у меня нет резервной копии для восстановления. Может ли кто-нибудь предложить мне, как восстановить данные из файла ibdata.
1 ответ
Ваш вопрос кажется идентичным этому на Stack Overflow.
Я воспроизвел часть принятого ответа здесь.
Простое решение - найти сохраненную копию
CREATE TABLE
SQL, запустите его на экземпляре разработки MySQL, затем скопируйте сгенерированный файл FRM в восстановленный экземпляр.Если у вас нет доступа к
CREATE TABLE
Заявления вы можете попробовать следующие:
- В восстановленной базе данных запустите
create table innodb_table_monitor (a int) ENGINE=InnoDB
- Наблюдайте файл ошибок сервера MySQL, пока данные монитора таблицы не будут сброшены (обычно около минуты)
- Бегать
drop table innodb_table_monitor
Остановить восстановленную базу данных
Напишите SQL, чтобы соответствовать выводу монитора таблицы, например:
TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828 COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45; DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; DB_ROLL_PTR: DATA_SYS prtype 258 len 7; INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1 root page 3, appr.key vals 1828, leaf pages 9, size pages 10 FIELDS: DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name
может быть выражено как:
drop table if exists mylosttable; create table mylosttable ( id char(12) NOT NULL, name varchar(45) NOT NULL );
Если вы не уверены в выводе монитора таблиц, посмотрите на вывод таблиц с известной схемой.
Запустите приведенный выше SQL на экземпляре разработки MySQL
Скопируйте файлы FRM, созданные на сервере разработки, в восстановленную базу данных. Вы найдете их в каталоге данных MySQL в подкаталоге соответствующей базы данных.
Перезапустите восстановленную базу данных.
Обратите внимание, что вы можете скопировать файлы FRM из вашей системы разработки в экземпляр действующей базы данных. Причиной остановки вышеуказанного сервера является то, что если вы прервите базу данных после создания таблицы innodb_table_monitor, то файл ibdata останется в несогласованном состоянии, и вам придется начать заново с резервной копии.
Проверьте, что таблицы работают, используя
select *
заявления. Если вы ошибаетесь, вы увидите:ERROR 2013 (HY000): Lost connection to MySQL server during query
Это означает, что база данных потерпела крах. Если это произойдет, сделайте
create table innodb_table_monitor...
на экземпляре dev и сравните вывод с исходным выводом восстановленного экземпляра. Вы, скорее всего, увидите, что пропустили NOT NULL или что-то подобное.