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

116 阅读3分钟

InnoDB 存储引擎的表空间

InnoDB 存储引擎的文件格式是.ibd 文件,数据会按照表空间(tablespace)进行存储,分为共享表空间和独立表空间。

查看表空间存储方式:

show variables like 'innodb_file_per_table';

共享表空间

采用共享表空间的模式,InnoDB 存储的表数据都会放到共享表空间中,也就是多个数据表共用一个表空间,同时表空间也会自动分成多个文件存放到磁盘上。

  • 优势 :单个数据表的大小可以突破文件系统大小的限制,最大可以达到 64TB,也就是 InnoDB 存储引擎表空间的上限。
  • 不足: 也很明显,多个数据表存放到一起,结构不清晰,不利于数据的找回,同时将所有数据和索引都存放到一个文件中,也会使得共享表空间的文件很大。

独立表空间

采用独立表空间的方式可以让每个数据表都有自己的物理文件,也就是 table_name.ibd 的文件,在这个文件中保存了数据表中的数据、索引、表的内部数据字典等信息。

  • 优势:每张表都相互独立,不会影响到其他数据表,存储结构清晰,利于数据恢复,同时数据表还可以在不同的数据库之间进行迁移。
  • 不足:表空间大小有限

如果.ibd 文件损坏了,数据如何找回

强恢复开关:

show variables like 'innodb_force_recovery';

默认0,不开启强制恢复。

当我们开启了强制恢复之后,数据库的功能会受到很多限制,我们需要尽快把有问题的数据表备份出来,完成数据恢复操作。整体的恢复步骤可以按照下面的思路进行:

  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 存储引擎。

没法100%找回,被损坏的数据页里的数据无法恢复。


此文章为4月Day28学习笔记,内容来源于极客时间《SQL必知必会》