问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql数据库表数据删除能恢复吗

发布网友 发布时间:2022-04-23 11:49

我来回答

2个回答

热心网友 时间:2022-05-07 15:04

1 找个别的机器安装个同版本的mysql或从已安装同版本的其他机器上(非同版本的也可以试下):
拷贝 mysql/data/mysql 目录到你的mysql/data/ 下吧
2 试着启动mysql服务,如果能启动了,理论上应该丢失的只有用户、授权等一些系统信息,不影响你的使用的数据;
如果不能启动,看错误日志,争取启动了。
3 赶紧把数据备份一份出来,重新把所有库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。
4 重新做用户授权。

热心网友 时间:2022-05-07 16:22

除了自动备份以外,还可以教你一招。

每个 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 id  PRIMARY 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 中提取出来。

# wget https://github.com/chhabhaiya/undrop-for-innodb/archive/master.zip# yum 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 mp 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



接下来,我们演示场景的几种数据恢复场景。

场景1:drop table

是否启用了 innodb_file_per_table 其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动。若 innodb_file_per_table=ON,最好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据。

如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1 中筛选出。

# grep WOODYHOFFMAN ibdata1

Binary file ibdata1 matches

也可以使用 bvi(适用于较小文件)或 hexmp -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 mps/default

4. 解析系统表空间包含的字典表信息,

./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql > mps/default/SYS_TABLES 2> mps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sql > mps/default/SYS_COLUMNS 2> mps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql > mps/default/SYS_INDEXES 2> mps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page -t dictionary/SYS_FIELDS.sql > mps/default/SYS_FIELDS 2> mps/default/SYS_FIELDS.sql

5. 导入恢复的数据字典

cat mps/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 会显示字符集信息。


数据误删怎么恢复MySQL数据mysql不小心把用户

如果以上两种方法均失败或不适用,可以使用专业的数据恢复工具恢复MySQL数据库中的数据。常见的工具包括EaseUS Data Recovery、UndeleteMyFiles Pro等等。这些工具可以通过扫描磁盘上的数据库文件,找到被删除的数据并进行恢复。不过需要注意的是,使用数据恢复工具恢复数据时需要谨慎操作,防止进一步损坏数据文件。

解决MySQL误删数据的方法分享mysql不小心删除

如果您已经误删了某些数据,并且没有及时备份,那么您可以尝试使用一些数据恢复工具来恢复丢失的数据。 MySQL自带的工具是mysqldump,可以用来备份和还原MySQL数据库,但是它不支持部分数据恢复。如果您需要恢复部分数据,可以使用第三方工具,如Recuva、EaseUS Data Recovery等。4. 使用MySQL日志功能进行数据恢复...

MySQL 数据库误删除后的数据恢复操作说明

当MySQL数据库不慎被误删除时,数据恢复成为关键。以下是一种恢复策略:首先,如果数据库有定期备份,如每天12点的完全备份,那么在灾难发生后,可以利用备份文件和增量的binlog文件进行数据恢复。操作步骤包括:确认MySQL已开启binlog日志功能,通过在my.cnf文件中添加相关配置。检查备份情况,如ops库中的cus...

能实现清空表数据(数据库误删了表数据怎么恢复)

能实现清空表数据,数据库误删了表数据怎么恢复。小编来告诉你更多相关信息。作者:杨小云 爱可生数据库工程师,负责 MySQL 日常维护及 DMP 产品支持。擅长mysql故障处理。场景:客户误删了一张表,所以 想恢复某张表的数据,期望恢复到删除之前的数据。前提:数据库误删某表恢复方法,下面介绍的的方法是针...

如何恢复误删的MySQL表格mysql不小心删了表格

如果您没有备份MySQL数据,您可以使用MySQL Binlog恢复误删的表格。请注意,您必须在删除表格后立即执行此操作。执行以下操作:mysqlbinlog binlog.000001 &gt; /tmp/binlog.sql 将“binlog.000001”替换为您的MySQL二进制日志文件的名称。然后,打开/tmp/binlog.sql文件,找到删除表格的部分。将删除表格的...

如何恢复数据库表删除数据 mysql

以下情况可以恢复数据:1 innodb引擎表开启了事务,执行dml语句,比如delete、update、insert之类,并且没有提交即commit操作的话,可以执行rollback进行回滚恢复。如果是ddl操作,如drop、create、alter之类的操作时无效的 2 在进行删除操作之前有备份,比如mysqldump,物理备份数据文件之类的操作,那么可以恢复到...

