PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

pg_dirtyread 是 PostgreSQL 的一个特殊扩展,它允许读取已被删除但尚未被 VACUUM 清理的数据行,是数据恢复的重要工具。

原理:
pg_dirtyread 通过直接访问表的底层页面,绕过 PostgreSQL 正常的可见性规则检查:

  • 读取表的物理页面数据
  • 忽略 xmax 标记(删除事务ID)
  • 返回所有行版本,包括被删除的行

时间窗口限制:

  • 只能读取尚未被 VACUUM 清理的数据
  • 常规表:通常保留几小时到几天
  • 频繁更新的表:保留时间更短

不支持的场景:

  • TRUNCATE 操作删除的数据
  • DROP TABLE 删除的表
  • 已执行 VACUUM FULL 的表

一 下载并编译安装

1.1 下载

在这里插入图片描述

下载网址:
https://github.com/df7cb/pg_dirtyread/tags

1.2 编译安装

make
make install

1.3 创建 pg_dirtyread

–修改postgresql.conf文件

shared_preload_libraries = 'pg_stat_kcache,pg_stat_statements,auto_explain,pg_dirtyread'        # (change requires restart)

–创建extension

white=# create extension pg_dirtyread;
CREATE EXTENSION
white=# 
white=# select * from pg_EXTENSION;oid  |      extname       | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
-------+--------------------+----------+--------------+----------------+------------+-----------+--------------14270 | plpgsql            |       10 |           11 | f              | 1.0        |           | 17620 | pg_repack          |       10 |         2200 | f              | 1.5.0      |           | 17659 | pg_stat_statements |       10 |         2200 | t              | 1.10       |           | 17739 | pgstattuple        |       10 |         2200 | t              | 1.5        |           | 17840 | pg_bulkload        |       10 |         2200 | f              | 3.1.21     |           | 17861 | pg_dirtyread       |       10 |         2200 | t              | 2          |           | 
(6 rows)

二 测试

2.1 测试一:先delete,再关闭表的autovacuum。(找回失败)

