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

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

发布网友 发布时间:2022-04-20 00:14

我来回答

3个回答

热心网友 时间:2022-04-07 16:08

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

热心网友 时间:2022-04-07 17:26

有没有完整备份?

热心网友 时间:2022-04-07 19:01

每个 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数据库丢失别慌来了解一下MySQL不见的可能原因及解决办法mysql不...

使用命令行或者其他 GUI 工具进行数据修复。如果是语法错误,可以通过单词检查、发布/拉取操作或者优化表进行修复。如果是数据损坏问题,可以使用故障恢复工具或者第三方数据库修复工具来修复数据。3.重建数据库 如果数据库已经无法恢复,可以使用 CREATE DATABASE 命令重新创建数据库。但是这时候需要注意,我们...

mysql数据库删除了怎么恢复

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

记一次mysql(用delete删除)数据恢复

首先,确认MySQL数据库版本为8.0,并且已开启binlog日志功能。在Linux环境下,日志文件通常位于/var/lib/mysql/目录中,文件名称以“binlog.”开头,通过找到序号最大的文件,即可定位到最近的删除操作日志。接下来,明确数据删除的时间范围,精确性越强,恢复操作的准确性越高。提取日志数据时,时间范围...

MySQL数据库备份和恢复(还原)的方案

MySQL数据库恢复(还原)方案则是在需要恢复数据时使用Percona XtraBackup工具,执行相应的恢复命令,将备份文件恢复到目标服务器或新服务器上。恢复过程中,需要注意服务器性能、存储空间等因素。此外,当进行恢复操作时,需确保数据库版本与备份文件兼容,同时正确设置恢复命令参数。综上所述,使用Percona ...

突然消失无法找到MySQL数据库mysql不见了

如果返回“stop/wting”消息,则表示MySQL服务器已停止运行,需要重新启动服务器:sudo service mysql start 2. 恢复丢失的数据库文件 如果数据库文件丢失或损坏,则需要重建数据库。可以按照以下步骤来完成:首先备份现有数据。考虑使用mysqldump命令,将现有数据导出到文件中。停止MySQL服务:sudo service ...

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

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

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

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

mysql数据库删除了怎么恢复 mysql数据库误删除数据恢复 数据库误删除数据怎么恢复 数据库误删了表数据怎么恢复 mysql误删数据库怎么恢复 mysql怎么恢复删除的数据 数据库删掉的数据怎么恢复 mysql数据库被删恢复 怎么找回数据库删除的数据
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
二维码签到二维码签到的应用范围 家庭装修一般用哪一种灯带比较好呢? 我发现隔壁住户每天家里都有好多陌生人进出我可以举报吗?我一人... 网上都说如果作业过于多的话是可以举报的,我们学校作业就特别多,每天... 如果本人在法庭上说自己用了20万找的工作可以去他单位举报吗? ...个民族习俗的情况下去诋毁,造谣 是不是有触犯法律,可以举报吗... ...上穿短裙不穿内裤,被人看见感到不适,可以举报吗? 微信钱包绑银行卡提示证件号格式不符,为什么会不符 微信被永久封号了,怎样解绑银行卡 ​Broadcast、Unicast以及Multicast是什么意思? mysql的数据删除后怎么恢复 不小心删掉了mysql数据库怎么办 mysql数据库删除了怎么恢复 U盘中有部分内容不见了 mysql数据库被删除后怎么恢复 U盘内文件突然不见了,但是属性里面显示内存还占着... mysql删除被的数据库怎么还原? mysql删除数据库后怎么恢复 u盘里的文件不见了~但是还占着内存~求解决办法! 为什么U盘里的文件夹不见了 U盘中突然其中一个文件夹里的东西都不见了 U盘里隐藏的文件夹找不到了,怎么才能找回来? 我的u盘中有些文件夹找不到了,怎么查找出来 U盘里面的文件夹看不见了怎么办? U盘里面的文件夹看不见了怎么办.显示隐藏的也找不到 U盘里经常打开的文件夹不见了,怎么办? u盘中的一个文件夹里的内容不见了,怎么办? u盘里的东西突然就不见了怎么回事 u盘里部分文件夹不见了怎么办 苏州拓创网络科技有限公司怎么样? MySQL 数据库被删了怎么办 mysql数据库删除了怎么还原数据 mysql中的mysql数据库被删除怎么恢复 mysql数据库错误删除了怎么恢复数据 Mysql Innodb数据库误删除了文件,怎么恢复? 怎么恢复mysql数据表里刚刚删除的东西 mysql数据库被删除了,怎么恢复吗 mysql中的root账户不小心删除了,怎么恢复root用户 怎样找回MYSQL数据库中删除的数据 去学生会面试自我介绍怎么说? 文字,声音,图像,动画,视频,书包,报纸,电视,这八个中都是哪个是媒体 学生会面试时该怎么介绍自己 学生会面试自我介绍怎么说好 大学参加学生会面试怎么自我介绍 学生会面试自我介绍急急急急? ps怎样把图片上的字去掉但不影响图片 美图秀秀怎么去掉图片上的字 ps怎么将图片上的文字去掉 怎么把图片上的字去掉? 如何把图片上的文字去掉