yzs87
专注于PostgreSQL、MySQL、GreenPlum及其生态
展开
-
Wal receiver进程描述结构
WalReceiver进程的描述结构WalRcvData,仅当作记录typedef struct{ pid_t pid;//当前walreciver进程的pid WalRcvState walRcvState;//标记进程状态 pg_time_t startTime;//RequestXLogStream函数调用的开始时间 //startup...原创 2022-07-11 22:02:26 · 236 阅读 · 0 评论 -
GP/PG从MinimalTuple转换TupleTableSlot需要理解的数据结构
比如在排序中,待排序的结构SortTuple中存储的是MinimalTupleData,里面包含有排序需要的值等信息。排好序后,需要将MinimalTupleData再此转换成TupleTableSlot。转换由函数tts_minimal_store_tuple完成,可以看到MinimalTupleData并没有解析,而是直接放到了MinimalTupleTableSlo......原创 2022-06-06 23:36:28 · 243 阅读 · 0 评论 -
postgresql email列表对NVM WAL BUFFER的讨论
本文介绍NVM WAL BUFFER的email list,详细了解开发者对此的讨论,以此深入了解机制。1、Heikki使用mmap()/msync()映射WAL文件,替代WAL bu...原创 2020-12-29 23:29:23 · 677 阅读 · 0 评论 -
NVM WAL BUFFER邮件讨论
本文介绍NVM WAL BUFFER的email list,详细了解开发者对此的讨论,以此深入了解机制。1、Heikki 使用mmap()/msync()映射WAL文件,替代WAL buffer。如果读memory-mapped文件有IO错误时,进程会通过SIGBUS杀掉。重新阅读了[1][2],使用WAL段文件映射到内存作为WAL BUFFER,依赖于WAL文件是否放在PM上切换CPU指令或者msync()用于持久化WAL记录。听起来挺合理,但是我没测试过。我会尝试与NVM WA...翻译 2020-12-29 23:19:34 · 378 阅读 · 0 评论 -
PostgreSQL问题分析1:requested timeline %u does not contain minimum recovery point %X/%X on timeline %u
一、问题:requested timeline %u does not contain minimum recovery point %X/%X on timeline %u该日志在代码中的位置如下:StartupXLOG: if (!XLogRecPtrIsInvalid(ControlFile->minRecoveryPoint) && tliOfP...原创 2018-12-12 21:01:35 · 866 阅读 · 0 评论 -
PostgreSQL pg_rewind原理
一、背景常见的高可用架构中,如果master挂了且有数据没有同步到备,高可用系统会提升备为主对外服务。对于老主有可能再以备的身份加入集群时,可能搭建流复制关系失败。可以用pg_rewind工具使主备的数据一致。二、pg_rewind原理三、相关代码1、每个文件(目录)的差异被记录在结构体 file_entry_t 中,其定义如下typedef struct file_ent...原创 2018-12-23 19:54:03 · 1678 阅读 · 0 评论 -
PostgreSQL何时执行checkpoint--发送checkpoint信号的函数
RequestCheckpoint(int flags): /* 1、如果checkpoint进程没有起来,则尝试20次大概2s 2、通过kill命令向checkpoint进程发送信号,通知做checkpoint,发送成功则退出循环,否则也尝试20次 */ for (ntries = 0;; ntries++){ if (CheckpointerShmem->checkpoi...原创 2019-01-01 19:39:43 · 740 阅读 · 0 评论 -
PostgreSQL存储引擎之heap tuple结构
struct HeapTupleHeaderData{ union { HeapTupleFields t_heap; DatumTupleFields t_datum; }t_choice; ItemPointerData t_ctid;//block号及item 号 uint16 t_infomask2; /* number of attributes + vari...原创 2018-11-18 09:14:20 · 3374 阅读 · 2 评论 -
PostgreSQL pg_ctl start超时分析
一、问题pg_ctl start启动时报错退出:pg_ctl:server did not start in time。超时时间是多少?从什么时候到哪个阶段算超时?二、分析:该信息打印位置,从后面代码段do_start函数中可以看出1、pg_ctl start调用start_postmaster启动PG的主进程后,每隔0.1ms检查一次postmaster.pid文件,是否已写入rea...原创 2019-01-25 20:59:02 · 2092 阅读 · 1 评论 -
openGauss向量化引擎--hash join
openGauss向量化引擎--hash join传统的行执行器采用一次一个元组的执行模式,执行过程中CPU大部分时间没有用了处理数据,都用在了遍历执行树等操作,导致CPU的有效利用率较低...原创 2022-01-09 22:22:37 · 425 阅读 · 0 评论 -
Windows环境下安装PostgreSQL
Windows环境下安装PostgreSQL学习PG的同学自己环境一般都是windows环境,那么如何在windows环境上运行PG呢?首先需要下载PG的windows版本,有二进制版本和...原创 2022-02-12 23:26:45 · 1888 阅读 · 0 评论 -
PG avg聚合操作如何将值返回给客户端
我们执行avg聚合操作时,会得到一个浮点数值。例如:简单avg聚合操作分为2步:首先计算出和值及元组个数;然后将和值与元组个数相除。1)第一步计算函数是int4_avg_accum:可以看...原创 2022-03-02 21:24:20 · 381 阅读 · 0 评论 -
GreenPlum7/PG12中如何添加一个自定义内置函数
首先看下GP7内置函数处理机制:GP7的内置函数机制和GP6稍有不同。其中内置函数元数据信息来自pg_proc.dat。pg_proc.dat中是什么东西呢?......例如加法的函数in...原创 2022-03-11 21:55:43 · 296 阅读 · 0 评论 -
pg_basebackup原理解析
pg_basebackup介绍pg_basebackup提供一个全量备份。常用来搭建流复制环境。属于物理备份。逻辑备份工具时pg_dump。参数说明:-D:--pgdata=DIRECTO...原创 2021-05-28 21:33:11 · 1081 阅读 · 0 评论 -
PG明明业务进行的是SELECT,为什么监控磁盘,写负载那么大呢?
问题进行测试时,预制完数据后立即进行SELECT测试查询场景,或者预制完数据立即重启服务,然后进行SELECT场景测试,监控磁盘负载时,发现写负载特别大。这就有疑惑了,测试场景都是查询,没...原创 2021-04-10 22:05:09 · 349 阅读 · 0 评论 -
PostgreSQL事务提交日志与CLOG操作初步认识
1、CLOG脏页在checkpoint时刷写CreateCheckPoint->CheckPointGuts->CheckPointCLOG SimpleLruFlush(...原创 2021-03-29 00:00:00 · 750 阅读 · 0 评论 -
ReadBuffer_common读取页通用函数
1、先通过BufferAlloc函数进行搜索,若在共享内存中数据页的哈希表找到,则直接返回其页描述符,否则分配一个页描述符,并向hash表插入对应一个entry。found表示是否在换成命...原创 2021-03-07 21:16:21 · 440 阅读 · 0 评论 -
PG通过表访问方法API如何执行顺序扫描
PG通过表访问方法API如何执行顺序扫描引言PG中有很多方法检索数据并返回给用户。依赖于用户的SQL语句,查询计划模块生成最有方法以检索请求的数据。顺序扫描是用户请求大量数据时或者当表没...翻译 2021-01-20 21:38:33 · 318 阅读 · 0 评论 -
列存zedstore
邮件列表1、动机与目标1)列子集查询性能提升(减小IO)2)相对于heap表,减小磁盘占用空间。Tuple头更小,利用压缩数据3)表数据可以列式存储形式独立于表数据4)完全符合MVCC5...翻译 2020-06-27 20:51:10 · 416 阅读 · 0 评论 -
PostgreSQL文件扩展机制
扩展的底层函数为mdextend。先通过_mdfd_getseg获取指定页号的段文件描述符,然后根据页号计算出偏移,向该偏移出写入一页:大部分情况写入一页0来进行扩展。 ...原创 2020-06-10 22:57:49 · 462 阅读 · 0 评论 -
同步复制注意点
同步复制情况下,先刷写日志,然后记录clog并持久化,最后才等待备机接收日志后返回的ACK,如果备机有问题的话或复制链路异常,日志传输失败,此时用户客户端的commit会挂...原创 2020-06-07 18:22:44 · 348 阅读 · 0 评论 -
WAL文件回收
checkpoint执行大致分为四步:1)刷写脏页,即将整个share buffer的所有脏页都刷盘;2)生成checkpoint wal记录,并插入WAL BUFFER;3)将checkpoint前的所有wal全部刷盘;4)回收WAL文件。这里主要介绍回收文件时需要注意的一点。尤其是磁盘空间比较紧张的场景下。 本文介绍WAL文件回收时,需要注意的一个点。回收由函数Rem...原创 2020-04-25 19:35:19 · 507 阅读 · 0 评论 -
PostgreSQL VACUUM可见性
分两种情况,一是XMIN事务未提交,一个是xmin事务已提交。针对xmin未提交的事务,即当前的tuple刚insert还未提交:1)元组不合法,即坏元组时,返回HEAPTUPLE_DEAD2)该tuple是当前事务产生的:此时这个记录在这个事务未删除或只是被锁住或进行了delete但是delete abort了,那返回HAPTUPLE_INSERT_IN_PROGRESS;若则记...原创 2020-03-27 22:43:05 · 566 阅读 · 0 评论 -
PostgreSQL MVCC可见性判断
1、知识准备1)Tuple格式头HeapTupleHeaderDatatypedef struct HeapTupleFields{ TransactionId t_xmin; /* inserting xact ID */ TransactionId t_xmax; /* deleting or locking xact ID */ union{ ...原创 2020-03-12 21:40:42 · 1546 阅读 · 0 评论 -
PostgreSQL如何在页面内找一个free slot
本文介绍向业内插入一条记录时,如何找一个空闲的空间进行插入。PageAddItemExtended1、计算出pd_linp数组的最大值后新增一个后的个数:limit=[pg_lower-...原创 2020-02-24 20:53:52 · 745 阅读 · 0 评论 -
PostgreSQL DDL操作解析
本文介绍PG DDL操作上层接口。1、DDL操作的入口函数是ExecModifyTable,insert、delete、update都会进入这个函数,如果为insert,执行ExecPr...原创 2020-02-25 19:25:44 · 2113 阅读 · 0 评论 -
PostgreSQL的insert解析
其insert由函数heapam_tuple_insert完成。1、首先需要从slot中取出tuple值,HeapTupleTableSlot.tuple2、从relation中得到该记录即将插入表的OID:relation->rd_id,然后slot->tts_tableOid和tuple->t_tableOid更新为该OID3、调用heap_insert将tu...原创 2020-02-24 22:11:39 · 2138 阅读 · 0 评论 -
PostgreSQL表扫描方法解析
本文介绍PG的表扫描方法原理。全表扫描函数在heap handler API接口函数为heap_getnextslot函数。该函数从磁盘读取数据页到内存并遍历页内记录,将其存储到slot中返回用户。这个函数一次只获取一个记录,倒到上次ExecutePlan函数中循环调用ExecProcNode再次进入该函数获取下一个记录,依次类推,直到获得所有记录。...原创 2020-02-21 20:55:17 · 2209 阅读 · 0 评论 -
非易失性WAL buffer实现解析(六)
本文接上文接着介绍PreallocNonVolatileXlogBuffer的实现。1)需要将NVM WAL BUFFER初始化LSN到ControlFile->discarded...原创 2020-02-16 16:38:30 · 518 阅读 · 0 评论 -
CREATE TABLE ... WITH storage_parameter [= value] [, ... ]
创建表时,可以通过WITH子句指定storage_parameter,这个存储参数指什么?在代码中如何实现?1、storage_parameter参数说明参考:https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS2、代码中如何实现?在Relatio...原创 2020-02-04 00:00:00 · 1385 阅读 · 0 评论 -
PG11新特性解读:新增非空默认值字段不需要重写表-原理
本文对原理进行解读原创 2020-02-03 15:30:26 · 808 阅读 · 0 评论 -
非易失性WAL buffer
今天看到PG邮件列表里有非易失性内存在PG应用的讨论,做下记录,接着学习其补丁,如何将WAL buffer改造成非易失性buffer,以及和之前有和区别。该补丁是也是日本NTT公司提供。一、原文https://www.postgresql.org/message-id/002f01d5d28d$23c01430$6b403c90$@hco.ntt.co.jp_1二、Non-volati...翻译 2020-01-30 16:28:10 · 597 阅读 · 0 评论 -
图解PostgreSQL12可拔插存储引擎--表及索引访问方法架构
原创 2020-01-10 21:43:21 · 819 阅读 · 0 评论 -
图解PostgreSQL-buffer管理(三)
本文介绍本地缓冲的管理。1、本地buffer的分配由函数LocalBufferAlloc来完成,用于临时表的读写。2、同样需要先初始化tag:newTag,唯一标记一个物理页3、第一次使用临时表时,需要通过calloc创建一系列缓冲区(InitLocalBuffers完成):几个数组,大小为num_temp_buffers,即该变量控制大小。LocalBufferDescri...原创 2020-01-03 22:32:59 · 806 阅读 · 0 评论 -
图解PostgreSQL--buffer的分配
一、数据结构Buffer由数组BufferDescriptor[]数组进行管理。该数组由函数InitBufferPool创建,大小为NBuffers个成员即BufferDesc。该数组创建后由StrategyControl进行管理,firstFreeBuffer为链表头,指向链表第一个成员;lastFreeBuffer指向链表尾;所有free list中成员由freeNext串起来,该值为...原创 2020-01-01 20:34:23 · 1050 阅读 · 0 评论 -
图解PostgreSQL-buffer管理(一)
通过两种方式管理buffer的描述符。1)free list链表;2)环形缓冲区。free list为StrategyControl,首节点为firstFreeBuffer,尾节点为lastFreeBuffer。通过freeNext连接,即为buffer描述符数组BufferDescriptors的下标。而环形缓冲区为strategy->buffers。strategy->c...原创 2019-12-22 22:09:57 · 968 阅读 · 0 评论 -
RDMA网络下重思数据库高可用
RDMA网络下重思数据库高可用摘要高可用数据库系统常常使用用数据复制来达到容错的目的。Active-passive和active-active复制算法都是严重依赖于时延,网络常常成为性能的主要瓶颈。从某种意义上说,这些技术旨在最小化副本之间的网络通信。然而,下一代网络的出现,以期高吞吐低延迟的特性,使得需要重视这些假设。首先提出,现代RDMA网络使得瓶颈转向CPU,因此现代网络优化的复...翻译 2019-12-14 22:03:24 · 585 阅读 · 0 评论 -
PostgreSQL 12的可拔插存储引擎--表访问方法以及bloackholes案例
正文PostgreSQL使用自定义插件做扩展时非常便利,例如Decoder plugins、extension、background workers、索引访问方法、hooks、自定义函数、聚合、数据类型等。对代码做了大量的重构后,PG12具备了表访问方法的基础架构,允许自定义表数据如何存储以及访问。默认情况下,PG的表还是使用heap存储引擎。他的工作原理是基于8KB的页面管理方式,...翻译 2019-11-15 22:01:29 · 1014 阅读 · 0 评论 -
NVM作为主存上对数据库管理系统的影响
NVM作为主存上对数据库管理系统的影响implications of non-volatile memory as primary storage for database management systems摘要传统的数据库管理系统使用磁盘存储关系型数据。硬盘的特点:廉价、持久性、大容量。然而,从磁盘进行读取数据代价非常高。为了消除这个延迟,需要DRAM作为中间媒介。DRAM的特点:...翻译 2019-11-01 20:40:25 · 707 阅读 · 0 评论 -
PostgreSQL用户密码如何通过md5加密存储,是否加了salt
一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。二、源码分析CreateRole: shadow_pass = encrypt_password(Password_encryption, stmt->role,password); |-- pg_md5_encrypt...原创 2019-03-08 20:29:29 · 2509 阅读 · 0 评论