white=# select count(*) from yewu1.t3;count 
-------100
(1 row)white=# 
white=# delete from yewu1.t3 where id >10;
DELETE 90
white=# 
white=# select count(*) from yewu1.t3;count 
-------10
(1 row)white=# ALTER TABLE yewu1.t3 SET (
white(#       autovacuum_enabled = false, toast.autovacuum_enabled = false
white(#     );
ALTER TABLE
white=# 
white=# SELECT * FROM pg_dirtyread('yewu1.t3') as t(id int, name varchar(20));id |  name   
----+---------1 | haha_12 | haha_23 | haha_34 | haha_45 | haha_56 | haha_67 | haha_78 | haha_89 | haha_910 | haha_10
(10 rows)white=# 

2.2 测试二:先关闭表的autovacuum,再delete。(找回成功)

white=# select count(*) from yewu1.t3;count 
-------100
(1 row)white=# ALTER TABLE yewu1.t3 SET (
white(#       autovacuum_enabled = false, toast.autovacuum_enabled = false
white(#     );
ALTER TABLE
white=# 
white=# delete from yewu1.t3 where id > 10;
DELETE 90
white=# 
white=# select count(*) from yewu1.t3;count 
-------10
(1 row)white=# 
white=# SELECT * FROM pg_dirtyread('yewu1.t3') as t(id int, name varchar(20));id  |   name   
-----+----------1 | haha_12 | haha_23 | haha_34 | haha_45 | haha_5
。。。省略。。。96 | haha_9697 | haha_9798 | haha_9899 | haha_99100 | haha_100
(100 rows)white=# 
white=# 

查看autovacuum默认配置
在默认配置下,表发生较小的变化就会触发autovacuum,进而影响pg_dirtyread,减少了其可用性。

#autovacuum_work_mem = -1               # min 1MB, or -1 to use maintenance_work_mem
#log_autovacuum_min_duration = 10min    # log autovacuum activity;
#autovacuum = on                        # Enable autovacuum subprocess?  'on'
#autovacuum_max_workers = 3             # max number of autovacuum subprocesses
#autovacuum_naptime = 1min              # time between autovacuum runs
#autovacuum_vacuum_threshold = 50       # min number of row updates before
#autovacuum_vacuum_insert_threshold = 1000      # min number of row inserts
#autovacuum_analyze_threshold = 50      # min number of row updates before
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_vacuum_insert_scale_factor = 0.2    # fraction of inserts over table
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
#autovacuum_multixact_freeze_max_age = 400000000        # maximum multixact age
#autovacuum_vacuum_cost_delay = 2ms     # default vacuum cost delay for# autovacuum, in milliseconds;
#autovacuum_vacuum_cost_limit = -1      # default vacuum cost limit for# autovacuum, -1 means use

谨记:心存敬畏,行有所止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux3 mkdir rmdir rm cp touch ls -d /*/

Linux 系统的初始目录结构遵循 FHS(Filesystem Hierarchy Standard,文件系统层次标准),定义了每个目录的核心功能和存储内容。以下是 Linux 系统初始安装后的主要目录及其作用: 1. 核心系统目录 目录用途典型内容示例…

Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

学习Bazel ,就要学习Bazel 的规则定义, 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中,Symbol、Rule 和 Macro 是常见的概念。除此之外,Bazel 还有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…

深入探究 Hive 中的 MAP 类型:特点、创建与应用

摘要 在大数据处理领域,Hive 作为一个基于 Hadoop 的数据仓库基础设施,提供了方便的数据存储和分析功能。Hive 中的 MAP 类型是一种强大的数据类型,它允许用户以键值对的形式存储和操作数据。本文将深入探讨 Hive 中 MAP 类型的特点,详细介绍如何创建含有 MAP 类型字段的表…

基于Java的区域化智慧养老系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,区域化智慧养老系统当然不能排除在外。区域化智慧养老系统是在实际应用和软件工程的开发原理之上,运用Java语言、JSP技术以及…

关于JVM和OS中的指令重排以及JIT优化

关于JVM和OS中的指令重排以及JIT优化 前言: 这东西应该很重要才对,可是大多数博客都是以讹传讹,全是错误,尤其是JVM会对字节码进行重排都出来了,明明自己测一测就出来的东西,写出来误人子弟… 研究了两天&…

VS2022远程调试Linux程序

一、 1、VS2022安装参考 VS Studio2022安装教程(保姆级教程)_visual studio 2022-CSDN博客 注意:勾选的时候,要勾选下方的选项,才能调试Linux环境下运行的程序! 2、VS2022远程调试Linux程序测试 原文参…

WPF设计学习记录滴滴滴4

<Button x:Name"btn"Content"退出"Width" 100"Height"25"Click"btn_Click" IsDefault"True"/> <Button x:Name"btn" <!-- 控件标识&#xff1a;定义按钮的实例名称为"btn&…

JVM 有哪些垃圾回收器

垃圾收集算法 标记-复制算法(Copying): 将可用内存按容量划分为两个区域,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面, 然后再把已使用过的内存空间一次清理掉。 标记-清除算法(Mark-Sweep): 算法分为“标记” 和“清除”两个…

React DndKit 实现类似slack 类别、频道拖动调整位置功能

一周调试终于实现了类 slack 类别、频道拖动调整位置功能。 历经四个版本迭代。 实现了类似slack 类别、频道拖动调整功能 从vue->react &#xff1b;更喜欢React的生态及编程风格&#xff0c;新项目用React来重构了。 1.zustand全局状态 2.DndKit 拖动 功能视频&…

新浪财经股票每天10点自动爬取

老规矩还是先分好三步&#xff0c;获取数据&#xff0c;解析数据&#xff0c;存储数据 因为股票是实时的&#xff0c;所以要加个cookie值&#xff0c;最好分线程或者爬取数据时等待爬取&#xff0c;不然会封ip 废话不多数&#xff0c;直接上代码 import matplotlib import r…

使用Android 原生LocationManager获取经纬度

一、常用方案 1、使用LocationManager GPS和网络定位 缺点&#xff1a;个别设备,室内或者地下停车场获取不到gps定位,故需要和网络定位相结合使用 2、使用Google Play服务 这种方案需要Android手机中有安装谷歌服务,然后导入谷歌的第三方库&#xff1a; 例如&#xff1a;i…

验证码实现

验证码案例 学了Spring MVC &#xff0c;配置 相关章节&#xff0c; 现可以尝试写一个前后端交互的验证码 文章目录 验证码案例前言一、验证码是什么&#xff1f;二、需求1.引入依赖2.导入前端页面3.约定前后段交互接口 三、代码解析Controllermodelapplication.xml 四丶结果五…

查询当前用户的购物车和清空购物车

业务需求&#xff1a; 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函数_1.2计算base的exponent次幂

题目&#xff1a; 键盘录入两个整数&#xff1a;底(base)和幂指数(exponent)&#xff0c;计算base的exponent次幂&#xff0c;并打印输出对应的结果。&#xff08;注意底和幂指数都可能是负数&#xff09; 提示&#xff1a;求幂运算时&#xff0c;基础的思路就是先无脑把指数转…

【nacos安装指南】

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

通过发音学英语单词:从音到形的学习方法

&#x1f4cc; 通过发音学英语单词&#xff1a;从音到形的学习方法 英语是一种 表音语言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如汉语拼音、西班牙语等&#xff09;那么规则&#xff0c;而是 部分表音部分表意。这意味着我们可以通…

列表某个字段由多个值组成,使用id匹配展示

说明&#xff1a;列表中字段A的值由多个值组成&#xff0c;但是后端返回的是这多个值的id字符串&#xff0c;需要前端拿着多个id组成的字符串去另一个接口数据源匹配展示 列表后端返回多个字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…

MQL5教程 05 指标开发实战:双色线、双线变色MACD、跨时间周期均线

文章目录 一、双色线指标二、双线变色MACD指标三、跨时间周期均线 一、双色线指标 这里的类型中&#xff0c;Color开头的&#xff0c;是可以选择多个颜色的。 #property indicator_chart_window #property indicator_buffers 18 #property indicator_plots 7 //--- plot xian…

Java全栈面试宝典:线程安全机制与Spring Boot核心原理深度解析

目录 一、Java线程安全核心原理 &#x1f525; 问题1&#xff1a;线程安全的三要素与解决方案 线程安全风险模型 线程安全三要素 synchronized解决方案 &#x1f525; 问题2&#xff1a;synchronized底层实现全解析 对象内存布局 Mark Word结构&#xff08;64位系统&…

【Cursor】设置语言

Ctrl Shift P 搜索 configure display language选择“中文-简体”