Я работал с базой данных mysql innodb. Когда я работал с mysqlworkbench, все файлы .frm случайно были удалены из папки данных mysql, но у меня все еще есть файл ibdata в папке данных. Я не использовал innodb_file_per_table, а это значит, что все данные моих таблиц innodb были в одном файле ibdata.
К сожалению, у меня нет резервной копии для восстановления. Может ли кто-нибудь подсказать, как восстановить данные из файла ibdata.
решение1
Ваш вопрос кажется идентичнымэтот на Stack Overflow.
Я воспроизвел часть принятого ответа здесь.
Простое решение — найти сохраненную копию SQL
CREATE TABLE
, запустить ее наразработкаэкземпляр 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 или что-то вроде этого.