Skip to main content

备份与恢复

备份与恢复

  • 逻辑备份(记住用户做了哪些操作,sql语句全部记录下来)、物理备份(把数据文件全部拷贝)
  • 全量备份、增量备份(所有数据全部备份还是记录从上一个时刻到现在增量到付)

二、物理、逻辑备份[](https://web-arch.ayaka.space/docs/review/数据库部分/第17章 MySQL备份和恢复#二物理逻辑备份)

  • 逻辑备份:先要备份表的结构,然后记录所有的SQL语句的操作,比如所有的增删改查的操作。当一个表崩溃的时候,在另外一个表里面按照顺序执行一遍这些操作,就可以实现备份的恢复。
  • 物理备份:拷贝整个表格,索引文件、数据文件、元数据文件,当出现故障的时候,把所有的文件拷贝回去就好了。

逻辑备份优点(便携性(迁移难度), 灵活性(数据粒度), 可读性:

  • 因为备份的是SQL语句,所以换一个机器也能执行,换一个数据库系统也能执行。比如从Mysql导出的SQL脚本备份,换到MongoDB也一般可以执行,兼容性好。

缺点:速度慢, 一致性差, 占用空间大

  • 空间占用比较大,SQL的脚本文件因为包含了SQL的关键字,所以比只存储数据的表格文件是要大的,牺牲了一部分的空间,在数据量比较大的时候,导出的SQL备份脚本文件会比较浪费空间。
  • SQL文件如果泄露了的话,数据库就泄露了,安全性差

物理备份优点:速度, 简单性, 占用空间小, 配置和日志也被一同备份

  • 适合大的数据库
  • 恢复速度快,出现问题的时候直接把文件拷贝回去就好了,方便快捷恢复便利。
  • 相对来说安全一些

物理备份的缺点: 依赖性, 兼容性

  • 比如从Mysql备份的内容就只能用于Mysql,不能像逻辑备份一样导入到别的类型的数据库。兼容性差

[在线备份和离线备份](https://web-arch.ayaka.space/docs/review/数据库部分/第17章 MySQL备份和恢复#三在线备份和离线备份)

  • 在线备份是系统在运行的时候备份,缺点管理很复杂,涉及到加锁,优点是用户还可以使用
  • 离线备份是数据库暂停服务,然后专门备份。缺点是用户不能使用了。

[快照](https://web-arch.ayaka.space/docs/review/数据库部分/第17章 MySQL备份和恢复#四快照)

  • 增量式备份的一种,一些文件系统实现允许拍摄“快照”。它们在给定时间点提供文件系统的逻辑拷贝,而不需要整个文件系统的物理拷贝。(例如,实现可以使用copy-on-write技术,以便只复制快照时间后修改的文件系统的部分。)

  • MySQL本身不提供获取文件系统快照的功能。它可以通过Veritas、LVM或ZFS等第三方解决方案获得。

  • 实际上,由于copy-on-write技术(在备份过程中只复制被修改的页,从而大大提高了备份效率),假如在某个时间我们做了一个全量备份,那么之后由于数据库的增删改,然后出现了文件数据的变化,文件相对于旧有的文件会有一部分变化,这部分变化就叫做快照!所以快照是增量式备份。

  • 优点:

    1. 速度快:由于使用了写时复制技术,备份过程中只复制被修改的页,因此备份速度较快。
    2. 对生产环境影响小:由于是文件系统级别的备份,不会对正在运行的数据库产生影响。
    3. 恢复速度快:由于备份是基于文件系统的,恢复速度也较快。

    缺点:

    1. 依赖文件系统:快照备份依赖于特定的文件系统(如ZFS、NFS等),不是所有环境都适用。
    2. 数据一致性:在备份过程中,如果数据库有写操作,可能会导致数据不一致的情况。
    3. 存储空间需求:由于使用了写时复制技术,需要额外的存储空间来保存备份数据。

[恢复方法](https://web-arch.ayaka.space/docs/review/数据库部分/第17章 MySQL备份和恢复#五恢复方法)

假设我们的备份策略是每个周日下午一点进行一次全量备份,也就是把数据库里面的所有数据全备份一次。那么,在两次全量备份之间的时间节点上,数据库每次执行写入操作的时候,都会对bin-log文件进行操作,写入增量备份。也就是记录用户对数据库的所有的操作变更。现在加入在周三的中午,数据库主机突然崩了,那么我们首先要恢复到最近一次做的全量备份:好了,现在就已经恢复到最近一次全量备份的状态里,然后要从上次全量备份到崩溃期间的binlog文件全部读取出来,然后恢复。如果每次磁盘坏死或者磁盘错误,基本上就能恢复到原来的状态。但是如果有一个binlog文件崩溃了或者寄了,那就可能恢复不到周三崩溃的时候的状态了,可能只能恢复到周二的下午或者某个稍微更早的时间点。

验证是否成功导入:

验证时先验证表的元信息SHOW TABLES,再验证约束SHOW INDEX,再对数据进行验证,例如COUNT, 抽查,使用默克尔树进行hash一致性校验等等