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

mysql 某个数据库被删除怎么恢复

发布网友 发布时间:2022-04-23 09:30

我来回答

2个回答

热心网友 时间:2022-04-10 03:49

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

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

每个 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数据库,就可以通过备份文件还原数据。可以使用命令行或图形界面工具,找到备份文件并还原。以命令行方式为例,执行以下命令:mysql -u root -p Enter password:mysql&gt; CREATE DATABASE database_name;mysql&gt; USE database_name;mysql&gt; SOURCE /path...

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

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

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

首先,如果数据库有定期备份,如每天12点的完全备份,那么在灾难发生后,可以利用备份文件和增量的binlog文件进行数据恢复。操作步骤包括:确认MySQL已开启binlog日志功能,通过在my.cnf文件中添加相关配置。检查备份情况,如ops库中的customers表,通过全备份文件(如ops_2016-09-25.sql.gz)中的CHANGE MA...

mysql数据库删除了怎么恢复

3 赶紧把数据备份一份出来,重新把所有库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。4 重新做用户授权。

mysql数据库被删除了,怎么恢复吗

你这个问题就不好办了,因为数据文件要随时改变。所以你恢复是会有很多同名的文件,一定要确定是最新的那个才有可能恢复。如果确认是最新的数据文件也无法导入到数据库中的话,就没有办法恢复了!!除非你数据很重要,由专业人员将你的文件修复!

mysql数据库被删除后怎么恢复

其中at 1099代表第1099个命令(姑且这么记),查询这些命令,看看需要回复的命令在什么地方,然后执行命令。最后:执行回复命令,如下:mysqlbinlog --start-position="123" --stop-position="531" F:/wamp/mysql-bin.000045 F:/test.txt | mysql -uroot -p 这样就可以完成数据库的回复了...

mysql数据库错误删除了怎么恢复数据

如果你要恢复的数据库是包含授权表的mysql数据库,您将需要使用--skip赠款-tables选项来运行服务器恢复整个数据库-否则,服务器会抱怨不能找到授权表。恢复表后,执行mysqladmin冲水privileges告诉服务器装载授权表,并用它们来启动。数据库目录到其他地方的原始内容复制。

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

1 找个别的机器安装个同版本的mysql或从已安装同版本的其他机器上(非同版本的也可以试下):拷贝 mysql/data/mysql 目录到你的mysql/data/ 下吧 2 试着启动mysql服务,如果能启动了,理论上应该丢失的只有用户、授权等一些系统信息,不影响你的使用的数据;如果不能启动,看错误日志,争取启动了。3...

怎样找回MYSQL数据库中删除的数据

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

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

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

mysql数据库误删除数据恢复 mysql数据库删除了怎么恢复 数据库误删除数据怎么恢复 mysql误删数据库怎么恢复 mysql怎么恢复删除的数据 数据库删掉的数据怎么恢复 数据库误删了表数据怎么恢复 mysql数据库被删恢复 怎么找回数据库删除的数据
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...是价值工程活动的中心环节,按功能的性质分类,可将功能分为... ...自己家的win8笔记本突然找不到自己家的wifi了 上次关机前还可以的... 迪士尼动画片都有哪些 放置江湖梦境多少层 放置江湖剑阵怎么过 放置江湖落英谷重光攻略 制药工程可以考执业药师吗?本科生毕业几年可以考?有的地方查到是一年... 请问制药工程专业本科毕业的学生,在药厂工作了3年,能考些什么证书... 放置江湖赌场副本怎么打 放置江湖蹭血方法介绍_放置江湖蹭血方法是什么 用微信购买演出票是不是很潮啊? SQL数据库中删除的数据库怎么恢复? 演艺行业如何推广? 纸抽是怎么一张一张放进去的? 为什么我的微信电影演出赛事打不开? sql server文件被删除怎么办 塑封机为什么会卷纸 杭州那里能买到塑封膜(塑封纸) 有哪些特别好的娱乐八卦微信公众号 sql sever不小心删除数据怎么恢复 为什么演艺圈里的人电话号码和都很难被流出来? 如何手工给DVD盒子完美塑封? 如何运营好从事文艺演艺活动策划的企业的微信订阅号 用sql语句删除的数据库怎么恢复? 不规则纸张可以塑封吗? 纸张都有哪几种?哪种手感比较好些,适合做海报的,叫什么纸 SQL,误删除如何恢复? 删除了SQL SERVER数据库文件,怎么恢复正常?求大神指点。 塑封膜的厚度是以丝为单位计算的吗?通常用的有哪几种尺寸的厚度呢? 用两个字形容一个人有上进心 错删掉sql数据库怎么找回? 在微信公众号上面看到的剧组演员招聘没有演艺基础可以报名吗? 有没有搞笑娱乐类的微信公众号可以推荐啊 微信公众号中群众演员招聘是真是假 娱乐圈名人公开的是真的吗? 我想买演唱会的门票,在微信我的里面的电影演出赛事安全吗。 尔冬升导演主动加曹骏微信,曹骏的演艺道路是否将一片大好? 微信上面的娱乐明星人气排行榜投票是干什么的? 程潇的微信怎么加? 厦门灏亦富贸易有限公司怎么样? 如何删除微信支付里面的电影演出赛事? 广东灏富机电工程有限公司怎么样? 娱乐圈最大牌的明星,拒绝王菲加微信,又拒绝董明珠请吃饭,他是谁? 秦霄贤终于加上了高圆圆微信,娱乐圈有哪些艺人追星成功的? 深圳前海灏富科技有限公司怎么样? 北京纪检委举报电话24小时服务热线? 演艺圈最近有什么征星活动 北京网络诈骗如何举报 - 信息提示 北京市公安局人民投诉电话