PostgreSQL 的扩展pageinspect

news2025/6/8 7:20:36

PostgreSQL 的扩展pageinspect

pageinspect 是 PostgreSQL 提供的一个强大的底层扩展,允许数据库管理员和开发者直接检查数据库页面的内部结构。这个扩展对于数据库调试、性能优化和深入学习 PostgreSQL 存储机制非常有价值。

一、扩展概述

功能:提供对 PostgreSQL 堆表、索引等页面级别的低级检查功能
用途

  • 诊断数据损坏问题
  • 理解 PostgreSQL 存储结构
  • 优化性能(分析页面填充率等)
  • 开发数据库工具和扩展

版本支持:PostgreSQL 9.6+(不同版本功能可能略有差异)

二、安装与启用

-- 创建扩展
CREATE EXTENSION pageinspect;

-- 验证是否安装成功
SELECT * FROM pg_available_extensions WHERE name = 'pageinspect';

三、核心功能函数

1. 堆表页面检查

get_raw_page(relname text, fork text, blkno int)

获取表的原始页面数据

-- 获取表'test'的第0块数据
SELECT * FROM get_raw_page('test', 'main', 0);
heap_page_items(page bytea)

显示堆表页面中的所有行指针和元组头部信息

-- 检查表'test'的第0块内容
SELECT * FROM heap_page_items(get_raw_page('test', 0));
page_header(page bytea)

显示页面头部信息

-- 查看页面头部信息
SELECT * FROM page_header(get_raw_page('test', 0));

2. B-tree 索引检查

bt_metap(relname text)

显示B-tree索引的元信息

-- 查看索引'test_pkey'的元信息
SELECT * FROM bt_metap('test_pkey');
bt_page_stats(relname text, blkno int)

显示B-tree索引页面的统计信息

-- 查看索引'test_pkey'的第1页统计信息
SELECT * FROM bt_page_stats('test_pkey', 1);
bt_page_items(relname text, blkno int)

显示B-tree索引页面的项目

-- 查看索引'test_pkey'的第1页内容
SELECT * FROM bt_page_items('test_pkey', 1);

3. 其他功能函数

fsm_page_contents(page bytea)

显示空闲空间映射(FSM)页面内容

-- 查看表的FSM页面
SELECT * FROM fsm_page_contents(get_raw_page('test', 'fsm', 0));
brin_page_items(page bytea, index_oid regclass)

显示BRIN索引页面内容

-- 查看BRIN索引页面
SELECT * FROM brin_page_items(get_raw_page('brin_index', 0), 'brin_index'::regclass);

四、使用示例

示例1:分析表的页面填充率

-- 创建测试表
CREATE TABLE test_fillrate (id serial, data text);
INSERT INTO test_fillrate (data) 
SELECT md5(random()::text) FROM generate_series(1, 1000);

-- 分析页面填充情况
SELECT 
    blkno,
    COUNT(*) AS tuples,
    AVG(length(t_data::text)) AS avg_tuple_size,
    COUNT(*) * 100.0 / (
        SELECT setting::float 
        FROM pg_settings 
        WHERE name = 'block_size'
    ) AS fill_percentage
FROM 
    heap_page_items(get_raw_page('test_fillrate', 0))
GROUP BY 
    blkno;

示例2:诊断TOAST表问题

-- 检查TOAST表页面
SELECT * FROM heap_page_items(
    get_raw_page(
        (SELECT reltoastrelid FROM pg_class WHERE relname = 'large_table'), 
        0
    )
);

示例3:验证索引结构完整性

-- 检查B-tree索引的完整性
SELECT 
    level, 
    count(*) as pages, 
    avg(bt_page_stats.blksize) as avg_page_size
