当前位置: 首页 > news >正文

PostgreSQL 数据误删 止损操作

PostgreSQL 数据误删恢复技术指南



💡 作者古渡蓝按

个人微信公众号:微信公众号(深入浅出谈java)
感觉本篇对你有帮助可以关注一下,会不定期更新知识和面试资料、技巧!!!


一、核心原理:为什么数据能恢复?

​ 在 PostgreSQL 中,执行 DELETE 操作后,数据并不会立即从磁盘上物理擦除。PostgreSQL 使用多版本并发控制(MVCC)机制,删除操作仅仅是给数据行打上了一个“已删除”的标记(在事务 ID 层面标记为 xmax)。

只有当 VACUUM(自动清理或手动清理)进程运行并扫描该表时,这些被标记为“已删除”的物理空间才会被真正回收和覆盖。因此,恢复的关键在于与 VACUUM 进程赛跑



二、紧急止损:黄金三步

一旦发现误删,必须立即执行以下操作以锁定现场,防止数据被彻底清理。

  1. 立即停止应用写入
    防止新数据写入覆盖掉被标记为删除的旧数据页。
  2. 禁用自动清理
    这是最关键的一步。必须针对受影响的表关闭 autovacuum。
-- 将 'your_table_name' 替换为实际表名
ALTER TABLE your_table_name SET (autovacuum_enabled = false);

​ 3.锁定表
防止其他会话对表进行操作,确保数据文件处于静止状态。

BEGIN;
LOCK TABLE your_table_name IN ACCESS EXCLUSIVE MODE;
-- 保持事务开启,不要提交或回滚,直到恢复完成


三、恢复方案 A:使用 pg_dirtyread 插件(推荐)

如果数据库允许安装扩展,这是最安全、最直观的方法。该插件允许用户读取被标记为删除但仍存在于磁盘上的“脏”数据。

  1. 安装插件
    需在目标数据库中执行(需超级用户权限):
CREATE EXTENSION pg_dirtyread;

2.查询被删数据
使用插件提供的函数读取数据。你需要明确指定表的字段结构。

SELECT * 
FROM pg_dirtyread('your_table_name') 
AS t(id int, name text, create_time timestamp) -- 必须与表结构一致
WHERE (SELECT pg_xact_commit_timestamp(xmax)) IS NOT NULL; -- 筛选被删除的行
  • xmax:表示删除该行的事务 ID。如果 xmax 不为 0,说明该行已被删除。
  • pg_xact_commit_timestamp(xmax):可选,用于查看删除发生的时间。

​ 3.数据回写
确认查询到的数据无误后,将其插回原表或新表。

INSERT INTO your_table_name (id, name, create_time)
SELECT id, name, create_time
FROM pg_dirtyread('your_table_name') 
AS t(id int, name text, create_time timestamp)
WHERE (SELECT pg_xact_commit_timestamp(xmax)) IS NOT NULL;


四、恢复方案 B:底层十六进制解析(硬核方案)

如果无法安装插件,可以通过查询底层页面数据来手动还原。PostgreSQL 将数据存储在 8KB 的页面中,heap_page_items 函数可以读取页面的原始字节流。

  1. 获取原始数据
    查询被删除行的十六进制数据。
SELECT lp, t_attrs 
FROM heap_page_item_attrs(get_raw_page('your_table_name', 0), 'your_table_name'::regclass)
WHERE t_xmax != 0; -- 筛选已删除行

2.解析十六进制数据
查询结果中的 t_attrs 字段通常以 \x 开头,这是十六进制编码的文本。

  • 文本字段:例如 \x48656c6c6f 对应 Hello
  • 整数字段:通常占用 4 字节,需注意大小端序(PostgreSQL 使用小端序)。例如 01 00 00 00 对应整数 1

为了简化手动解析的痛苦,建议创建一个辅助函数来批量转换:


CREATE OR REPLACE FUNCTION hex_to_text(hex_str text)
RETURNS text AS $$
BEGIN-- 去除 \x 前缀并转换RETURN convert_from(decode(substring(hex_str FROM 3), 'hex'), 'UTF8');
EXCEPTION WHEN OTHERS THENRETURN hex_str; -- 转换失败返回原值
END;
$$ LANGUAGE plpgsql;


五、恢复方案 C:基于 WAL 日志的时间点恢复

