追着幸福跑|数据库没有备份,没有使用Binlog的情况下,如何恢复数据?( 二 )


如果已经开启了 Binlog , 就可以使用闪回工具 , 比如 mysqlbinlog 或者 binlog2sql , 从工具名称中也能看出来它们都是基于 Binlog 来做的闪回 。 原理就是因为 Binlog 文件本身保存了数据库更新的事件(Event) , 通过这些事件可以帮我们重现数据库的所有更新变化 , 也就是 Binlog 回滚
追着幸福跑|数据库没有备份,没有使用Binlog的情况下,如何恢复数据?innodb_force_recovery参数一共有 7 种状态 , 除了默认的 0 以外 , 还可以为 1-6 的取值 , 分别代表不同的强制恢复措施 。
当我们需要强制恢复的时候 , 可以将innodb_force_recovery设置为 1 , 表示即使发现了损坏页也可以继续让服务运行 , 这样我们就可以读取数据表 , 并且对当前损坏的数据表进行分析和备份 。
通常innodb_force_recovery参数设置为 1 , 只要能正常读取数据表即可 。 但如果参数设置为 1 之后还无法读取数据表 , 我们可以将参数逐一增加 , 比如 2、3 等 。 一般来说不需要将参数设置到 4 或以上 , 因为这有可能对数据文件造成永久破坏 。 另外当innodb_force_recovery设置为大于 0 时 , 相当于对 InnoDB 进行了写保护 , 只能进行 SELECT 读取操作 , 还是有限制的读取 , 对于 WHERE 条件以及 ORDER BY 都无法进行操作 。
当我们开启了强制恢复之后 , 数据库的功能会受到很多限制 , 我们需要尽快把有问题的数据表备份出来 , 完成数据恢复操作 。 整体的恢复步骤可以按照下面的思路进行:

  1. 使用innodb_force_recovery启动服务器将innodb_force_recovery参数设置为 1 , 启动数据库 。 如果数据表不能正常读取 , 需要调大参数直到能读取数据为止 。 通常设置为 1 即可 。
  2. 备份数据表在备份数据之前 , 需要准备一个新的数据表 , 这里需要使用 MyISAM 存储引擎 。 原因很简单 , InnoDB 存储引擎已经写保护了 , 无法将数据备份出来 。 然后将损坏的 InnoDB 数据表备份到新的 MyISAM 数据表中 。
  3. 删除旧表 , 改名新表数据备份完成之后 , 我们可以删除掉原有损坏的 InnoDB 数据表 , 然后将新表进行改名 。
  4. 关闭innodb_force_recovery , 并重启数据库innodb_force_recovery大于 1 的时候会有很多限制 , 我们需要将该功能关闭 , 然后重启数据库 , 并且将数据表的 MyISAM 存储引擎更新为 InnoDB 存储引擎 。
【公众号:码农架构】
分享、点赞、在看 , 给个三连击呗!


推荐阅读