MST

星途 面试题库

面试题:PostgreSQL使用LVM快照热备份中的一致性保障

在利用LVM快照对PostgreSQL进行热备份时,如何确保备份数据的一致性?谈谈你对WAL归档与LVM快照协同保障数据一致性的理解。
21.7万 热度难度
数据库PostgreSQL

知识考点

AI 面试

面试题答案

一键面试

确保备份数据一致性的方法

  1. 设置检查点
    • 在开始LVM快照前,手动在PostgreSQL中执行一个检查点操作。可以使用SQL命令 CHECKPOINT;。这个操作会强制PostgreSQL将所有脏数据页从共享缓冲区刷新到磁盘上的数据文件中。这样在进行快照时,数据文件处于一个相对一致的状态,后续恢复时能基于这个检查点进行恢复。
  2. 冻结事务
    • 可以使用 pg_start_backup('label', true) 函数(在PostgreSQL 9.6及之前版本)或 pg_start_backup('label') 函数(在PostgreSQL 10及之后版本)。这个函数会开始一个热备份模式,它会停止所有非关键的后台活动,如VACUUM等,并标记一个日志位置。这样在快照期间,数据库的写入操作会记录到WAL日志中,而不会直接修改数据文件,保证数据文件在快照期间的一致性。
  3. 快速创建LVM快照
    • 在执行上述操作后,尽快在LVM层面创建快照。因为在冻结事务和设置检查点后,数据库虽然大部分活动受限,但仍可能有少量写入。快速创建快照能减少不一致的风险。例如,使用 lvcreate -s -n <snapshot_name> -L <snapshot_size> <original_lv> 命令创建LVM快照,其中 <snapshot_name> 是快照名称,<snapshot_size> 是快照大小,<original_lv> 是原始逻辑卷。
  4. 结束备份
    • 在LVM快照创建完成后,使用 pg_stop_backup() 函数结束备份模式。PostgreSQL会将自开始备份以来的所有WAL日志进行归档(如果开启了WAL归档),并恢复正常的操作。

WAL归档与LVM快照协同保障数据一致性的理解

  1. WAL日志记录变更
    • WAL(Write - Ahead Log)是PostgreSQL的预写式日志机制。在正常操作时,数据库的所有修改操作(如插入、更新、删除等)都会先记录到WAL日志中,然后才会应用到实际的数据文件。在开始LVM快照备份前,通过 pg_start_backup 等操作标记一个WAL日志位置。在快照期间,数据库的写入操作会继续记录到WAL日志中,而不会立即修改数据文件。这样在恢复时,可以通过重放这些WAL日志来将数据库恢复到备份结束时的状态。
  2. LVM快照保存数据文件状态
    • LVM快照捕获的是数据文件在某一时刻的状态。虽然在快照期间数据库可能有写入操作,但由于WAL机制,数据文件本身不会被直接修改(除了检查点操作时的刷新)。结合WAL日志,在恢复时,先将数据文件恢复到LVM快照时的状态,然后重放从备份开始到备份结束期间生成的WAL日志,就能将数据库恢复到备份结束时的一致性状态。
  3. 协同工作实现完整恢复
    • WAL归档和LVM快照协同工作,确保了在热备份场景下数据的一致性和可恢复性。WAL归档记录了数据库在备份期间的所有变更,LVM快照提供了一个数据文件的基准状态。通过结合这两者,在恢复时可以从LVM快照恢复数据文件,然后重放WAL日志,从而完整地恢复数据库到备份结束时的状态,保障数据的一致性。