数据库中的数据误删,又没有进行备份,怎样恢

作者&投稿:只标 (若有异议请与网页底部的电邮联系)
mysql数据没有备份误删了怎么恢复~

打开mysql的bin log功能:
对于mysql也是支持增量备份,但要打开mysql的bin log功能。
我们修改mysql的配置文件。linux是/etc/my.cnf,windows是mysql的安装目录/my.ini
我们在[mysqld]下面加上log-bin一行代码,如下面。

[mysqld]

log-bin=mysql-bin

复制代码
加完后重起mysql即可。

某客户更新数据的时候,误删了数据库的内容,因为数据库做了主从,但是没有做备份(备份很重要啊!)幸好开启了bin-log,之后只好把整个日志的记录拿回来本地进行恢复。

之后自己也做了一个简单的测试,对数据进行恢复,具体如下:
1、新建一个表
CREATE TABLE `lynn`.`sn_test` ( `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `age` INT( 3 ) NOT NULL ) ENGINE = MYISAM;
2、插入多条数据
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn1', '1');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn2', '2');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn3', '3');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn4', '4');
3、查看数据并删除
mysql> select * from sn_test;
+-------+-----+
| name | age |
+---------+---+
| lynn1 | 1 |
| lynn2 | 2 |
| lynn3 | 3 |
| lynn4 | 4 |
+---------+-----+
4 rows in set (0.00 sec)
mysql> delete from sn_test;
Query OK, 4 rows affected (0.00 sec)
mysql> select * from sn_test;
Empty set (0.00 sec)
4、mysqlbinlog恢复数据
mysqlbinlog mysql-bin.000006 > 1.sql
查看1.txt里面数据插入的纪录,把删除之前的数据进行恢复
mysqlbinlog mysql-bin.000006 --start-position=2471 --stop-position=2876 | mysql -uroot -p123
重新登录,查看数据,OK,已经成功恢复了
对于数据库操作,应该注意如下问题:
1、要常备份(全备,增量备份),出了问题可以最快恢复数据;
2、操作数据库前,要把需要操作的数据库或者表dump出来;
3、需要把bin-log打开,就算没有做上面的两步,也可以通过日志恢复数据

你可以试试使用互盾数据恢复软件,它是非常强大的硬盘数据恢复软件,能够帮你恢复丢失的数据,不会向你的硬件写入任何数据,它能恢复硬盘,内存卡,U盘,移动硬盘里的数据,还可完美恢复删除,格式化,提示未格式化,丢失分区,磁盘大小为0等各类情况造成的数据丢失。

打开mysql的bin log功能:
对于mysql也是支持增量备份,但要打开mysql的bin log功能。
我们修改mysql的配置文件。linux是/etc/my.cnf,windows是mysql的安装目录/my.ini
我们在[mysqld]下面加上log-bin一行代码,如下面。

[mysqld]

log-bin=mysql-bin

复制代码
加完后重起mysql即可。

某客户更新数据的时候,误删了数据库的内容,因为数据库做了主从,但是没有做备份(备份很重要啊!)幸好开启了bin-log,之后只好把整个日志的记录拿回来本地进行恢复。

之后自己也做了一个简单的测试,对数据进行恢复,具体如下:
1、新建一个表
CREATE TABLE `lynn`.`sn_test` ( `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `age` INT( 3 ) NOT NULL ) ENGINE = MYISAM;
2、插入多条数据
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn1', '1');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn2', '2');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn3', '3');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn4', '4');
3、查看数据并删除
mysql> select * from sn_test;
+-------+-----+
| name | age |
+---------+---+
| lynn1 | 1 |
| lynn2 | 2 |
| lynn3 | 3 |
| lynn4 | 4 |
+---------+-----+
4 rows in set (0.00 sec)
mysql> delete from sn_test;
Query OK, 4 rows affected (0.00 sec)
mysql> select * from sn_test;
Empty set (0.00 sec)
4、mysqlbinlog恢复数据
mysqlbinlog mysql-bin.000006 > 1.sql
查看1.txt里面数据插入的纪录,把删除之前的数据进行恢复
mysqlbinlog mysql-bin.000006 --start-position=2471 --stop-position=2876 | mysql -uroot -p123
重新登录,查看数据,OK,已经成功恢复了
对于数据库操作,应该注意如下问题:
1、要常备份(全备,增量备份),出了问题可以最快恢复数据;
2、操作数据库前,要把需要操作的数据库或者表dump出来;
3、需要把bin-log打开,就算没有做上面的两步,也可以通过日志恢复数据