如果数据已经被 VACUUM 清理,或者上述方法无效,且数据库开启了归档模式,可以使用时间点恢复。

  1. 确认配置
    确保 postgresql.conf 中开启了归档:
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'

2.执行恢复

  • 停止数据库服务。
  • 使用 pg_basebackup 恢复基础备份。
  • 配置 recovery.signalpostgresql.auto.conf,指定恢复目标时间:
restore_command = 'cp /path/to/archive/%f %p'
recovery_target_time = '2026-04-08 09:00:00' -- 误删前的时间点
  • 启动数据库,PG 将重放日志直到指定时间点。


六、善后工作:恢复配置

数据恢复完成后,务必记得重新开启自动清理,否则表膨胀会导致性能严重下降。

-- 重新开启自动清理
ALTER TABLE your_table_name RESET (autovacuum_enabled);


七、总结与建议

方案 适用场景 难度 风险
pg_dirtyread 未执行 VACUUM,可安装插件
底层解析 未执行 VACUUM,无法安装插件 中(需人工解析)
WAL 日志 已执行 VACUUM,有归档配置 极高 高(需停机恢复)
备份还原 有定期 pg_dump 备份 中(数据可能回退)

建议:生产环境应始终开启 WAL 归档,并定期验证备份的可用性。对于核心表,可考虑配置逻辑复制槽以保留变更历史。



http://www.jsqmd.com/news/606882/

相关文章:

  • Python环境教程(五)-环境高级之Docker镜像封装
  • 2026黔南塑胶跑道施工怎么联系?靠谱服务电话曝光,避免踩坑 - 精选优质企业推荐榜
  • Schematics性能优化指南:5个提升数据处理效率的关键技巧
  • TensorFlow Lite Micro完全指南:如何在资源受限的微控制器上部署机器学习模型
  • 「开源数据」AI 如何“算”出一座超级城市?揭秘飞渡“峥嵘”大模型与 S800 算力底座
  • 彻底解决键盘连击问题:Keyboard Chatter Blocker终极使用指南
  • 影墨·今颜小红书模型MySQL集成实战:用户行为分析与内容推荐系统
  • 材料测试工程师必看:金属、陶瓷、高分子、复合、生物、软组织、薄膜、3D打印、生物医用原位及多功能力学试验机推荐榜单 - 品牌推荐大师
  • Nvidia ADS认证介绍 (Gemini)
  • GoJieba源码深度解析:理解HMM新词发现与最大概率分词
  • 3分钟学会Mem Reduct多语言界面切换:让内存管理更亲切
  • QGIS SCP插件报错‘remotior_sensus’?别慌,用OSGeo Shell一条命令搞定
  • CRM是什么?新手入门指南:概念、模块、选型与实操流程 - 纷享销客智能型CRM
  • 5个步骤解决网盘限速难题:本地解析工具如何提升下载效率
  • Sketch MeaXure:设计规范自动化工具的技术实现与工作流优化
  • 用Python+OpenCV给答题卡自动打分?手把手教你从图片处理到分数计算的完整流程
  • web服务相关
  • 基于STM32F103VET6的OV7670(FIFO)摄像头图像采集程序
  • 3步解锁专业级数据大屏:DataRoom开源可视化设计器全攻略
  • OpenClaw+SecGPT-14B成本优化:自建模型比SaaS安全API省80%
  • Chunking分块策略:RAG中文档切分的艺术
  • 3步搞定抖音直播回放下载:从痛点到解决方案的完整指南
  • 2026年全产业链自主生产的校服面料供应商推荐,选哪家好 - 工业设备
  • 日常囤货哪个超市外卖最靠谱?美团闪购周年庆解锁囤货新姿势 - 资讯焦点
  • 一次推荐系统的性能瓶颈:为什么很多工程团队最终都会用上 Bloom Filter
  • GD32F4系列定时器正交译码器实战:用编码器测电机转速(附CubeMX配置)
  • Apple-Mobile-Drivers-Installer:革新性极简驱动解决方案,1分钟解决iPhone USB网络共享难题
  • 从零开始搞工业质检模型?试试用ModelArts的‘主动学习’模式,能省70%标注预算
  • 多平台直播录制解决方案:StreamCap实战指南
  • 百度网盘提取码智能获取工具:让资源获取效率提升90%的实用解决方案