PostgreSQL闪回表之pg_dirtyread插件

0    634    1

👉 本文共约1258个字,系统预计阅读时间或需5分钟。

PostgreSQL闪回表之pg_dirtyread插件

误删数据总是在所难免,一种是使用延时备库,在延迟间隔内可以从备库恢复数据,另一种使用开源插件pg_dirtyread,pg_dirtyread使用时需要关闭表的自动清理功能,不然可能也恢复不了。

Oracle数据库有时候不小心删除掉数据,想查询这些数据,或者恢复数据,就可以使用带有as of子句的select语句进行闪回查询。

PG粉有福了,下面介绍一种类似“闪回查询”插件 pg_dirtyread,可以读取未被vacuum的dead数据。

版本支持:10和11已经支持,2.0以后的版本已经支持12和13,社区还是很活跃。

语法:

官网的3个例子

样例1: 删除找回

可以看到, 被删除的记录(1, 'Test')已经可以查询到。

样例2:列被drop的情况

可以看到,虽然b列被drop掉了,但是仍然可以读取到数据。

如何指定列:这里使用dropped_N来访问第N列,从1开始计数。

局限:由于PG删除了原始列的元数据信息,因此需要在表列名中指定正确的类型,这样才能进行少量的完整性检查。包括类型长度、类型对齐、类型修饰符,并且采取的是按值传递。

样例3:系统列

可以看到,xmax和ctid可以被恢复了。 oid只在11以及更早的版本中才能被恢复。

安装插件pg_dirtyread

GitHub地址:https://github.com/df7cb/pg_dirtyread

安装插件pageinspect extension

pageinspect模块提供函数让你从低层次观察数据库页面的内容,这对于调试目的很有用。所有这些函数只能被超级用户使用。

pageinspect的源码在postgres源码包的contrib目录下,解压postgre源码包后进入对应的目录。

有makefile文件,直接用make命令进行编译即可。编译后,只要得到pageinspect.so这个文件。

安装插件:

创建扩展和测试表

http://postgres.cn/docs/13/pageinspect.html

get_raw_page(relname text, fork text, blkno int) 返回 bytea
get_raw_page读取提及的关系中的指定块并且以一个bytea值的形式返回一个拷贝。这允许得到该块的一个单一的时间一致的拷贝。对于主数据分叉,fork应该是'main',对于空闲空间映射应该是'fsm',对于可见性映射应该是'vm',对于初始化分叉应该是'init'。

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

get_raw_page(relname text, blkno int) 返回 bytea
一个简写版的get_raw_page,用于读取主分叉。等效于get_raw_page(relname, 'main', blkno)

删除行后再查看

手工对表做一下清理

pg_dirtyread使用

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

20 − 13 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部