mysql 数据恢复

今天吐血向大家分享下mysql通过.frm和.ibd文件恢复数据的方法,因为之前电脑换系统的原因,忘记备份数据库,最后只能通过恢复工具找到数据库的.frm和.ibd文件,至于这两类文件,可以通过winhex软件查看,为了恢复数据,今天踩了不少坑,下面把我成功恢复的过程分享给大家;

整个恢复过程其实可以总结为下面几步:

(1):恢复表结构

(2):复制出来创建表的sql语句

(3):恢复表数据(在恢复表数据的时候,首先需要解除当前创建的表与默认生成的.ibd文件间的关系,接着将要恢复数据表的.ibd文件与当前创建的表联系起来即可)

恢复表结构

首先创建一个数据库,可以通过navicat来创建,创建截图为:

这里写图片描述
使用当前创建的数据库:use wangyi 随意创建一张表,但是这张表的名字要和你要恢复的.frm或者.ibd一致,在此我的.frm与.ibd文件为songlyric.frm与songlyric.ibd因此我的创建表语句为:

create table songlyric(id int); 在执行上面的创建表语句之后,使用net stop mysql关闭数据库服务,然后用需要恢复的songlyric.frm覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用net start mysql启动服务,接着使用:desc songlyric查看该表结构,会出现下面错误信息:

这里写图片描述

针对这个问题,我们可以通过查看mysql的日志文件来解决,查看mysql安装目录下的data文件夹里面.err结尾的文件,你会发现出现下面所示的错误信息:[Warning] InnoDB: Table wangyi/songlyric contains 1 user defined columns in InnoDB, but 6 columns in MySQL.原来是因为,我们要恢复的表有6个字段,而我们在创建表的时候只创建了1个字段。

