数据恢复:如何从数据库中恢复丢失的数据? (数据库中数据恢复)
在当今数字化时代,数据是企业运营中最为重要的资产之一。对于任何一位企业家来说,保护数据的完整性和可靠性是非常重要的。但是,即使采取了预防措施,意外事件仍然可能导致数据丢失。在这种情况下,数据恢复技术就非常必要了。本文将介绍如何从数据库中恢复丢失的数据。
一、数据库备份
在解决数据丢失问题时,再次强调预防措施的重要性是必不可少的。数据库备份是最常用的预防措施之一。备份数据库时,需要注意以下几点:
1.备份时,需要定期进行,具体间隔时间根据企业需求进行设置。
2.不要在主服务器上进行备份操作,这里的主服务器是指所有数据库基础设施的核心设备。相反,更好在另一台计算机或离线存储设备上进行备份操作。
3.如果有多个数据库,需要分别备份,并对其进行标记,以便在需要时容易找到。
备份对于防止数据丢失意外事件起到了关键作用。如果一旦数据丢失,并且数据库没有被备份,那么恢复数据将变得十分困难。
二、数据恢复流程
如果数据丢失,怎样从数据库中恢复数据呢?下面是数据恢复流程的基本步骤:
1.停止所有应用程序和服务。这是为了确保有任何正在运行的进程不会在过程中引起进一步数据丢失。
2.确定数据丢失的来源。这可能是由病毒、硬件故障或人为错误引起。
3.从备份中恢复数据。如果已经备份过数据,可以从备份中恢复数据。这个过程非常简单,只需要选择相应的数据库备份文件,然后将它们还原到恢复前的状态即可。
4.使用数据库工具进行恢复。有一些数据库工具,例如sys.tools或sys.recover,可以直接从数据库本身中恢复数据。这种方法是稍微麻烦一些的,因为需要运行特定的SQL命令。但是,如果您没有任何有效的备份文件,这是恢复数据的最后一条路。
5.使用数据恢复服务。如果前四个步骤都没能解决问题,那么与专业的数据恢复服务公司联系可能是您的最终选择。虽然这种方法通常比前四个步骤消耗更多的金钱和时间,但它是最可靠的方法之一,因为专业的数据恢复公司拥有高超的技术和设备,并能够从最复杂的数据系统中进行恢复。
保护数据的完整性和可靠性是值得花费时间和金钱的一项任务。但无论做得再好,意外事件总是有可能发生。因此,在发生数据丢失时,需要对数据恢复流程了解清楚,才能尽快恢复丢失的数据,并防止数据的进一步损失。
相关问题拓展阅读:
数据库恢复的主要依据
事务日记是数据库恢复的主要依据。
数据库恢复的主要依据是事务日志。
望采纳!
重建数据库时压测环境没有备份,但是另一套测试环境碰扮的表结构与压测环境一致,只是数据有所差异,所以,获取表结构比较容易。导入表结构没有什么好说明的地方,注意导入 SQL 的权限和字符集。 重建表空间注:此小节对应恢复步骤的 。由于是整库恢复,数据库和表较多,所以使用脚本处理。大概的处理流程是,两层循环,外层循环数据库列表,内层循环对山卖应数据库表列表。然后依次 DISCARD TABLESPACE、拷贝对应库对应表的 ibd 文件到对应目录并更改权限、IMPORT TABLESPACE。之前分析过,由于新旧的 ibd 文件表空间 id 不一致,导致不能正确导入。在 MySQL 错误日志中记录了表名、新旧表空间 id,接下来我们看看怎么分解。 分析 MySQL 错误日志注:此小节对应恢复步骤的和 。这一步很有意思。所有的数据库表累计,不可能使用人工处理,我们得想点取巧的办法。我们发现 MySQL 错误日志记录的表名、新旧表空间 id 很有规律,我们只需要依逗吵逗次取出这些值,问题就解决一大半了。
比喻说话或写文章直截了当,一开头就进入本题。
数据库中的数据误删,又没有进行备份,怎样恢
打开mysql的bin log功能:
对于mysql也是支持增量备份,但要打开mysql的bin log功能。
我们修改mysql的
配置文件
。linux是/etc/my.cnf,windows是mysql的安装目录/my.ini
我们在下面加上log-bin一行代码,如下面。
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.> 1.sql
查看1.txt里面数据插入的纪录,把删除之前的数据进行恢复
mysqlbinlog mysql-bin.start-position=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 yum install -y gcc flex bison# make# make sys_parser
# ./sys_parser 读取表结构信息
sys_parser databases/table
stream_parser 读取 InnoDB page 从 ibdata1 或 ibd 或分区表
# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f Where: -hPrint this help -V or -g – Print debug information -s size – Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M -Tretrieves 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 -f -t table.sql Where -f — InnoDB page or directory with pages(all pages should have same index_id) -t — CREATE statement of a table -o — Save dump in this file. Otherwise print to stdout -l — 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)innodb_datafile is in REDUNDANT formatinnodb_datafile is in COMPACT formatinnodb_datafile is in MySQL 5.6 format -T — retrieves only pages with index id = NM (N – high word, M – low word of id) -b — Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/ -i — Read external pages at their offsets from . -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` allint(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/01.page -t dictionary/SYS_TABLES.sql > dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/02.page -t dictionary/SYS_COLUMNS.sql > dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql > dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/04.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/.frm,连接 mysql 会显示字符集信息。
innodb_file_per_table=OFF
因为是共享表空间模式,数据页都存储在 ibdata1,可以从 ibdata1 文件中提取数据。
1. 获取表的 table id,sys_table 存有表的 table id,sys_table 表 index id 是1,所以从01.page 获取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/01.page -t dictionary/SYS_TABLES.sql | grep sakila/actorB28 2AD4D SYS_TABLES “sakila/actor” 0 “”B28 2AD4D SYS_TABLES “sakila/actor” 0 “” 0
2. 利用 table id 获取表的主键 id,sys_indexes 存有表索引信息,innodb 索引组织表,找到主键 id 即找到数据,sys_indexes 的 index id 是3,所以从03.page 获取主键 id
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql | grepBABCA SYS_INDEXES”PRIMARY”BAC3C SYS_INDEXES”idx_actor_last_name”BABCA SYS_INDEXES”PRIMARY”BAC3C SYS_INDEXES”idx_actor_last_name”
3. 知道了主键 id,就可以从对应 page 中提取表数据,并生成 sql 文件。
./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/76.page -t sakila/actor.sql > dumps/default/actor 2> dumps/default/actor_load.sql
4. 最后导入恢复的数据
cat dumps/default/*.sql | mysql sakila
更多详细情况点击
网页链接
关于数据库中数据恢复的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。