Saturday, August 25, 2007

how to undelete rows from a fixed length myisam table

You have inadvertently deleted some rows from your table and want them back. This is semi-doable with fixed row format of MyISAM. I put together a few steps, which I'll compliment with a program that does it for you, later.

  • save output of SHOW TABLE STATUS LIKE 't1' and SHOW CREATE TABLE `t1`.
  • shutdown mysql server asap!
  • backup t1.frm, t1.MYI, t1.MYD immediately
  • create a new table t1_recover, which has no auto-inc and no unique/pk.
  • remove the files t1_recover.MYD and t1_recover.MYI
  • write a C program that scans through t1.MYD reading blocks of length Avg_row_length and checking if first byte indicates a row is marked as deleted.
  • if it's deleted, dump it as is into the file t1_recover.MYD
  • goto mysql prompt. issue REPAIR TABLE `t1_recover` USE_FRM
Some notes.

You cannot recover entire record. You'll lose first 6 bytes of each record (or how every long data pointer length is). Typically, this is the first 2 int columns trashed.

You cannot determine which columns contained NULL in the recovered records (assuming some columns are nullable).

If you anticipate to have to use this recovery method often, then you can create a fake char(9) column at the beginning of the table, so that when a row is deleted, this column will be overridden instead of your real data..

Here is the code! myisam undeleter

Example usage below:
1) create a table and delete some records:

mysql> create table mydel(id int, name char(15), address char(15), bday datetime, daysleft decimal(10,5));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into mydel values (1,'shane','down south','2005-09-01',10.5);
Query OK, 1 row affected (0.01 sec)

mysql> insert into mydel values (2,'susan car','up north','2001-02-01',14.1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mydel values (3,'bobby scott','chinatown','1976-12-21',55.5);
Query OK, 1 row affected (0.00 sec)

mysql> delete from mydel where id=2 or id=3;
Query OK, 2 rows affected (0.00 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> show table status;
+--------+--------+------------+------+----------------+-------------+
| Name | Engine | Row_format | Rows | Avg_row_length | Data_length |
+--------+--------+------------+------+----------------+-------------+
| mydel | MyISAM | Fixed | 1 | 49 | 147 |
+--------+--------+------------+------+----------------+-------------+

2) next, build and run the app:


> gcc -o undeleter -lm ./undeleter.c
>
> ./undeleter /5.1/data/test/mydel.MYD /5.1/data/test/mydel_recover.MYD 49
allocating a block of memory for records, 49 bytes
starting to read records
found deleted record at offset 49
found deleted record at offset 98
-----------------
completed
-----------------
records copied into '/5.1/data/test/mydel_recover.MYD': 2
records present in '/5.1/data/test/mydel.MYD': 1

next steps:
1. remove the MYI for '/5.1/data/test/mydel_recover.MYD'
2. make sure '/5.1/data/test/mydel_recover.MYD' definition .frm is created without any unique or PK keys
3. repair table use_frm


3) next, sort out the recovered table


sbester@www:/5.1/data/test> cp ./mydel.frm ./mydel_recover.frm

mysql> repair table mydel_recover use_frm;
+--------------------+--------+----------+------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+--------+----------+------------------------------------+
| test.mydel_recover | repair | warning | Number of rows changed from 0 to 2 |
| test.mydel_recover | repair | status | OK |
+--------------------+--------+----------+------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from mydel_recover;
+------+-------------+-----------+---------------------+----------+
| id | name | address | bday | daysleft |
+------+-------------+-----------+---------------------+----------+
| -1 | san car | up north | 2001-02-01 00:00:00 | 14.10000 |
| 0 | ☺bby scott | chinatown | 1976-12-21 00:00:00 | 55.50000 |
+------+-------------+-----------+---------------------+----------+
2 rows in set (0.00 sec)


Notice! I just cp the .frm. That's only because I didn't need to strip out the
PK or auto-increment column. As you seen, `id` is trashed. `name`
is partially trash. the `id` would have caused alot of duplicate key
errors if you still had a PK.

More information here: MySQL_Internals_MyISAM

9 comments:

Anonymous said...

does viagra work viagra cheap cheap viagra overnight viagra without a prescription viagra pharmacy viagra and alternatives viagra strips viagra rrp australia cost cialis v s viagra viagra oral herbal viagra how does viagra work mexican viagra viagra benefits

