面试题答案
一键面试确保备份数据一致性的方法
- 设置检查点
- 在开始LVM快照前,手动在PostgreSQL中执行一个检查点操作。可以使用SQL命令
CHECKPOINT;
。这个操作会强制PostgreSQL将所有脏数据页从共享缓冲区刷新到磁盘上的数据文件中。这样在进行快照时,数据文件处于一个相对一致的状态,后续恢复时能基于这个检查点进行恢复。
- 在开始LVM快照前,手动在PostgreSQL中执行一个检查点操作。可以使用SQL命令
- 冻结事务
- 可以使用
pg_start_backup('label', true)
函数(在PostgreSQL 9.6及之前版本)或pg_start_backup('label')
函数(在PostgreSQL 10及之后版本)。这个函数会开始一个热备份模式,它会停止所有非关键的后台活动,如VACUUM等,并标记一个日志位置。这样在快照期间,数据库的写入操作会记录到WAL日志中,而不会直接修改数据文件,保证数据文件在快照期间的一致性。
- 可以使用
- 快速创建LVM快照
- 在执行上述操作后,尽快在LVM层面创建快照。因为在冻结事务和设置检查点后,数据库虽然大部分活动受限,但仍可能有少量写入。快速创建快照能减少不一致的风险。例如,使用
lvcreate -s -n <snapshot_name> -L <snapshot_size> <original_lv>
命令创建LVM快照,其中<snapshot_name>
是快照名称,<snapshot_size>
是快照大小,<original_lv>
是原始逻辑卷。
- 在执行上述操作后,尽快在LVM层面创建快照。因为在冻结事务和设置检查点后,数据库虽然大部分活动受限,但仍可能有少量写入。快速创建快照能减少不一致的风险。例如,使用
- 结束备份
- 在LVM快照创建完成后,使用
pg_stop_backup()
函数结束备份模式。PostgreSQL会将自开始备份以来的所有WAL日志进行归档(如果开启了WAL归档),并恢复正常的操作。
- 在LVM快照创建完成后,使用
WAL归档与LVM快照协同保障数据一致性的理解
- WAL日志记录变更
- WAL(Write - Ahead Log)是PostgreSQL的预写式日志机制。在正常操作时,数据库的所有修改操作(如插入、更新、删除等)都会先记录到WAL日志中,然后才会应用到实际的数据文件。在开始LVM快照备份前,通过
pg_start_backup
等操作标记一个WAL日志位置。在快照期间,数据库的写入操作会继续记录到WAL日志中,而不会立即修改数据文件。这样在恢复时,可以通过重放这些WAL日志来将数据库恢复到备份结束时的状态。
- WAL(Write - Ahead Log)是PostgreSQL的预写式日志机制。在正常操作时,数据库的所有修改操作(如插入、更新、删除等)都会先记录到WAL日志中,然后才会应用到实际的数据文件。在开始LVM快照备份前,通过
- LVM快照保存数据文件状态
- LVM快照捕获的是数据文件在某一时刻的状态。虽然在快照期间数据库可能有写入操作,但由于WAL机制,数据文件本身不会被直接修改(除了检查点操作时的刷新)。结合WAL日志,在恢复时,先将数据文件恢复到LVM快照时的状态,然后重放从备份开始到备份结束期间生成的WAL日志,就能将数据库恢复到备份结束时的一致性状态。
- 协同工作实现完整恢复
- WAL归档和LVM快照协同工作,确保了在热备份场景下数据的一致性和可恢复性。WAL归档记录了数据库在备份期间的所有变更,LVM快照提供了一个数据文件的基准状态。通过结合这两者,在恢复时可以从LVM快照恢复数据文件,然后重放WAL日志,从而完整地恢复数据库到备份结束时的状态,保障数据的一致性。