每个 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 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



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

场景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.sql > dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sql > dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql > dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page -t dictionary/SYS_FIELDS.sql > dumps/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/actor000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  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 158000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx_actor_last_name"        1       0       0       4294967295000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx_actor_last_name"        1       0       0       4294967295


  • 3. 知道了主键 id,就可以从对应 page 中提取表数据,并生成 sql 文件。

  • ./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t sakila/actor.sql > dumps/default/actor 2> dumps/default/actor_load.sql


  • 4. 最后导入恢复的数据

  • cat dumps/default/*.sql | mysql sakila

  • 更多详细情况点击网页链接

  • 请点击输入图片描述




我的Mybase Desktop 数据库文件*.nyf很大 285MB
如果您想清空回收站、使nyf文件变小,那么您可以使用【文件 - 维护 - 清空回收站、优化数据库】工具。2、在RTF文档里插入的图片将被转换成文本格式,这样会使文本的大小急剧增大。所以对于大的图片,建议您不要直接插入到RTF,而是使用附件和快捷方式。

熟悉常见的计算机硬件和软件故障及解决方法。
如果丢失的链接库文件是比较重要的核心链接文件的话,那么系统就会频繁死机,甚至导致整个系统崩溃,所以我们最好不要用那些名不见经传的软件,以免造成此类“事故”,当然,如果一但出现了些类情况,您只要用“系统文件检查器”进行一下检查并还原那些被误删除的文件通常就可将问题解决了,但如果仍然不行您就要重新覆盖安装...

时序数据库是什么?
时序数据库(TSDB) 是一种数据库管理系统,用于存储、处理和分析时间序列数据(以下简称时序数据)。时序数据是按时间维度顺序记录且索引的数据。像智慧城市、物联网、车联网、工业互联网等领域各种类型的设备和传感器都会产生海量的时序数据,证券市场的行情数据也是时序数据,这些数据将占世界数据总量的 90%...

腾讯视频用户数据为什么那么大
腾讯视频用户数据那么大主要原因如下:1、视频内容的丰富性:腾讯视频拥有庞大的视频库,涵盖了电影、电视剧、综艺节目、纪录片、动漫等各种类型的内容。用户可以根据自己的兴趣和喜好,随时随地观看自己喜欢的内容,这使得用户在腾讯视频上花费的时间更长,从而产生了大量的用户数据。2、高清画质的需求:随着...

有人晓得进中国互动玩帝国爱随机出现切换输入法卡死和内存报错是那样回...
★ 系统文件的误删除:由于Windows 9X启动需要有Command.com、Io.sys、Msdos.sys等文件,如果这些文件遭到破坏或被误删除,即使在CMOS中各种硬件设置正确无误也无济于事。此时需用系统盘重新启动系统后,重新传送系统文件。★ 初始化文件遭破坏:由于Windows 9X启动需要读取System.ini、Win.ini和注册表文件...

...模拟添加一条数据,会真的在数据库里多一条记录吗?
现在,不妨设想一下,你正在编写一个数剧库驱动的Web应用程序-例如一个在线商店。在进行任何其他部分的编码之前,你想首先完成这个电子商店软件的业务逻辑部分的设计。特别是,在编写完你的业务逻辑组件之前,你根本不想投入任何精力去编写数据访问有关的组件。上面这种情形下特别适合于使用一种模拟对象框架...

为什么在网上在线点播视频,然后关闭点播的那个页面电脑就会死机?_百度...
启动的程序太多就会使系统资源消耗殆尽,而使个别程序需要的数据在内存或虚拟内存中找不到,就会出现异常错误,造成死机。因此,建议启动程序要少一点。 14、非法操作 用非法格式或参数非法打开或释放有关程序,也会导致电脑死机。请注意,要牢记正确格式和相关参数,不要随意打开和释放不熟悉的程序。 15、非正常关闭计算机...

为什么当磁盘IO成瓶颈之后数据库的性能急剧下降
当时的Avg.Disk Read Queue Length在2左右(后来分析,对于图片站点这样的直接读文件进行响应的应用,Disk Read Queue Length达到这个值会明显影响响应速度);第三次故障发生在跑数据库服务的云服务器上,当时的Avg. Disk Write Queue Length达到4~5,造成很多的数据库写入操作超时。

军团再临魔兽数据库
下载地址:http:\/\/www.xyx09.com\/259418\/ 类型:安卓游戏-卡牌策略 版本:v1.2.81 大小:222.05M 语言:中文 平台:安卓APK 推荐星级(评分):★★★ 游戏标签: 魔兽再临 魔兽 卡牌手游 腾讯魔兽再临是一款卡牌类手机游戏,游戏的风格是Q版的,带点欧美风格,玩家可以收集知名英雄...

论坛使用ACCESS作为数据库,在什么时候会崩溃?
否则可能会长时间的占用过多的资源 7、隔一段时间压缩修复一次数据库,注意在压缩修复前备份好数据库,如果发现你的BBS突然出奇的慢,而服务器完全正常,也该是压缩修复的时候了 8、ACCESS版本不能支持很大的数据量,当您的帖子在3万左右时,建议使用动网论坛自带的分表储存功能。

景泰县17874474360: 数据库没有备份 然后其中的一个表中的数据被删了怎么办 -
爱新觉罗矩施维: 数据库删除操作是永久性操作,如果没有备份,就没有办法了.而且由于数据库中的系统信息和硬盘上的数据文件都没了,所以简单的硬盘数据恢复也不会找回来的.

景泰县17874474360: 误删除了delete oracle中数据表记录,没备份要怎么恢复 -
爱新觉罗矩施维: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接找回删除的数据 具体步骤为: *确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间...

景泰县17874474360: 在SQL Server数据库中误将表中数据删除,之前没做任何备份,可以恢复吗?怎么恢复?
爱新觉罗矩施维: 有个土办法可以,首先找到SQL的日志,里面有删除的语句,批量把删除语句中的delete改成Insert,然后执行一遍,就可以把数据恢复了.

景泰县17874474360: mysql删除数据库没有备份怎么恢复 -
爱新觉罗矩施维: 打开mysql的bin log功能: 对于mysql也是支持增量备份,但要打开mysql的bin log功能. 我们修改mysql的配置文件.linux是/etc/my.cnf,windows是mysql的安装目录/my.ini 我们在[mysqld]下面加上log-bin一行代码,如下面.[mysqld]log-bin=...

景泰县17874474360: 使用oracle,如果数据库系统不小心丢失了没有备份的数据文件,该如何恢复数据库的正常状 -
爱新觉罗矩施维: 如果你是不小心删除了,立刻关闭所有的应用.然后用专门的硬盘恢复工具来恢复数据文件,比如windows的esay recovery.如果你有很早之前的备份和所有的archivelog,那么可以直接恢复.如果没有很早之前的备份,但有全部的archivelog,可以用logmnr包来看到做过什么操作,可能会很多,做起来麻烦,但也是种办法.如果都不行,请哭吧.

景泰县17874474360: 不小心把一个数据库给删了,但是之前没有做备份,不知道有没有恢复的办法呢?急!!!!!谢谢!!!!!
爱新觉罗矩施维: EasyRecovery(可用行100%) EasyRecovery Pro v6.04 汉化版 地址:(里面有汉化补丁) http://www.crsky.com/soft/899.html 一款威力非常强大的硬盘数据恢复工具.能够帮你恢复丢失的数据以及重建文件系统.EasyRecovery 不会向你的原始...

景泰县17874474360: 怎样恢复oracle中的数据,事先没有备份 -
爱新觉罗矩施维: 如果数据文件已经损坏,又没有备份,这是无法恢复的 如果数据文件没有损坏,只是丢失了一部分数据,如误删除.可以考虑使用不完全日志恢复或者基于时间点的闪回.但是闪回功能需要启用才可以使用,不知道你有没有启用.

景泰县17874474360: sqlserver数据库表数据误删除了 怎么恢复 -
爱新觉罗矩施维: 恢复sqlserver数据库表数据步骤如下: 一、心态: 1、务必冷静,事情已经发生不可慌乱. 2、立即查看当前时间,最好能够精确到秒,并做记录. 3、应立即向直接上级反映此事,不可隐瞒,防止事态扩大. 4、如果权限允许,应当立即停止...

景泰县17874474360: db2 误删除三个表中的数据,没有备份文件,只有归档日志,如何恢复? -
爱新觉罗矩施维: 先将数据库置于前滚状态,然后再前滚到你删除表之前的时间点.

景泰县17874474360: sql server数据库数据未备份,不小心删除了,还能恢复吗?求大神帮帮忙 -
爱新觉罗矩施维: 找数据恢复机构抢救,不要关机

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网