Benjamin Netter
Benjamin Netter

Reputation: 1551

Corrupted InnoDB export

Yesterday, the hard drive from my dedicated server crashed. The only choice I had was to save what I could, before replacing the hard drive with a new one.

The only thing I could save was the /var/lib/mysql folder. Now I have a new hard drive with a new MySQL database running, but empty. I want to restore the data from the database I had.

I tried several things, and read over the internet that InnoDB export wasn't as easy as copying all the /var/lib/mysql folder, so I'm not sure what solution I have.

I tried to replace the new /var/lib/mysql folder with the new, but now mysqld won't run. The error log looks a lot like this, but adding innodb_force_recovery = 1 is not helping at all.

Now I'm kinda lost and out of options. Anyone faced something similar recently?

Thanks

Upvotes: 0

Views: 323

Answers (1)

akuzminsky
akuzminsky

Reputation: 2258

There is a tool that can retrieve MySQL database from corrupted disk https://launchpad.net/undrop-for-innodb .

I hope you still have old hard drive attached to the server or at least an image taken from it.

Download the last revision and compile it. You'd need gcc, flex and bison as the dependency.

Let's say you have attached the old (corrupted) disk as /dev/sdb

First, you need to scan the disk and find InnoDB pages

./stream_parser -f /dev/sdb

Then you need to recover InnoDB dictionary to know table name -> index_id correspondence. See "Recover InnoDB dictionary" for details.

You would also need tables structure. Take it from some old backup. (Other options would be to recover the structure from .frm files or from InnoDB dictionary)

When you know table structure and index_id of a table you can extract the table records from InnoDB pages:

./c_parser -6f pages-actor.ibd/FIL_PAGE_INDEX/0000000000002655.page -t actor.sql

actor.sql is CREATE TABLE statement

c_parser will generate LOAD DATA INFILE command to load the dump back in MySQL.

Upvotes: 1

Related Questions