drop table!

https://twindb.com/recover-innodb-table-after-drop-table-innodb/

这个blog有介绍,下面是我自己的测试。

首先是安装工具undrop-for-innodb

这个blog上又说明。其实很简单自己安装就是了,报错的时候应该是缺什么东西,自己google一下安装。这里不介绍这个工具的安装。这个工具里面是实验用的数据库,执行一些test.sh这个文件就能生成。如果有问题自行解决。

这里有个条件。innodb_file_per_table 需要关闭,就是mysql是共享表空间

删掉actor这个表。

然后你要停掉数据库。
第一步:分析表空间文件。
[root@localhost undrop-for-innodb]# ./stream_parser -f /var/lib/mysql/ibdata1 Opening file: /var/lib/mysql/ibdata1 File information: ID of device containing file:        64768 inode number:                       920134 protection:                         100660 (regular file) number of hard links:                    1 user ID of owner:                       27 group ID of owner:                      27 device ID (if special file):             0 blocksize for filesystem I/O:         4096 number of blocks allocated:          53248 time of last access:            1407318543 Wed Aug  6 17:49:03 2014 time of last modification:      1407318553 Wed Aug  6 17:49:13 2014 time of last status change:     1407318553 Wed Aug  6 17:49:13 2014 total size, in bytes:             27262976 (26.000 MiB) Size to process:                  27262976 (26.000 MiB) All workers finished in 0 sec

第二步:找到表的id
[root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page |-t dictionary/SYS_TABLES.sql | grep sakila/actor -bash: -t: command not found [root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor 000000000580000000041504F4SYS_TABLES"sakila/actor”13 4 1 0 0 “" 0 000000000580000000041504F4SYS_TABLES"sakila/actor”13 4 1 0 0 “" 0 SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/SYS_TABLES' REPLACE INTO TABLE `SYS_TABLES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_TABLES\t' (`NAME`, `ID`, `N_COLS`, `TYPE`, `MIX_ID`, `MIX_LEN`, `CLUSTER_NAME`, `SPACE`);

表ID是13
第三步:找到表的主键
[root@localhost undrop-for-innodb]# ./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 13 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 000000000580 00000004150371 SYS_INDEXES 13 15 “PRIMARY” 1 3 0 4294967295 000000000580 000000041503E3 SYS_INDEXES 13 16 "idx\_actor\_last\_name” 1 0 0 4294967295 SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/SYS_INDEXES' REPLACE INTO TABLE `SYS_INDEXES` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'SYS_INDEXES\t' (`TABLE_ID`, `ID`, `NAME`, `N_FIELDS`, `TYPE`, `SPACE`, `PAGE_NO`);
接下来是主键13的页 15
第四步:查找叶子节点的数据

[root@localhost undrop-for-innodb]# ./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000015.page -t sakila/actor.sql |  head -5 -- Page id: 50, Format: COMPACT, Records list: Valid, Expected records: (200 200) 00000000051C800000002D0110actor1"PENELOPE""GUINESS""2006-02-15 04:34:33" 00000000051C800000002D011Aactor2"NICK""WAHLBERG""2006-02-15 04:34:33" 00000000051C800000002D0124actor3"ED""CHASE""2006-02-15 04:34:33" 00000000051C800000002D012Eactor4"JENNIFER""DAVIS""2006-02-15 04:34:33

第四步:找回丢失的数据

mkdir -p dumps/default
 cat dumps/default/actor_load.sql 这里面是找回丢失数据的命令
[root@localhost undrop-for-innodb]#  cat dumps/default/actor_load.sql SET FOREIGN_KEY_CHECKS=0; LOAD DATA LOCAL INFILE '/root/undrop-for-innodb/dumps/default/actor' REPLACE INTO TABLE `actor` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'actor\t' (`actor_id`, `first_name`, `last_name`, `last_update`);


这个前提是你知道表结构定义。。让后执行一下这两个命令,丢失的数据回来了。

o了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章