如何快速还原MySQL数据库mysql数据库还原

1.首先登录phpMyAdmin。2.点击“还原”,把要还原的sql文件选中 3.即可完成数据库还原,期间可以观察sql文件的执行过程 示例:PhpMyAdmin快速还原MySQL数据库 mysql&gt; source “c:\file.sql”方法二:使用mysql命令快速还原MySQL数据库 要使用mysql命令快速还原MySQL数据库,用户可以在mysql下执行...

mysql数据库表数据删除能恢复吗

理论上应该丢失的只有用户、授权等一些系统信息,不影响你的使用的数据;如果不能启动,看错误日志,争取启动了。3 赶紧把数据备份一份出来,重新把所有库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。4 重新做用户授权。

mysql数据库删除了怎么恢复

理论上应该丢失的只有用户、授权等一些系统信息,不影响你的使用的数据;如果不能启动,看错误日志,争取启动了。3 赶紧把数据备份一份出来,重新把所有库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。4 重新做用户授权。

如何恢复宝塔面板mysql数据库中误删除的数据表

以下情况可以恢复数据:1 innodb引擎表开启了事务,执行dml语句,比如delete、update、insert之类,并且没有提交即commit操作的话,可以执行rollback进行回滚恢复。如果是ddl操作,如drop、create、alter之类的操作时无效的 2 在进行删除操作之前有备份,比如mysqldump,物理备份数据文件之类的操作,那么可以恢复到...

mysql恢复数据库 mysql删除数据库命令 mysql怎么删除数据库 mysql创建数据库表 jsp连接mysql数据库 mysql怎么建立数据库 mysql如何导出数据库 mysql数据库界面 mysql怎么导入数据库
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
万江街道街道历史 新谷涌社区基本概况 广东省东莞市东莞市万江区万江共联莲子村东南区一路2横巷邮编是... 东莞市万江区共联有没有专门来收快递,求电话 ...两条线,一条直接连电脑1,另一条线连接一个路由器,然后有链接一台电脑... 一个光猫下面连接路由器,从路由器分出两个线,一个接到交换机a,一个接... 小女孩带金佛辟邪吗? 有哪些适合收藏的酒推荐? 西方酒文化之西方饮酒方式 哪些威士忌具有收藏价值? 我买了台电u盘如何鉴别真伪? 绍兴柯桥许美服饰有限公司怎么样? 韩国电视剧女的叫许美,男的说她太可爱了,要追她,请问是什么片名? 梦见给暗恋的人打电话接了,但是自己不敢说话。解梦 备孕可以用科士威浪漫身体乳吗 求教··怎样检测台电U盘真伪? 苹果13原相机怎么那么清晰 如何评价iOS 13在iPhone Xs上的表现? 梦见在坟墓上采蘑菇 梦见一片坟地,每个坟头都有一个洋娃娃似的活物,好像是已逝者家人放那... 梦到坟,具体如下 梦见自己在好多坟地上玩 做梦梦到和死去的爷爷玩捉迷藏 为什么会梦到玩捉迷藏,自己藏到墓地里 梦见在坟墓群捉迷藏代表什么? 求离保定最近的土豆产地 我附近种植土豆子的 哪里的土豆批发最便宜质量好的 最近新电影,在土豆上有的 栽土豆旁边放玉米壤有增产效果吗? 梦见跟自己暗恋的人打电话并向他表白,但他却没反映拜托各位了 3Q 有人可以解释一下吗? 题画诗册页 清.普荷 无事不许美, 得梅归去来, 雪深春尚浅, 一半到家开。 mysql ibdata1删除后怎么恢复表结构 叫许美娇子好看吗? 我不介意你慢动作是什么歌? 有没有性价比高,好闻的身体乳?请问? 请问有谁知道怎样辨别台电科技的U盘真伪 有哪些清爽不油腻的身体乳值得分享? 梦见和喜欢的人打电话发不出声音是怎么回事(最后好不容易说出一句话) 忆回?过么对去 求教··怎样检测台电U盘真伪 如何识别购买的台电 u盘是原装还是组装的 台电U盘真伪查询? 梦见和喜欢的人打电话 ? lazada怎么发货? 梦见给恋人打电话叫她出来她说家里人不要她出来? 梦见给暗恋的男生打电话但是不是他接的 台电64G U盘真伪查询 梦到暗恋的人,怎么办啊? 科士威浪漫身体护肤乳可以擦脸吗