表级法医学:用WAL日志恢复被删除的单行数据
超越传统pg_dump备份思维,直接从PostgreSQL预写式日志(WAL)中解析并恢复特定表被误删的单行记录,适用于无备份的紧急数据救援。 · 难度:入门 · +10XP
表级法医学:用WAL日志恢复被删除的单行数据
当DELETE误操作发生且没有近期备份时,PostgreSQL的WAL(预写式日志)可能是最后一根救命稻草。通过pg_waldump工具解析WAL记录,结合pageinspect插件读取数据页的残留元组(dead tuples),你可以定位并重建被删除的单行数据。本教程将演示如何开启full_page_writes、定位LSN范围、解析WAL中的行映像,最终用伪造INSERT语句恢复记录。注意:这仅适用于wal_level=replica或logical且数据尚未被VACUUM彻底清除的场景。
-- 查找被删除行所在的LSN范围
SELECT pg_current_wal_lsn();
-- 解析WAL(示例命令,需根据实际LSN调整)
pg_waldump -p /var/lib/postgresql/16/main/pg_wal -s 0/1A2B3C0 -e 0/1A2B3C8
-- 使用pageinspect查看页面残留元组
CREATE EXTENSION pageinspect;
SELECT lp, lp_off, lp_flags, t_xmin, t_xmax, t_ctid FROM heap_page_items(get_raw_page('target_table', 0));