PostgreSQL中误删除数据怎么办(一)

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。【PostgreSQL】PostgreSQL中误删除数据怎么办(一) - 课程体系 - 云贝教育https://www.yunbee.net/Home/News/detail/article_id/482.html

在我们学习完PG的MVCC机制之后,对于DML操作,被操作的行其实并未被删除,只有手工vacuum或自动vacuum触发才会清理掉这些无效数据,也就是死元组。

基于这种机制,在发生死元组清理动作之前,只需要将其中不可见的行中的数据解析出来,或者发生脏读,就可以获取到误删除的数据。虽然PG不支持脏读,但今天介绍的pg_dirtyread插件,可以实现脏读。

一、安装pg_dirtyread

下载地址

GitHub - df7cb/pg_dirtyread: Read dead but unvacuumed tuples from a PostgreSQL relation

这个网页上有详细的安装说明

编译安装

二、使用示例

2.1 在对应库创建EXTENSION
2.2 创建表并禁用autovacuum
2.3 插入并通过heap_page_items查看数据
2.4 删除数据

这里发现被删除的数据还在块中

2.5 发现数据被误删除后第一时间关掉表上的vacuum

这一步很关键!!!

这一步很关键!!!

这一步很关键!!!

2.6 查看表vacuum情况

last_vacuum和last_autovacuum都是空的,表示还未被vacuum过。

2.7 使用pg_dirtyread查看表,dead为t表示数据已 经删除

删除数据后,需要查询一下,pg_dirtyread中的dead列才会更新。也就是pg_dirtyread需要扫描一次表中的page才知道该行是不是被修改过。

2.8 恢复到某个时间

如果做不完全恢复,即恢复数据到某个时刻,需要使用函数pg_xact_commit_timestamp将事务ID进行转换。

xmax_time 就是数据具体删除时间

2.9 pg_dirtyread还支持被删除的列

三、如果表上已经发生了vacuum

3.1 对表进行vacuum回收死元组
3.2 查看块中的数据被清理
3.3 再次用pg_dirtyread查看死元组的数据已经被清理了

这种场景下,就无法通过脏块或解析死元组中的数据信息来恢复数据库,下一篇介绍WALMINER恢复误删除的数据。

总结

如果不小心误删除了数据,可以通过特殊手段来恢复数据的,具体恢复步骤如下:

  1. 对表执行禁用vacuum(特别强调,这一步非常重要)
  1. 使用pg_dirtyread插件查询被删除的数据,同时将数据抽取到中间表

另外,如何要找的数据己被vacuum,还可以通过分析数据具体被删除的时间,然后通过WalMiner解析wal日志,找到对应的时间点,生成undo sql(如果执行的delete,undo sql就是insert语句)。

相关推荐
笃行3502 小时前
别拿MySQL数据库管理工具硬导:MySQL 迁 KingbaseES 的完整工具链
数据库
风哥2号2 小时前
数据库教程FGMT51‑PostgreSQL实例管理与参数文件
数据库·postgresql
蓝速科技3 小时前
桌面双屏翻译机量产调试:三类场景兼容性破局方案丨蓝速科技
运维·数据库·人工智能·科技·技术分享
达梦数据3 小时前
DMDRS空间数据类型说明:Oracle、DM8、MySQL空间数据类型映射
数据库·mysql·oracle
白远山3 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
达梦数据4 小时前
DMDRS服务与模块的运行步骤
数据库
lusklusklusk4 小时前
Oracle索引组织表,SQLServer聚集索引,Mysql Innodb表的数据行不是在磁盘上像排队一样严格连续地存放
mysql·postgresql·oracle·sqlserver
让学习成为一种生活方式4 小时前
PMGD:植物线粒体基因组数据库--Journal of Integrative Plant Biology
数据库
达梦数据5 小时前
达梦数据复制软件DMDRS搭建部署示例:源数据库DM8到目标数据库DM8一对一数据同步
数据库
IT_Octopus5 小时前
从一个应用开发者的角度,搞懂大数据查询的完整链路
java·大数据·数据库