盘点 | 常用 PG 数据恢复方案概览

本文介绍了 PostgreSQL 数据恢复的各种方案,包括 pg_resetwal、pg_dirtyread、pg_recovery、pg_filedump、WalMiner 和 pageinspect。这些工具针对 DDL 和 DML 操作导致的数据丢失提供了不同的恢复策略。pg_recovery 和 pg_dirtyread 使用较为便捷,而 WalMiner 通过 WAL 日志进行恢复。文章还提醒了数据恢复前应做全量备份,并提供了设置参数以保留 Dead 元组防止数据膨胀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:张连壮 PostgreSQL 研发负责人

从事多年 PostgreSQL 数据库内核开发,对 Citus 有非常深入的研究。

PostgreSQL 本身不具备数据闪回和数据误删除保护功能,但在不同场景下也有对应的解决方案。本文由作者在 2021 PCC 大会的演讲主题《PostgreSQL 数据找回》整理而来,介绍了常见 数据恢复预防数据丢失的相关工具实现原理及使用示例。

在盘点数据恢复方案之前,先简单了解一下数据丢失的原因。

数据丢失的原因

数据丢失通常是由 DDL 与 DML 两种操作引起。

DDL

在 PostgreSQL 数据库中,表以文件的形式,采用 OID 命名规则存储于 PGDATA/base/DatabaseId/relfilenode 目录中。当进行 DROP TABLE 操作时,会将文件整体删除。

由于在操作系统中表文件已经不存在,所以只能采用恢复磁盘的方法进行数据恢复。但这种方式找回数据的概率非常小,尤其是云数据库,恢复磁盘数据几乎不可能。

DML

DML 包含 UPDATE、DELETE 操作。根据 MVCC 的实现,DML 操作并不是在操作系统磁盘中将数据删除,因此数据可以通过参数vacuum_defer_cleanup_age 来调整 Dead 元组在数据库中的数量,以便恢复误操作的数据。

数据恢复方案

pg_resetwal

pg_resetwal[1] 是 PostgreSQL 自带的工具(9.6 及以前版本叫 pg_resetxlog)。可清除预写式日志(WAL)并且可以重置 pg_control 文件中的一些信息。也可以修改当前事务 ID,从而使数据库可以访问到未被 Vacuum 掉的 Dead 元组。

使用示例

pg_resetwal 通过设置事务号的方式来恢复数据,因此必须提前获取待恢复数据的事务号。

1. 查看当前 lsn 位置

-- 在线查询
select pg_current_wal_lsn();

-- 离线查询
./pg_controldata -D dj | grep 'checkpoint location'

通过查询来确定 lsn 的大致的位置。

2. 获取事务号

./pg_waldump -b -s 0/2003B58 -p dj
rmgr: Heap        len (rec/tot):     59/   299, tx:        595, lsn: 0/030001B8, prev 0/03000180, desc: DELETE off 5 KEYS_UPDATED , blkref #0: rel 1663/16392/16393 blk 0 FPW
rmgr: Heap        len (rec/tot):     54/    54, tx:        595, lsn: 0/030002E8, prev 0/030001B8, desc: DELETE off 6 KEYS_UPDATED , blkref #0: rel 1663/16392/16393 blk 0
rmgr: Transaction len (rec/tot):     34/    34, tx:        595, lsn: 0/03000320, prev 0/030002E8, desc: COMMIT 2019-03-26 11:00:23。410557 CST

3. 设置事务号

-- 关闭数据
./pg_resetwal -D dj -x 595
-- 启动数据库

4. 查看所需数据

select</
### 如何在 PostgreSQL恢复误删除的数据 #### 使用逻辑复制槽 (Logical Replication Slot) 为了防止数据被永久删除,可以在配置中启用逻辑复制槽。这种方法允许保留更改流,从而使得可以通过这些日志重放事务并恢复已删除的数据。 ```sql SELECT * FROM pg_create_logical_replication_slot('my_slot', 'pgoutput'); ``` 一旦创建了复制槽,就可以通过读取该槽中的 WAL 日志条目来获取变更记录[^3]。 #### 利用时间点恢复 (Point-in-Time Recovery, PITR) PITR 是一种常见的用于从备份中恢复到特定时间点的技术。要实现这一点,通常需要事先设置好连续归档和WAL文件管理机制。当发生意外删除事件时,可以从最近的一次全量备份结合所需的增量WAL日志来进行恢复操作。 对于已经启用了持续归档功能的情况: 1. 停止数据库服务; 2. 将最新的基础备份拷贝回原位置; 3. 修改 `recovery.conf` 文件指定停止的时间戳或事务ID; 4. 启动实例让其自动应用必要的WAL日志直到设定的目标状态; 如果没有预先准备好的备份,则很难直接利用此方法进行恢复[^1]。 #### 数据库快照与克隆技术 某些云平台提供即时创建整个数据库集群快照的能力,这对于快速恢复非常有用。如果环境支持此类特性,在日常运维过程中定期建立快照可作为防范措施之一。 另外一些高级存储解决方案也提供了卷级别的瞬间复制能力,能够在不影响生产负载的情况下迅速生成一致性的副本供后续分析使用[^2]。 #### 手工重建结构并通过其他途径找回丢失的数据 如果不具备上述条件,还可以尝试手工方式重构受影响格的定义,并借助应用程序层面的日志或者其他外部系统保存的信息重新导入部分重要资料。不过这种方式往往耗时较长且成功率较低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值