接下来,我们演示场景的几种数据恢复场景 。
场景1:drop table
是否启用了 innodb_file_per_table 其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动 。若 innodb_file_per_table=ON , 最好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据 。
如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1 中筛选出 。
# grep WOODYHOFFMAN ibdata1
Binary file ibdata1 matches
也可以使用 bvi(适用于较小文件)或 hexdump -C(适用于较大文件)工具
以表 sakila.actor 为例CREATE TABLE `actor` (`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`actor_id`),KEY `idx_actor_last_name` (`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8
首先恢复表结构信息1. 解析系统表空间获取 page 信息
./stream_parser -f /var/lib/mysql/ibdata1
2. 新建一个 schema,把系统字典表的 DDL 导入
cat dictionary/SYS_* | mysql recovered
3. 创建恢复目录
mkdir -p dumps/default
4. 解析系统表空间包含的字典表信息,
./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sqldumps/default/SYS_TABLES 2 dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sqldumps/default/SYS_COLUMNS 2 dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sqldumps/default/SYS_INDEXES 2 dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page -t dictionary/SYS_FIELDS.sqldumps/default/SYS_FIELDS 2 dumps/default/SYS_FIELDS.sql
5. 导入恢复的数据字典
cat dumps/default/*.sql | mysql recovered
6. 读取恢复后的表结构信息
./sys_parser -pmsandbox -d recovered sakila/actor
由于 5.x 版本 innodb 引擎并非完整记录表结构信息,会丢失 AUTO_INCREMENT 属性、二级索引和外键约束,DECIMAL 精度等信息 。
若是 mysql 5.5 版本 frm 文件被从系统删除,在原目录下 touch 与原表名相同的 frm 文件,还能读取表结构信息和数据 。若只有 frm 文件,想要获得表结构信息,可使用 mysqlfrm --diagnostic /path/to/xxx.frm , 连接 mysql 会显示字符集信息 。
innodb_file_per_table=OFF
因为是共享表空间模式 , 数据页都存储在 ibdata1 , 可以从 ibdata1 文件中提取数据 。
1. 获取表的 table id,sys_table 存有表的 table id,sys_table 表 index id 是1,所以从0000000000000001.page 获取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor000000000B282A000001430D4DSYS_TABLES"sakila/actor"15841 00""0000000000B282A000001430D4DSYS_TABLES"sakila/actor"15841 00""0
2. 利用 table id 获取表的主键 id,sys_indexes 存有表索引信息,innodb 索引组织表,找到主键 id 即找到数据 , sys_indexes 的 index id 是3,所以从0000000000000003.page 获取主键 id
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158000000000B282A000001430BCASYS_INDEXES158376"PRIMARY"1304294967295000000000B282A000001430C3CSYS_INDEXES158377"idx_actor_last_name"1004294967295000000000B282A000001430BCASYS_INDEXES158376"PRIMARY"1304294967295000000000B282A000001430C3CSYS_INDEXES158377"idx_actor_last_name"1004294967295
【mysql表误删怎么办 mysql不小心删除了表】3. 知道了主键 id,就可以从对应 page 中提取表数据,并生成 sql 文件 。
./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t sakila/actor.sqldumps/default/actor 2 dumps/default/actor_load.sql
推荐阅读
- js对象数组去重,js数组中的对象去重合并
- chatgpt无效的url,chatGPT授权码无效
- asp.net获取当前窗口,aspnet弹出窗口选择
- 蓬安天然气关注公众号,蓬安天然气电话
- php列出数据库中图片 php读取图片并输出
- 磐安sap产品成本会计,sap成本会计日常工作
- gis面转栅格在哪,gis中栅格转面
- 荣誉勋章是单机游戏吗,荣誉勋章有几部游戏
- 温度转化java代码 温度转换java代码