mysql 数据库表误删除了 能恢复吗每个 DBA 是不是都有过删库的经历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表定义损坏数据无法读取怎么办?
我曾遇到某初创互联网企业 , 因维护人员不规范的备份恢复操作,导致系统表空间文件被初始化,上万张表无法读取 , 花了数小时才抢救回来 。
当你发现数据无法读取时,也许并非数据丢失了 , 可能是 DBMS 找不到描述数据的信息 。
背景
先来了解下几张关键的 InnoDB 数据字典表 , 它们保存了部分表定义信息,在我们恢复表结构时需要用到 。
SYS_TABLES 描述 InnoDB 表信息CREATE TABLE `SYS_TABLES` (`NAME` varchar(255) NOT NULL DEFAULT '',表名`ID` bigint(20) unsigned NOT NULL DEFAULT '0',表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,表空间idPRIMARY KEY (`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES 描述 InnoDB 索引信息CREATE TABLE `SYS_INDEXES` (`TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT '0', 与sys_tables的id对应`ID` bigint(20) unsigned NOT NULL DEFAULT '0',索引id`NAME` varchar(120) DEFAULT NULL,索引名称`N_FIELDS` int(10) unsigned DEFAULT NULL, 索引包含字段的个数`TYPE` int(10) unsigned DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,存储索引的表空间id`PAGE_NO` int(10) unsigned DEFAULT NULL,索引的root page idPRIMARY KEY (`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS 描述 InnoDB 表的字段信息CREATE TABLE `SYS_COLUMNS` (`TABLE_ID` bigint(20) unsigned NOT NULL, 与sys_tables的id对应`POS` int(10) unsigned NOT NULL,字段相对位置`NAME` varchar(255) DEFAULT NULL,字段名称`MTYPE` int(10) unsigned DEFAULT NULL,字段编码`PRTYPE` int(10) unsigned DEFAULT NULL, 字段校验类型`LEN` int(10) unsigned DEFAULT NULL,字段字节长度`PREC` int(10) unsigned DEFAULT NULL, 字段精度PRIMARY KEY (`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS 描述全部索引的字段列CREATE TABLE `SYS_FIELDS` (`INDEX_ID` bigint(20) unsigned NOT NULL,`POS` int(10) unsigned NOT NULL,`COL_NAME` varchar(255) DEFAULT NULL,PRIMARY KEY (`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h 文件定义了每个字典表的 index id,对应 id 的 page 中存储着字典表的数据 。
这里我们需要借助 undrop-for-innodb 工具恢复数据,它能读取表空间信息得到 page , 将数据从 page 中提取出来 。
# wgetyum install -y gcc flex bison# make# make sys_parser
# ./sys_parser 读取表结构信息
sys_parser [-h] [-u] [-p] [-d] databases/table
stream_parser 读取 InnoDB page 从 ibdata1 或 ibd 或分区表
# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f innodb_datafile [-T N:M] [-s size] [-t size] [-V|-g]Where:-h- Print this help-V or -g- Print debug information-s size- Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M-T- retrieves only pages with index id = NM (N - high word, M - low word of id)-t size- Size of InnoDB tablespace to scan. Use it only if the parser can't determine it by himself.
c_parser 从 innodb page 中读取记录保存到文件
# ./c_parserError: Usage: ./c_parser -4|-5|-6 [-dDV] -f InnoDB page or dir -t table.sql [-T N:M] [-b external pages directory]Where-f InnoDB page(s) -- InnoDB page or directory with pages(all pages should have same index_id)-t table.sql -- CREATE statement of a table-o file -- Save dump in this file. Otherwise print to stdout-l file -- Save SQL statements in this file. Otherwise print to stderr-h-- Print this help-d-- Process only those pages which potentially could have deleted records (default = NO)-D-- Recover deleted rows only (default = NO)-U-- Recover UNdeleted rows only (default = YES)-V-- Verbose mode (lots of debug information)-4-- innodb_datafile is in REDUNDANT format-5-- innodb_datafile is in COMPACT format-6-- innodb_datafile is in MySQL 5.6 format-T-- retrieves only pages with index id = NM (N - high word, M - low word of id)-b dir -- Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/-i file -- Read external pages at their offsets from file.-p prefix -- Use prefix for a directory name in LOAD DATA INFILE command
【mysql表误删怎么恢复 mysql找回删除的表】接下来,我们演示场景的几种数据恢复场景 。
场景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
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
4. 最后导入恢复的数据
cat dumps/default/*.sql | mysql sakila
更多详细情况点击网页链接
请点击输入图片描述
mysql误删除一个表,可以恢复吗1、首先构建测试环境数据create table t1(a varchar(10),b varchar(10));insert into t1 values('1','1');insert into t1 values('2','2');commit; 。
2、模拟误修改mysql表误删怎么恢复,将t1表中的b字段更新为错误数据 "123456"update t1 set b='123456' where a='1';commit;select * from t1; 。
3、将恢复工具上传到服务器并进行解压 。unzip binlog2sql-master.zip 。
4、得到误修改时的binlog文件(show binary logs;)mysql表误删怎么恢复,实验环境是mysql-bin.000011 。
5、通过 binlog2sql.py 脚本的到所有 对表 t1 的修改操作 。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011' 。
6、得到mysql表误删怎么恢复了误删除的sql的准确位置在1382-1615之间mysql表误删怎么恢复,使用 _**-B**_ 选项生成回滚sql 。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011' --start-position=1382 --stop-position=1615 -B 。
7、执行得到的回滚语句进行误操作恢复 。就完成mysql表误删怎么恢复了 。
如何恢复数据库表删除数据 mysql以下情况可以恢复数据:
1 innodb引擎表开启了事务 , 执行dml语句,比如delete、update、insert之类,并且没有提交即commit操作的话,可以执行rollback进行回滚恢复 。如果是ddl操作,如drop、create、alter之类的操作时无效的
2 在进行删除操作之前有备份,比如mysqldump,物理备份数据文件之类的操作,那么可以恢复到删除前的数据
3 如果你的删除操作是直接对data下的文件进行删除,注意,不是粉碎文件操作,那么你可以尝试用磁盘恢复软件来找回被误删的数据文件;
除以上情况,其他真的是没法恢复了,不过貌似很多公司号称能够恢复,要收费,具体他们怎么恢复我就不晓得了 。
MySQL删除表怎么恢复?情况1、如果mysql表误删怎么恢复你有该库mysql表误删怎么恢复的整体备份或对这个表mysql表误删怎么恢复的单独备份mysql表误删怎么恢复,那么也许可以恢复 。可以将最新的备份恢复到一个备用的服务器上 , 导出那表的内容,完成恢复
情况2、如果没有任何备份 , 那就基本没戏mysql表误删怎么恢复了 。一般删除表的操作是drop table,日志中不会记录删除具体行数的记录 。表所对应目录下的文件已经被删除(innodb独立表空间,单表归为一文件) 。同样的情况适用于myisam数据库引擎 , 对应的myd/myi/frm文件均被删除 。这不像windows还有垃圾箱,是不可逆的操作
关于mysql表误删怎么恢复和mysql找回删除的表的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 种地技巧直播,种地视屏
- python编雨伞代码,python下雨
- excel怎么使文字竖起,excel如何使文字竖排
- 计算机毕业设计参考书目,计算机本科生毕业设计题目
- mysql里的外键怎么写 mysql 外键语句
- cpu离线是什么,pc离线什么意思
- android+模拟器,android模拟器不能导出文件
- 珠宝直播卖货形式,珠宝直播怎么做好
- php如何把数据加减乘除 php用函数做加减乘除