Postgresql源码(139)vim直接修改postgresql表文件的简单实例
1 前言
- PG可以用pageinspect方便的读取查看表文件。
- 本篇介绍一种用vim查看、编辑的方法,案例比较简单,主要分享原理。
修改表文件和controlfile是非常危险的行为,请不要在生产尝试。
2 用例
简化问题,用简单编码的数据类型。
drop table t1;
create table t1 (a int, b int);
insert into t1 select t.i, t.i/10 from generate_series(1,1000) t(i);analyze t1;select relname,relfilenode,relpages from pg_class where relname = 't1';relname | relfilenode | relpages
---------+-------------+----------t1 | 49158 | 5checkpoint;select ctid, xmin, * from t1 order by 1 limit 10 offset 220;ctid | xmin | a | b
---------+----------+-----+----(0,221) | 50889007 | 221 | 22(0,222) | 50889007 | 222 | 22(0,223) | 50889007 | 223 | 22(0,224) | 50889007 | 224 | 22(0,225) | 50889007 | 225 | 22(0,226) | 50889007 | 226 | 22(1,1) | 50889007 | 227 | 22(1,2) | 50889007 | 228 | 22(1,3) | 50889007 | 229 | 22(1,4) | 50889007 | 230 | 23
模拟页面损坏,编辑修改a=230 b=23
这一行的数据,把xmin编辑成错误的值,制造报错。
3 vim打开表文件找到页面位置
前面查询到表文件49158,使用vim编辑并转换为16进制显示:
转换后
每个页面8KB,一个页面的地址占用0x2000,所以一号页面的地址范围是0x2000 - 0x4000
(ctid得知我们需要修改的数据在1号页面)
4 根据地址定位元组位置
ctid = (1,4)
元组在1号页面的第4个位置,根据PG的页面布局,我们从页面尾部,向上找第四个元组
postgres=# select ctid, xmin, * from t1 where a = 230;ctid | xmin | a | b
-------+----------+-----+----(1,4) | 50889007 | 230 | 23
根据页面地址范围,1号页面的结尾在00004000处,向上找四个元组,因为这里元组都是定长的,可以按规律找四个即可。这里数据简单可以用这种方法。
如果数据类型比较复杂,长短不一,可根据每个元组头部的xmin确定位置。例如我们需要找的元组的xmin是50889007,看到下面第四行的元组头部为
2f81 0803
= 十六进制:0x308812f
= 十进制:50889007
等于xmin的值
所以可以根据xmin的值,从最后一个一个向上找。
5 如何解析表中的二进制数据?
拿到页面1的第四行数据:
00003f80: 2f81 0803 0000 0000 0000 0000 0000 0100
00003f90: 0400 0200 0009 1800 e600 0000 1700 0000
这段数据可以分成三段来看
第一部分:HeapTupleHeaderData
-----------------------------------
第二部分:nulls bitmap 不一定有
-----------------------------------
第三部分:具体数据值
头上一定是一个HeapTupleHeaderData,而HeapTupleHeaderData的第一个元素是一个uint32记录的xmin。
struct HeapTupleHeaderData
{union{HeapTupleFields t_heap;DatumTupleFields t_datum;} t_choice;ItemPointerData t_ctid; /* current TID of this or newer tuple (or auint16 t_infomask2; /* number of attributes + various flags */uint16 t_infomask; /* various flag bits, see below */uint8 t_hoff; /* sizeof header incl. bitmap, padding */bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs *//* MORE DATA FOLLOWS AT END OF STRUCT */
};
typedef struct HeapTupleFields
{TransactionId t_xmin; /* inserting xact ID */TransactionId t_xmax; /* deleting or locking xact ID */union{CommandId t_cid; /* inserting or deleting command ID, or both */TransactionId t_xvac; /* old-style VACUUM FULL xact ID */} t_field3;
} HeapTupleFields;
所以按顺序来解析,因为我这台机器是小端序的(lscpu可以看),所以低地址存低位的值,解析出来:
2f81 0803
=十六进制:0x308812f
=十进制:50889007
等于xmin的值。0200
=十六进制:0x2
= t_infomask20009
=十六进制:0x900
= t_infomaske600 0000
=十六进制:0xe6
=十进制:230
= a列的值1700 0000
=十六进制:0x17
=十进制:23
= b列的值
00003f80: 2f81 0803 0000 0000 0000 0000 0000 0100| | | | |xmin(4B)| xmax(4B)| cid(4B) | t_ctid00003f90: 0400 0200 0009 1800 e600 0000 1700 0000|mask2|mask|hoff| 这里没有null值数组,所以就是数据了。t_infomask = 0x900
t_infomask2 = 0x02
t_hoff = 0x18
结果和真实数据对得上:
postgres=# select ctid, xmin, * from t1 where a = 230;ctid | xmin | a | b
-------+----------+-----+----(1,4) | 50889007 | 230 | 23
6 vim修改表文件中的数据
先做个实验,把b列的值也改成230:
select ctid, xmin, * from t1 where a = 230;ctid | xmin | a | b
-------+----------+-----+----(1,4) | 50889007 | 230 | 23
使用vim编辑
转换回二进制:
wq保存退出。
重新查询b还是23,为什么呢?因为页面已经在shared_buffer中了,现在没有负载所以页面不会重新从磁盘读上来。
这里需要重启一下,注意不要kill -9,redo有可能会把数据盖掉,让数据库正常checkpoint后关闭,在启动:
相关文章:
Postgresql源码(139)vim直接修改postgresql表文件的简单实例
1 前言 PG可以用pageinspect方便的读取查看表文件。本篇介绍一种用vim查看、编辑的方法,案例比较简单,主要分享原理。 修改表文件和controlfile是非常危险的行为,请不要在生产尝试。 2 用例 简化问题,用简单编码的数据类型。 d…...
Lianwei 安全周报|2025.1.2
以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 国家数据局等五部门印发《关于促进企业数据资源开发利用的意见》 为充分释放企业…...
Vue3-跨层组件通信Provide/Inject机制详解
Vue 3 中的 Provide 和 Inject 机制是专为跨层级传递数据而设计的,适用于祖先组件和后代组件之间的通信。与props 和 emits 不同,Provide/Inject 可以跨越多个层级进行数据传递,而不需要逐层传递。 1. Provide provide 是一个在祖先组件中提…...
springcloud 介绍
Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合,它提供了一套完整的工具集,用于快速构建分布式系统。在Spring Cloud的架构中,服务被拆分为一系列小型、自治的微服务,每个服务运行在其独立的进程中,并通过…...
css预处理器sass
在前端开发的世界中,CSS 是构建网页样式的基础。然而,随着项目规模的增大,纯 CSS 的编写和维护往往会变得复杂而繁琐。为了解决这些痛点,Sass(Syntactically Awesome Style Sheets)应运而生。Sass 是一种 C…...
匠人天工Ai浮雕网站创新发布了ZBrush插件,提效500%,为AI+数字雕刻行业带来新的活力
2025年1月6日,杭州——杭州仓颉造梦数字科技公司旗下产品匠人天工近日宣布推出一款创新的ZBrush插件,旨在为AI数字雕刻行业带来前所未有的效率提升。该插件通过一系列智能化功能,大幅简化了数字雕刻的建模流程,使建模效率提高了50…...
解决 Pangolin 版本不兼容导致的编译错误
在使用 Pangolin 库时,有时候会遇到由于版本不兼容而导致的编译错误。本文将通过一个具体的错误案例,展示如何识别和解决这种问题。 问题描述 在编译时,遇到如下编译错误: /usr/local/include/pangolin/gl/glsl.hpp: In member…...
day01_ Java概述丶开发环境的搭建丶常用DOS命令
编程常识 什么是编程? 所谓编程,就是人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。 编程语言的发展历程 第一代:机器语言 ,机器语言由数字组成所有指令。计算器解析运行速度,最快…...
进程间通信——网络通信——UDP
进程间通信(分类):网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型:(理论模型) 应用层 : 要传输的数据信息,如文件传输,电子邮件等 表示层 : 数…...
(六)vForm 动态表单(数据量大,下拉选卡顿问题)
系列文章目录 (一)vForm 动态表单设计器之使用 (二)vForm 动态表单设计器之下拉、选择 (三)vForm 动态表单解决下拉框无数据显示id问题 (四)vForm 动态表单自定义组件、属性 (五)vForm 动态表单文件上传、下载 文章目录 目录 前言 一、组件改造 1.添加分页所需参…...
asp.net core mvc的 ViewBag , ViewData , Module ,TempData
在 ASP.NET MVC 和 ASP.NET Core MVC 中,ViewBag 和 ViewData 是两种用于将数据从控制器传递到视图(View)的常用方法。它们都允许控制器将动态数据传递给视图,但它们的实现方式有所不同。关于 Module,它通常指的是某种…...
C#语言的软件开发工具
C#语言的软件开发工具 C#语言作为一种现代化的编程语言,凭借其强大的功能和丰富的生态系统,在软件开发领域得到了广泛的应用。随着C#语言的发展,越来越多的开发工具应运而生。本文将详细介绍C#语言常用的开发工具,包括集成开发环…...
iOS - AutoreleasePool
1. 基本数据结构 // AutoreleasePool 的基本结构 struct AutoreleasePoolPage {static pthread_key_t const key AUTORELEASE_POOL_KEY;magic_t const magic;id *next; // 指向下一个可存放对象的地址pthread_t const thread; // 所属线程AutoreleasePoolPage …...
数据仓库建设方案和经验总结
在做数据集成的过程中,往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中,对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理,造成资源和人力的浪费。同时,目前的系统架构,无…...
该单据从未生成交易分录
经常听到采购说,采购匹配明细表中没有xx料号的记录,没有xx供应商的记录。它们用这个报表来与供应商对账的。每每以此为借口拖延着货款不付。没有记录出来,原因各种。之前没有记录下来,想不起来。今天重新分析发现其中一个原因&…...
Flink DataSet API
文章目录 DataSet SourcesDataSet TransformationDataSet Sink序列化器样例一:读 csv 文件生成 csv 文件样例二:读 starrocks 写 starrocks样例三:DataSet、Table Sql 处理后写入 StarRocksDataSet<Row> 遍历遇到的坑 分类:…...
Bash Shell的操作环境
目录 1、路径与指令搜寻顺序 2、bash的进站(开机)与欢迎信息:/etc/issue,/etc/motd (1)/etc/issue (2)/etc/motd 3、bash的环境配置文件 (1)login与non-…...
web自动化测试环境搭建(python环境下selenium)
环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器:chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️:下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像࿱…...
解决cursor AI编辑器控制台console中文乱码
chcp 查看当前控制台编码 936 : gbk编码 控制台输入:chcp 65001 设置为utf8...
fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权
已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台:https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…...
ArkTs 状态管理装饰器
在构建页面多为静态界面,如果希望构建一个动态的,有交互的界面,就需要引入‘状态’的概念。 一.基本概念 1.状态变量:被状态装饰器装饰的变量,状态变量值的改变或引起UI的渲染更新 2.常规变量:没有被状态…...
Linux CentOS 7系统如何修改panel 重新打开最小化的界面/软件/程序
CentOS 7系统下,部分用户可能一开始打开界面没有类似Windows的下方菜单栏,只有一个浮动的panel。一旦打开软件,然后点击最小化后,找不到重新打开的方法。 右键panel,点击Add New Items… 选择以下三个基本就可以了&am…...
猫的眼睛有几种颜色?
在猫咪神秘而迷人的世界里,它们的眼睛犹如璀璨星辰,闪烁着各异的光芒,颜色丰富多样,令人着迷。 猫眼睛的颜色,粗略一数,常见的便有黄色、蓝色、绿色、棕色,还有那神秘的异瞳。这些色彩并非无端生…...
200道Java面试题(2025)
Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java …...
ros2笔记-2.5.3 多线程与回调函数
本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程:{threading.get_ident()} 开始下载:{…...
openwrt nginx UCI配置过程
openwrt 中nginx有2种配置方法,uci nginx uci /etc/config/nginx 如下: option uci_enable true‘ 如果是true就是使用UCI配置,如果 是false,就要使用/etc/nginx/nginx.conf,一般不要修改。 如果用UCI,其…...
【数据结构】双向循环链表的使用
双向循环链表的使用 1.双向循环链表节点设计2.初始化双向循环链表-->定义结构体变量 创建头节点(1)示例代码:(2)图示 3.双向循环链表节点头插(1)示例代码:(2ÿ…...
《Python游戏编程入门》注-第9章8
2 游戏信息的显示 在游戏窗口的上部会显示游戏分数、游戏关卡、剩余砖块数以及剩余小球数等信息,如图12所示。 图12 游戏信息显示 使用如图13所示的代码实现以上功能。 图13 显示游戏信息的代码 其中,print_text()函数MyLibrary....
起重机检测数据集VOC+YOLO格式2316张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2316 标注数量(xml文件个数):2316 标注数量(txt文件个数):2316 …...
20250106面试
rabbitmq如何保证消息不丢失 my: 持久化,包括消息持久化和队列持久化,重启不丢失。持久化到磁盘中的。 消息确认 死信队列:消费失败(业务异常/未确认,重试后,会放死信队列)&…...
【大数据】(选修)实验4 安装熟悉HBase数据库并实践
实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…...
使用Python类库pandas操作Excel表格
Date: 2025.01.02 20:33:30 author: lijianzhan 简述:pandas 是处理 Excel 文件的强大工具,它提供了简单易用的接口来读取、操作和写入 Excel 数据。以下是使用 pandas 处理 Excel 文件的详细指南,包括常见操作和示例代码。 安装依赖,pandas …...
【银河麒麟高级服务器操作系统】服务器异常重启故障分析及处理建议
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…...
香橙派5plus单独编译并安装linux内核无法启动的原因分析与解决记录
1 说明 我依照官方手册编译单独编译linux内核,安装后重启出现内核启动失败的问题,编译和安装步骤如下:# 1. 克隆源码 git clone --depth1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi# 2 配置源码 make rockchip_linu…...
iOS - 消息机制
1. 基本数据结构 // 方法结构 struct method_t {SEL name; // 方法名const char *types; // 类型编码IMP imp; // 方法实现 };// 类结构 struct objc_class {Class isa;Class superclass;cache_t cache; // 方法缓存class_data_bits_t bits; // 类的方法…...
ChatGPT 是通用人工智能吗
ChatGPT 目前并不是通用人工智能(AGI, Artificial General Intelligence)。它是一种专用人工智能(Narrow AI),具体来说是一种基于大规模语言模型(如 GPT-4)的生成式人工智能,专注于处…...
Bash语言的函数实现
Bash语言的函数实现 引言 Bash(Bourne Again SHell)是一种在Unix和类Unix系统中广泛使用的命令行解释器。它不仅作为命令行工具使用,同时也被广泛应用于自动化脚本的编写。通过Bash,用户可以创建复杂的脚本,以执行一…...
Haskell语言的多线程编程
Haskell语言的多线程编程 在现代计算机科学中,多线程编程已经成为了提升程序性能的一个重要手段。尤其在我们处理计算密集型任务或 I/O 密集型任务时,合理地利用多核 CPU 的能力可以显著提升程序的执行效率。Haskell作为一种纯函数式编程语言࿰…...
Unity的四种数据持久化方式
目录 什么是数据持久化 数据持久化之PlayerPrefs 概述 API及用法 电脑中存放的位置 优缺点 主要用处 封装PlayerPrefs 数据持久化之XML XML是什么 读取XML信息 C#读取XML的方法有几种 读取xml文件信息 读取元素和属性信息 总结 写入XML信息 选择存储目录 存储…...
“霍普夫分岔”理论
庞加莱-安德罗诺夫-霍普夫分岔理论,通称为“霍普夫分岔”理论1,是首先由庞加莱在1892年对平面系统进行研究的2,然后由亚历山大安德罗诺夫(Aleksandr Andronov,1901-1952)及其合作者在1930年进行了完善和细化…...
10-C语言项目池
C语言项目池 《个人通讯录》 《火车订票系统》 管理员用户1录入火车票信息区间查询/购票2显示火车票信息打印购票信息3查询火车票信息退票4修改火车票信息5添加火车票信息 《学生学籍管理系统》 1录入学生信息2添加学生信息3显示学生信息4查找学生信息5删除学生信息6修改学…...
03、MySQL安全管理和特性解析(DBA运维专用)
03、MySQL安全管理和特性解析 本节主要讲MySQL的安全管理、角色使用、特定场景下的数据库对象、各版本特性以及存储引擎 目录 03、MySQL安全管理和特性解析 1、 用户和权限管理 2、 MySQL角色管理 3、 MySQL密码管理 4、 用户资源限制 5、 忘记root密码处理办法 6、 SQ…...
Ubuntu 下测试 NVME SSD 的读写速度
在 Ubuntu 系统下,测试 NVME SSD 的读写速度,有好多种方法,常用的有如下几种: 1. Gnome-disks Gnome-disks(也称为“Disks”)是 GNOME 桌面环境中的磁盘管理工具,有图形界面,是测试…...
C++编程进阶:标准库中的迭代器库解析
1. 迭代器库介绍 本文主要聚焦于C++的迭代器库,涵盖了迭代器的概念、分类、相关类型、原语操作、定制点、算法概念与实用工具、适配器、流迭代器、操作以及范围访问等内容,为C++编程中迭代器的使用提供了全面的参考。迭代器是一种抽象概念,它允许以统一的方式处理不同的数据…...
深入解析 JDK Lock:为什么必须在同一线程加锁和解锁?
前言 在多线程编程中,锁是一种常用的机制,用于控制对共享资源的访问,防止竞态条件的出现。Java 中的 Lock 接口提供了比 synchronized 关键字更灵活的锁机制。我们通常会使用 Lock 来确保同一时刻只有一个线程能访问某个共享资源。但是&#…...
下载b站高清视频
需要使用的edge上的一个扩展插件,所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站,登录自己账号(登录后才能下载到高清!!)。打开一个视频,选择自…...
采用标准化的方式开展设计-研发中运用设计模式
概述 实现规范化、标准化的引导式设计,以业务需求为输入,识别业务特点,并通过引导式设计,找到最适合的设计模式、具体方案,汇总成为应用的设计,拉齐各应用的设计一的致性。 采用标准化的方式开展设计…...
粒子的动力学和约束
本文先介绍单粒子的力学(mechanics of a particle),然后再介绍粒子系的力学(mechanics of particle system),最后介绍约束(constraints)。 1. 单粒子的动力学 从原点出发有一个失径,记为 r \bm{r} r,速度矢量记为 v \bm{v} v,则: v = d r d t ( 1.1 ) \bm{v} = \frac{…...
PCL点云库入门——PCL库点云特征之PFH点特征直方图(Point Feature Histograms -PHF)
1、算法原理 PFH点(Point Feature Histogram)特征直方图的原理涉及利用参数化查询点与邻域点之间的空间差异,并构建一个多维直方图以捕捉点的k邻域几何属性。这个高维超空间为特征表示提供了一个可度量的信息空间,对于点云对应曲面…...
基于vue的商城小程序的毕业设计与实现(源码及报告)
环境搭建 ☞☞☞ Vue入手篇(一),防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示:页面顶部设有用户头像和昵称展示区,方便用户识别…...