FROM 
    generate_series(0, 
        (SELECT level FROM bt_metap('test_pkey'))
    as level,
    lateral (
        SELECT * 
        FROM bt_page_stats('test_pkey', blkno) 
        WHERE btpo_level = level
    ) as bt_page_stats
GROUP BY 
    level
ORDER BY 
    level;

五、输出解释

heap_page_items 输出字段

字段名类型描述
lpint行指针编号
lp_offint行指针偏移量
lp_flagsint行指针标志位
lp_lenint元组长度
t_xmintext插入事务ID
t_xmaxtext删除/锁定事务ID
t_field3text特殊字段(如ctid)
t_ctidtext当前元组ID
t_infomask2int属性标记
t_infomaskint元组信息标记
t_hoffint头部偏移量
t_bitstextNULL位图
t_oidtext对象ID(OID)
t_databytea元组数据

bt_page_stats 输出字段

字段名类型描述
blknoint页面编号
typetext页面类型
live_itemsint活动项数量
dead_itemsint死亡项数量
avg_item_sizeint平均项大小
page_sizeint页面大小
free_sizeint空闲空间大小
btpo_prevint前一页
btpo_nextint后一页
btpo_levelintB-tree层级
btpo_flagsint页面标志位

六、高级应用场景

场景1:数据损坏修复

-- 1. 识别损坏页面
SELECT corrupt_page 
FROM verify_heapam('table_name');

-- 2. 检查损坏页面内容
SELECT * FROM heap_page_items(get_raw_page('table_name', corrupt_page));

-- 3. 尝试从其他副本恢复或使用pg_resetwal

场景2:索引优化分析

-- 分析索引页面填充率
SELECT 
    blkno, 
    live_items, 
    dead_items,
    free_size,
    (page_size - free_size) * 100.0 / page_size AS fill_percentage
FROM 
    bt_page_stats('index_name', blkno) 
ORDER BY 
    blkno;

场景3:MVCC行为研究

-- 跟踪元组在不同事务中的变化
BEGIN;
INSERT INTO test VALUES (1, 'first');
SELECT lp, t_xmin, t_xmax, t_ctid FROM heap_page_items(get_raw_page('test', 0));

-- 在另一个会话中...
UPDATE test SET data = 'updated' WHERE id = 1;

-- 回到第一个会话
SELECT lp, t_xmin, t_xmax, t_ctid FROM heap_page_items(get_raw_page('test', 0));
COMMIT;

七、注意事项

  1. 权限要求:需要超级用户权限才能使用大多数函数
  2. 性能影响:直接读取页面会绕过缓冲区,可能影响性能
  3. 数据安全:错误使用可能导致数据损坏
  4. 版本兼容性:不同PostgreSQL版本的页面格式可能不同
  5. 生产环境:建议先在测试环境验证操作

八、与相关工具结合

  1. pgstattuple:结合分析表膨胀情况

    CREATE EXTENSION pgstattuple;
    SELECT * FROM pgstattuple('table_name');
    
  2. pg_repack:发现页面问题后重组表

    -- 需要单独安装
    pg_repack -d dbname -t table_name
    
  3. WAL检查:结合pg_waldump分析WAL记录

通过合理使用pageinspect扩展,可以深入了解PostgreSQL的存储机制,诊断复杂问题,并进行高级性能优化。

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

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

相关文章

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作

在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么? 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行,输入net start sshd,启动SSH。 或者右击我的电脑&#…

股指期货波动一个点多少钱?

很多朋友在交易股指期货时,都会好奇一个问题:股指期货波动一个点,我的账户里到底是赚了还是亏了多少钱?要搞清楚这个问题,其实很简单,只需要了解两个关键信息:股指期货的“交易单位”&#xff0…

iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform

Kotlin Multiplatform(简称 KMP)是 JetBrains 推出的开源跨平台开发框架 Kuikly 是腾讯开源的跨端开发框架,基于 Kotlin Multiplatform 技术构建,为开发者提供了技术栈更统一的跨端开发体验 KMP 不仅局限于移动端,它…

探索C++标准模板库(STL):String接口的底层实现(下篇)

前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:this指针与六大默认成员函数。它们如同对象的“隐形守护者”&am…

Flutter知识点汇总

Flutter架构解析 1. Flutter 是什么?它与其他移动开发框架有什么不同? Flutter 是 Google 开发的开源移动应用开发框架,可用于快速构建高性能、高保真的移动应用(iOS 和 Android),也支持 Web、桌面和嵌入式设备。。它与其他移动开发框架(如 React Native、Xamarin、原…

​线性注意力 vs. 传统注意力:效率与表达的博弈新解

​核心结论​:线性注意力用计算复杂度降维换取全局建模能力,通过核函数和结构优化补足表达缺陷 一、本质差异:两种注意力如何工作? ​特性​传统注意力(Softmax Attention)线性注意力(Linear At…

YOLO在QT中的完整训练、验证与部署方案

以下是YOLO在QT中的完整训练、验证与部署方案: 训练方案 准备数据集: 收集数据:收集与目标检测任务相关的图像数据集,可以是公开数据集如COCO、Pascal VOC,也可以是自定义数据集。标注数据:使用标注工具如…

增量式网络爬虫通用模板

之前做过一个项目,他要求是只爬取新产生的或者已经更新的页面,避免重复爬取未变化的页面,从而节省资源和时间。这里我需要设计一个增量式网络爬虫的通用模板。可以继承该类并重写部分方法以实现特定的解析和数据处理逻辑。这样可以更好的节约…

【JVM】三色标记法原理

在JVM中,三色标记法是GC过程中对象状态的判断依据,回收前给对象设置上不同的三种颜色,三色分为白色、灰色、黑色。根据颜色的不同,决定对象是否要被回收。 白色表示: 初始状态:所有对象未被 GC 访问。含义…

【uniapp开发】picker组件的使用

项目uniapp,结合fastadmin后端开发 picker组件的官方文档说明 https://en.uniapp.dcloud.io/component/picker.html#普通选择器 先看效果: 1、实现设备类型的筛选;2、实现设备状态的筛选; 前端代码(节选&#xff0…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十一) -> 同步云端代码至DevEco Studio工程

目录 1 -> 同步云函数/云对象 1.1 -> 同步单个云函数/云对象 1.2 -> 批量同步云函数/云对象 2 -> 同步云数据库 2.1 -> 同步单个对象类型 2.2 -> 批量同步对象类型 3 -> 一键同步云侧代码 1 -> 同步云函数/云对象 说明 对于使用DevEco Studio…

go-zero微服务入门案例

一、go-zero微服务环境安装 1、go-zero脚手架的安装 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安装下载地址根据自己电脑操作系统下载对应的版本,具体的使用自己查阅文章 二、创建一个user-rpc服务 1、定义user.proto文件 syntax &qu…

Python控制台输出彩色字体指南

在Python开发中,有时我们需要在控制台输出彩色文本以提高可读性或创建更友好的用户界面。本文将介绍如何使用colorama库来实现这一功能。 为什么需要彩色输出? 提高可读性:重要信息可以用不同颜色突出显示更好的用户体验:错误信息…

开源之夏·西安电子科技大学站精彩回顾:OpenTiny开源技术下沉校园,点燃高校开发者技术热情

开源之夏2025编程活动正在如火如荼的进行中,当前也迎来了报名的倒计时阶段,开源之夏组织方也通过高校行系列活动进入各大高校,帮助高校开发者科普开源文化、开源活动、开源技术。 6月4日 开源之夏携手多位开源技术大咖、经验型选手走进西安电…

解决数据库重启问题

最近部署软件时,发现mysql会一直在重启,记录下解决办法: 1.删除/home/dataexa/install/docker/datas/mysql路径下的data文件夹 2.重新构建mysql docker-compose up -d --build mysql 3.停掉所有应用,在全部重启: do…

前后端交互过程中—各类文件/图片的上传、下载、显示转换

前后端交互过程中—各类文件/图片的上传、下载、显示转换 图片补充:new Blob()URL.createObjectURL()替代方案:FileReader.readAsDataURL()​​对比: tiff文件TIFF库TIFF转换通过url转换tiff文件为png通过文件选择的方式转换tiff文件为png 下…

数据库同步是什么意思?数据库架构有哪些?

目录 一、数据库同步是什么 (一)基本概念 (二)数据库同步的类型 (三)数据库同步的实现方式 二、数据库架构的类型 (一)单机架构 (二)主从复制架构 &a…

【数据结构】详解算法复杂度:时间复杂度和空间复杂度

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平 前言&…

Rest-Assured API 测试:基于 Java 和 TestNG 的接口自动化测试

1. 右键点击项目的文件夹,选择 New > File。 2. 输入文件名,例如 notes.md,然后点击 OK。 3. 选择项目类型 在左侧的 Generators 部分,选择 Maven Archetype,这将为你生成一个基于 Maven 的项目。 4. 配置项目基…

react public/index.html文件使用env里面的变量

env文件 ENVdevelopment NODE_ENVdevelopment REACT_APP_URL#{REACT_APP_URL}# REACT_APP_CLIENTID#{REACT_APP_CLIENTID}# REACT_APP_TENANTID#{REACT_APP_TENANTID}# REACT_APP_REDIRECTURL#{REACT_APP_REDIRECTURL}# REACT_APP_DOMAIN_SCRIPT#{REACT_APP_DOMAIN_SCRIPT}#pu…