SQL 必知必会
陈旸
清华大学计算机博士
73338 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?

恢复步骤
限制
参数取值
数据恢复
独立性
文件较大
大表支持
innodb_force_recovery参数
Binlog闪回工具
逻辑删除
Percona Data Recovery Tool for InnoDB
独立表空间
共享表空间
关闭innodb_force_recovery,并重启数据库
删除旧表,改名新表
备份数据表
模拟损坏.ibd文件
生成InnoDB数据表
.ibd文件损坏恢复
表空间
延迟备份策略
开启二进制日志
验证备份文件有效性
及时备份
InnoDB文件损坏与恢复实例
InnoDB存储引擎
备份策略
数据库数据恢复

该思维导图由 AI 生成,仅供参考

我们上节课讲解了 MySQL 的复制技术,通过主从同步可以实现读写分离,热备份,让服务器更加高可用。MySQL 的复制主要是通过 Binlog 来完成的,Binlog 记录了数据库更新的事件,从库 I/O 线程会向主库发送 Binlog 更新的请求,同时主库二进制转储线程会发送 Binlog 给从库作为中继日志进行保存,然后从库会通过中继日志重放,完成数据库的同步更新。这种同步操作是近乎实时的同步,然而也有人为误操作情况的发生,比如 DBA 人员为了方便直接在生产环境中对数据进行操作,或者忘记了当前是在开发环境,还是在生产环境中,就直接对数据库进行操作,这样很有可能会造成数据的丢失,情况严重时,误操作还有可能同步给从库实时更新。不过我们依然有一些策略可以防止这种误操作,比如利用延迟备份的机制。延迟备份最大的作用就是避免这种“手抖”的情况,让我们在延迟从库进行误操作前停止下来,进行数据库的恢复。
当然如果我们对数据库做过时间点备份,也可以直接恢复到该时间点。不过我们今天要讨论的是一个特殊的情况,也就是在没做数据库备份,没有开启使用 Binlog 的情况下,尽可能地找回数据。
今天的内容主要包括以下几个部分:
InnoDB 存储引擎中的表空间是怎样的?两种表空间存储方式各有哪些优缺点?
如果.ibd 文件损坏了,数据该如何找回?
如何模拟 InnoDB 文件的损坏与数据恢复?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在没有备份数据库且没有使用Binlog的情况下,如何恢复数据的技术细节。首先讲解了InnoDB存储引擎中的表空间的存储方式,包括共享表空间和独立表空间的优缺点。然后详细介绍了如何通过Percona Data Recovery Tool for InnoDB工具进行修复和通过Binlog进行闪回来找回损坏的.ibd文件数据。接着讲解了在没有备份且没有开启Binlog的情况下,如何通过数据库自身的机制进行数据恢复,包括通过设置`innodb_force_recovery`参数进行强制恢复,并给出了整体的恢复步骤。最后,通过一个实例模拟了InnoDB文件的损坏与恢复过程。文章内容详实,对于遇到类似问题的读者具有很高的参考价值。文章还提到了在日常工作中遇到误操作的情况时,可以尝试使用InnoDB的强制恢复机制,启动MySQL并将损坏的数据表转储到MyISAM数据表中,尽可能恢复已有的数据。同时,强调了及时备份和开启二进制日志的重要性,以及定时验证备份文件的有效性。整体而言,本文为读者提供了深入的数据库恢复技术细节和应对误操作的应急措施,对数据库管理人员具有实用价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • Monday
    开启innodb_force_recovery只能进行有限制的select操作,那后续的四步中,怎么还能再删除旧表? 上网查的资料都是innodb_force_recovery>0时,可以select,create,drop但是不可以insert,update,delete。。。恨windows系统下安装的mysql没找到在哪里设置innodb_force_recovery的值,所以没验证。。。

    作者回复: 可能文件隐藏了,需要先将隐藏文件设置为课件,然后在C:\ProgramData\MySQL\MySQL Server 8.0中找到my.ini,然后再添加innodb_force_recovery数值

    2019-09-16
    2
    7
  • 许童童
    磁盘也是逻辑删除,只要文件还没有被覆盖写,也是可以通过物理的方式把数据找回来的。

    作者回复: 使得 可以使用恢复工具

    2019-09-16
    6
  • 蒙开强
    老师,你好,那个存储引擎是可以针对表级设定的么

    作者回复: 对 MySQL中存储引擎是针对数据表的

    2019-09-16
    2
    4
  • 爱思考的仙人球
    原来丢失数据连接这个错误是由于数据损坏造成的

    作者回复: 数据损坏是一种可能

    2019-10-25
    3
  • Venom
    代码可不可以都放上来呀 少一句创建存储过程的语句也很麻烦的。。。

    作者回复: 有些代码放到github上了,可以看下

    2019-10-17
    1
  • Cookie123456
    创建的存储过程的完整代码为: DELIMITER $$ CREATE PROCEDURE `insert_t1`(IN i int, IN max_num int) BEGIN -- 当前数据行 DECLARE i INT DEFAULT 0; -- 最大数据行数 DECLARE max_num INT DEFAULT 100; -- 关闭自动提交 SET autocommit=0; REPEAT SET i=i+1; -- 向t1表中插入数据 INSERT INTO t1(id) VALUES(i); UNTIL i = max_num END REPEAT; -- 提交事务 COMMIT; END $$ CALL insert_t1(0,100); SELECT @i as sum;
    2020-04-08
    2
    6
  • Jone_乔泓恺
    请问什么情况会导致.ibd文件损坏呢?
    2020-04-17
    4
  • 隰有荷
    老师,我在使用ibd文件进行数据恢复时,进入了my.cnf文件, 然后设置了innodb_force_recovery = 1,再重新启动Mysql发现无法启动,然后在log里面看到下面这句话: [ERROR] /usr/sbin/mysqld: unknown variable 'innodb_force_recovery = 1 我去网上搜索这个报错,但是目前没有发现好的解决办法,请问我该怎么样继续操作呢,即使无法获取数据,能获取原来的数据表结构也是好的,希望获取您的指导。
    2019-11-15
    3
  • 完美坚持
    想请教大家,文中提到的 “然后用编辑器打开 t1.ibd”,这里的编辑器是什么编辑器啊?
    2021-06-05
    2
  • 四喜
    自己随便改了idb文件靠后面的2行,只能读取到第一条数据。
    2020-03-02
    2
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部