问答文章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

我来回答

2个回答

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

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

复制。例如,您可以使用它们在以后的事后分析检查表(验尸)的崩溃。
酒店与最新的数据库备份文件重新加载。如果您打算使用mysqlmp的所加载的文件,则需要输入它们作为mysql的。如果您打算使用从数据库文件直接拷贝(例如,使用tar或CP),它会复制他们直接回数据库目录中。然而,在这种情况下,你应该在关闭之前,该服务器复制这些文件,然后重新启动它。在备份过程中

重做日志,然后查询更新数据库表中。对于所有可用的更新日志,你可以使用它作为mysql的输入。指定--one-database选项,因此MySQL只是要还原的数据库执行查询。如果你意识到有必要使用所有的更新日志文件,可以使用包含以下命令日志的目录:

%LS-TRL更新(0-9)* | xargs的猫| mysql--。一个数据库DB_NAME

ls命令生成一个单独的日志文件更新列表,更新日志文件根据服务器(你知道,如果你其中的任何文件,排序顺序生成的顺序进行排序会发生变化,这将导致在更新日志中以错误的顺序使用)。有限公司您可能需要使用一些更新日志。例如,如果日志,因为命名update.392备份,pdate.393等产生的,可以在命令重新运行它们:

%的mysql - 一个数据库DB_NAME <录入。 392
%的mysql - 一个数据库DB_NAME <updata.393 ...

如果您正在运行的恢复,并打算使用更新日志恢复由于失误降数据的基础上,DROPTABLE或DELETE语句和丢失的信息时,一定要在开始更新日志删除这些语句。

恢复单个表

恢复单个表是非常困难的。如果是的mysqlmp备份文件生成的,它只是不包含数据,您需要一个表,你需要提取的相关线路,并利用它们作为mysql的输入,这部分比较容易。困难的是,提取在该表的更新日志中使用的片段。你会发现:mysql_find_rows工具在这方面有所帮助,它可以提取多行从更新日志查询。另一种可能性是使用另一台服务器

恢复整个数据库,然后将该文件复制到表的原始数据库。这其实很容易!当文件被复制回数据库目录,确保原始数据库服务器关闭。

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

每个 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的配置文件,在文件中添加一行”log_bin=mysql-bin”即可。其实在我安装的各种Mysql环境中,该功能通常都是默认开启的。开启binlog功能后,在mysql的数据库目录下就会有诸如mysql-bin.000001、mysql-bin.000002等...

如何恢复mysql表中清除的数据

1、第一步,查询语句:select*fromtable_name;或select*fromtable_namewhere[条件]2、第二步,增加语句或插入数据insertintotable_name(clus...)values(values...)实例如图:3、修改数据:updatetablenamesetxx=xx,xxx=xx...

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

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

mysql数据库删除了怎么恢复

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

mysql 数据被清空了怎么恢复

3如果你的删除操作是直接对data下的文件进行删除,注意,不是粉碎文件操作,那么你可以尝试用磁盘恢复软件来找回被误删的数据文件;除以上情况,其他真的是没法恢复了,不过貌似很多公司号称能够恢复,要收费,具体他们怎么恢复...

怎么恢复mysql数据库怎么恢复数据

从另一台机上把MySQL数据库的mysql文件夹拷贝到本地机上,目的是恢复本地机对数据的访问和操作。经过如下几种情况的操作。1.在本地重装MySQL(安装目录D:\ProgramFiles\MySQL\MySQLServer5.0),直接把mysql文件夹拷贝...

Mysql如何使用phpMyadmin进行数据库的备份恢复

恢复为了演示恢复我已经把“dedecmsv57utf8sp1”这个库删除了,如图所示我们在红色区域输入要恢复的数据库名称,我们这里要恢复“dedecmsv57utf8sp1”这个数据库,所以红色区域输入“dedecmsv57utf8sp1”输入后,如图所示点击“...

mysql数据表内容删除后怎么恢复

1.如果开启了日志,直接mysqlbinlog使用日志恢复即可。2.如果不是删除了一个表的部分数据,而是删除整个表,那么可以在删除后马上用磁盘数据恢复软件尝试恢复。(因为删除表后会有文件被删除,而删除表的部分数据,文件还是...

Mysql 如何还原数据库

本文将详细阐述如何还MysqlWorkbench上还原mysql数据库。首先,打开MysqlWorkbench点击LocalinstanceMySql57进行登录,输入root密码登录进去后,点击左边栏的administrationt选项卡在里面找到“dataimport/restore”,点击进入。这个...

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

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

mysql怎么恢复删除的数据mysql数据删除表数据如何恢复mysql数据库误删除数据恢复mysql恢复删除的数据mysql误删数据库怎么恢复mysql数据库被删了怎么恢复mysql误删数据如何恢复mysql恢复误删数据mysql如何找回删除的数据
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电饭锅的煮饭和保温灯都不亮了但还可以加热那是为什么啊《急》_百... 苹果手机为什么老是会自动截屏呢? 遂平县开开食品有限公司怎么样? 河南省开开食品有限公司怎么样 我心底的那一缕芬芳怎么写 一缕芳香作文600字 霍启刚带环保袋排队买菜,为何他们被称为“最接地气的豪门”? 移动手机卡pin码被锁了怎么办? 霍启刚现身街头买菜,他自备环保袋精挑细选老实排队没架子,你怎么看... 啊啊啊,是我眼神有问题吗 正当防卫3的血条在哪 为什么我看了半天没... 不小心删掉了mysql数据库怎么办 mysql数据库删除了怎么恢复 U盘中有部分内容不见了 mysql数据库被删除后怎么恢复 U盘内文件突然不见了,但是属性里面显示内存还占着... mysql删除被的数据库怎么还原? mysql删除数据库后怎么恢复 u盘里的文件不见了~但是还占着内存~求解决办法! 为什么U盘里的文件夹不见了 U盘中突然其中一个文件夹里的东西都不见了 U盘里隐藏的文件夹找不到了,怎么才能找回来? 我的u盘中有些文件夹找不到了,怎么查找出来 U盘里面的文件夹看不见了怎么办? U盘里面的文件夹看不见了怎么办.显示隐藏的也找不到 U盘里经常打开的文件夹不见了,怎么办? u盘中的一个文件夹里的内容不见了,怎么办? u盘里的东西突然就不见了怎么回事 u盘里部分文件夹不见了怎么办 苏州拓创网络科技有限公司怎么样? 江苏一骏诚信息技术有限公司怎么样? mysql整个数据库被删除了怎么恢复 MySQL 数据库被删了怎么办 mysql数据库删除了怎么还原数据 mysql中的mysql数据库被删除怎么恢复 mysql数据库错误删除了怎么恢复数据 Mysql Innodb数据库误删除了文件,怎么恢复? 怎么恢复mysql数据表里刚刚删除的东西 mysql数据库被删除了,怎么恢复吗 mysql中的root账户不小心删除了,怎么恢复root用户 怎样找回MYSQL数据库中删除的数据 去学生会面试自我介绍怎么说? 文字,声音,图像,动画,视频,书包,报纸,电视,这八个中都是哪个是媒体 学生会面试时该怎么介绍自己 学生会面试自我介绍怎么说好 大学参加学生会面试怎么自我介绍 学生会面试自我介绍急急急急? ps怎样把图片上的字去掉但不影响图片 美图秀秀怎么去掉图片上的字 ps怎么将图片上的文字去掉 怎么把图片上的字去掉?