Anonymous said...

Communicate Our Risqu‚ Prices at www.Pharmashack.com, The Unequalled [b][url=http://www.pharmashack.com]Online More [/url][/b] To [url=http://www.pharmashack.com]Buy Viagra[/url] Online ! You Can also Espy Mammoth Deals When You [url=http://www.pharmashack.com/en/item/cialis.html]Buy Cialis[/url] and When You You [url=http://www.pharmashack.com/en/item/levitra.html]Buy Levitra[/url] Online. We Also Be subjected to a Mammoth Generic [url=http://www.pharmashack.com/en/item/phentermine.html]Phentermine[/url] In shore up of Your Victuals ! We Struggle up Trade earmark great wine [url=http://www.pharmashack.com/en/item/viagra.html]Viagra[/url] and Also [url=http://www.pharmashack.com/en/item/generic_viagra.html]Generic Viagra[/url] !

Anonymous said...

canada pharmacy celebrexsplit augmentin pills

[url=http://www.bebo.com/buylevitraonline1]buy dreampharmaceuticals levitra online[/url]

Anonymous said...

I read this forum since 2 weeks and now i have decided to register to share with you my ideas. [url=http://inglourious-seo.com]:)[/url]

Anonymous said...

Infatuation casinos? pursue throughout this untested [url=http://www.realcazinoz.com]casino[/url] advisor and about up online casino games like slots, blackjack, roulette, baccarat and more at www.realcazinoz.com .
you can also into our up to the two shakes of a lamb's tail log [url=http://freecasinogames2010.webs.com]casino[/url] orientate at http://freecasinogames2010.webs.com and knock far-off corporeal fabulously specious !
another subordinate [url=http://www.ttittancasino.com]casino spiele[/url] arbitrator is www.ttittancasino.com , in compensation german gamblers, upon to manumitted online casino bonus.

Anonymous said...

fgeicgb23486fbvy5f56gskngbyw764cdhg4736dbdydgs47dbeyag4d

mail секс знакомства
оренбургские знакомства секс
знакомства для секса и дружбы
секс знакомства бузулук
лесби секс знакомства
безрегистрации секс знакомства
знакомства секс мончегорск
пара ищет пару секс знакомства
ростов на дону секс знакомства
секс знакомства николаев
закрытый клуб секс знакомств
секс знакомства в армавире
сердобск секс знакомства
сайт секс знакомств в перми
секс знакомства алматы
секс знакомства
сайт секс знакомств в минске
порно онлайн знакомства секс
секс знакомства боровичи
секс знакомства чувашия
секс знакомства в чебаркуле
норильск секс знакомства
секс знакомства с полными женщинами
секс знакомства в белорецке
знакомства жены для секса
секс знакомства острогожск
секс знакомства в воркуте
бесплатные секс знакомства в мурманске
бесплатные секс знакомства в ярославле
канск секс знакомства

Anonymous said...

интим знакомства салехард
клуб знакомств суламифь
секс знакомства выборг
секс знакомства краматорск
иркутск интим знакомства доска
знакомства по интересам эзотерика
секс знакомства казань номером телефона
знакомство с лесбиянкой из рязани
знакомства лесби казахстан новость
как обманывают на сайтах знакомств
как я знакомилась зимой
секс знакомства по махачкале
клуб знакомств доверие
знакомство с девушками в черкассах
тюмень знакомства секс досуг
сайт одесских сексуальных знакомств
зеленодольск знакомства
международные брачные знакомства
интим знакомства старпон
знакомство с супружескими парами фото
секс знакомств в бийске
гей знакомства анапа
познакомтесь джо блэк
свинг знакомства в перми
белоруские сайты знакомств интим
знакомства мелеуз
знакомства с трансвеститами казахстана
знакомства в тольятти для инвалидов
иностраный сайт знакомств
знакомства город камышин

Anonymous said...

You could easily be making money online in the underground world of [URL=http://www.www.blackhatmoneymaker.com]blackhat money[/URL], It's not a big surprise if you have no clue about blackhat marketing. Blackhat marketing uses alternative or little-understood avenues to produce an income online.

Anonymous said...

It helped me saved 80K records.
Well, since the first 6 bytes were trashed. It was a partial recovery.

Better than nothing. Thanks.

http://www.tgpss.com/