解决方案:删除songlyric表重新创建一个包含6个字段的表,具体这6个字段是什么不用管的。具体执行过程为使用net stop mysql停掉服务,然后在配置文件my.ini中将innodb_force_recovery = 6注释掉(#或;均可),再net start mysql启动服务。接着在控制台先执行drop table songlyric;删除表,再执行创建表语句,我执行的是下面的创建表语句:create table songlyric(id int,id1 int,id2 int,id3 int,id4 int,id5 int);

紧接着按照前面的方式,使用net stop mysql关闭数据库服务,然后用需要恢复的songlyric.frm覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用net start mysql启动服务,接着使用:desc songlyric查看该表结构,输出下面结果表示恢复表结构成功:

这里写图片描述
复制创建songlyric表的语句,我们需要通过创建表的语句重新创建表,当然在创建表之前需要将已经创建好的songlyric删除掉,具体获取创建表的语句可以通过navicat来实现,在navicat中选中songlyric表,右键对象信息,出现下面截图信息,选中DDL,里面的内容就是我们创建songlyric表的sql语句了:
这里写图片描述

接着在控制台执行drop table songlyric;删除songlyric表,当然在执行删除songlyric命令之前,还需要将my.ini中的innodb_force_recovery = 6删除或者注释掉。接着执行下面命令重新创建表即可:

CREATE TABLE songlyric (

date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

lyricBefore text,

lyricAfter text,

isTraverse tinyint(1) DEFAULT NULL,

id int(8) NOT NULL AUTO_INCREMENT,

songUnique varchar(100) DEFAULT NULL,

PRIMARY KEY (id),

UNIQUE KEY songUnique (songUnique)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

可以看到和之前通过navicat查看得到的创建表的sql语句相比,末尾多了ROW_FORMAT=COMPACT;

恢复表数据

恢复表数据需要首先将原先的.ibd文件与原先的.frm文件解除绑定,具体就是在控制台执行下面命令:

alter table songlyric discard tablespace; 接着执行net stop mysql停掉服务,将需要恢复的songlyric.ibd文件覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.ibd,执行net start mysql开启服务。 将复制过来的songlyric.ibd文件与songlyric.frm文件发生联系。具体执行下面命令:

alter table songlyric import tablespace; 这时候通过navicat查看数据表,你会发现数据已经成功恢复啦啦啦。

### MySQL 数据恢复方法 MySQL 数据库数据恢复通常涉及多种技术手段,具体取决于数据丢失的原因。以下是对不同场景下的恢复方法进行分析: #### 1. **误删数据恢复** 当用户误删了数据库中的数据时,可以尝试使用二进制日志(Binary Log)来恢复数据。二进制日志记录了所有对数据库的更改操作,包括插入、更新和删除等。通过解析这些日志,可以找到误删数据之前的更改记录,并将其重新应用到数据库中。 - **使用二进制日志恢复数据**: 1. 确认二进制日志是否已经启用。可以通过 `SHOW VARIABLES LIKE 'log_bin';` 命令检查。 2. 查看当前的二进制日志文件列表:`SHOW BINARY LOGS;` 3. 使用 `mysqlbinlog` 工具解析二进制日志文件,找到误删数据前的操作记录。 4. 将解析后的 SQL 语句重新应用到数据库中,以恢复数据。 - **使用文件恢复工具**: 如果没有启用二进制日志或者数据文件已经被物理删除,可以尝试使用文件恢复工具(如 `anedata` 全能文件恢复工具)来恢复误删的文件。这类工具可以在硬盘、U盘、移动硬盘等存储设备上检测并恢复误删的文件 [^1]。 #### 2. **MySQL 崩溃恢复** 在 MySQL 崩溃的情况下,InnoDB 存储引擎可以通过重做日志(Redo Log)来恢复数据。Redo Log 是 InnoDB 用来保证事务持久性和崩溃恢复的重要机制。 - **Redo Log 的刷新时机**: - 事务提交时:当事务提交时,Log Buffer 中的 Redo Log 会被刷新到磁盘(可以通过 `innodb_flush_log_at_trx_commit` 参数控制)。 - Log Buffer 空间不足时:当 Log Buffer 中缓存的 Redo Log 占满了 Log Buffer 总容量的大约一半左右时,会触发日志的刷新。 - Checkpoint(检查点):InnoDB 定期执行检查点操作,将内存中的脏数据刷新到磁盘,并将相应的 Redo Log 一同刷新。 - 后台刷新线程:InnoDB 启动了一个后台线程,负责周期性地将脏页刷新到磁盘,并将相关的 Redo Log 一同刷新。 - 正常关闭服务器:MySQL 关闭时,Redo Log 会刷入磁盘 [^3]。 - **崩溃恢复过程**: 1. 在 MySQL 重启时,InnoDB 会自动进行崩溃恢复。 2. InnoDB 会读取 Redo Log 文件,回放所有未提交的事务,并将已提交的事务应用到数据文件中。 3. 通过 Redo Log 和 Undo Log 的协同工作,确保数据库的一致性和完整性。 #### 3. **没有备份的恢复方法** 在没有备份的情况下,恢复数据的可能性较低,但仍有一些方法可以尝试: - **使用二进制日志**: 如果启用了二进制日志,并且日志文件尚未被覆盖,可以通过解析二进制日志来恢复数据 [^4]。 - **使用文件恢复工具**: 如果数据文件被物理删除,可以尝试使用文件恢复工具来恢复误删的文件 [^1]。 - **使用第三方数据恢复服务**: 如果上述方法都无法恢复数据,可以考虑联系专业的数据恢复公司或服务提供商,他们可能拥有更高级的工具和技术来恢复数据。 ### 示例代码 以下是一个使用 `mysqlbinlog` 工具解析二进制日志并恢复数据的示例: ```bash # 解析二进制日志文件 mysqlbinlog --start-datetime="2023-01-01 00:00:00" --stop-datetime="2023-01-02 00:00:00" /var/lib/mysql/mysql-bin.000001 > recovery.sql # 应用解析后的 SQL 语句到数据库 mysql -u root -p < recovery.sql ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值