源码学习
文章平均质量分 87
源码学习
Hehuyi_In
这个作者很懒,什么都没留下…
展开
-
由PG序列监控,看三种列自增方式
PG SEQUENCE、SERIAL 和 IDENTITY的相似和不同原创 2024-03-09 12:19:23 · 2301 阅读 · 1 评论 -
延迟恢复了? pg重启后pg_stat_replication中的延迟信息会如何变化?
之前重启数据库时遇到一个问题,本来主从间有超过2小时的延迟,重启db后监控突然提示延迟为0,告警恢复。一段时间后,监控又显示延迟逐渐增加,直至逐渐回到2小时。这是为什么?原创 2024-02-14 22:01:42 · 1728 阅读 · 1 评论 -
PG fast模式停库 在归档过慢及有发送延迟 会被阻塞
尝试停库时遇到的两个现象:当archiver process仍有.ready文件待处理时,执行fast模式执行stop时,必须等其处理完当walsender进程仍有wal日志未发送至从库时,必须等其发送完转载 2024-02-12 21:30:12 · 1143 阅读 · 0 评论 -
postgresql 手动清理wal日志的101个坑
新年的第一天,总结下去年遇到的关于WAL日志清理的101个坑,以及如何相对安全地进行清理。前面是关于WAL日志堆积的原因分析,清理相关可以直接看第三部分。原创 2024-02-10 23:12:42 · 3161 阅读 · 2 评论 -
从 “template1“ is being accessed 报错,看PG数据库的创建过程
报错原因、解决方法、以及PG数据库的创建过程到底会干些什么?原创 2023-12-13 18:01:29 · 2690 阅读 · 2 评论 -
PostgreSQL日志中的SQL记录时机 —— log_statement 和 log_min_duration_statement
log_statement 和 log_min_duration_statement 的作用及注意事项、源码学习原创 2023-11-28 21:05:11 · 3209 阅读 · 1 评论 -
PostgreSQL create or replace view和重建视图 有什么区别?
遇到开发提了个问题,create or replace view和重建视图(drop+create)有什么区别,查询资料整理了一下。replace后不影响权限和依赖于该视图的对象。来看看replace操作到底在干些啥 ˇˍˇ。原创 2023-11-22 19:51:54 · 2082 阅读 · 0 评论 -
定位postgresql中疯狂执行DML的表&原理学习
定位一段时间内DML量最大的表,并稍微改动监控每天表变化量。另外,也通过源码学习学习相关字段究竟是从何获取的。原创 2023-08-15 21:41:51 · 1912 阅读 · 1 评论 -
记一次空间告警与pg_rman keep-data-days参数研究
keep-data-days参数明明只设置了1,为什么本地会出现3份备份(保留了3天的备份)?原创 2023-08-09 22:39:13 · 2056 阅读 · 0 评论 -
postgresql源码学习(58)—— 删除or重命名WAL日志?这是一个问题
最近因为WAL日志重命名踩到大坑,一直很纠结WAL日志在什么情况下会被删除,什么情况下会被重命名,钻研一下这个部分。首先无用WAL日志的清理发生检查点执行时,检查点执行核心函数为CreateCheckPoint。其中核心调用栈为CreateCheckPoint函数很复杂,从外往里看会很容易晕,所以我们倒过来,先从最内层的RemoveXlogFile开始研究。因为debug跑了很多次,后文各日志段号等不会完全一致,但本质是相同的。注意这个跟踪属于高危操作,db进程有可能挂掉,千万别在生产环境随便执行。原创 2023-07-22 23:20:08 · 2423 阅读 · 0 评论 -
postgresql源码学习(57)—— pg中的四种动态库加载方法
pg中四种动态库加载方法及源码学习原创 2023-06-24 12:57:52 · 2711 阅读 · 0 评论 -
postgresql源码学习(56)—— explain是如何快速估算pg表行数的
但是这个字段的值需要收集统计信息后才有,如果统计信息过旧,也会不准确。但是注意不要EXPLAIN SELECT count(*),相差很大。如果没有统计信息或者比较旧了,又不想收集,可以使用explain。加::numeric是为了防止数字太大,变成科学计数法。为了方便获取预估值,可以将执行计划输出转为json格式。看到在完全没有统计信息的情况下,偏差大概在10%左右。,类似oracle的num_rows。收集之后,偏差明显减少。原创 2023-06-15 19:01:20 · 2362 阅读 · 0 评论 -
postgresql源码学习(55)—— 列中的NULL值是如何存储和判断的?
在pg元组头数据中,有一个t_bits数组,用于存储空值位图。当元组中没有null值的时候,t_bits可以被认为是空的,当元组有null值的列时,t_bits使用一个bit来表示列是否为null。可以看到,表中已删除列会被视为空列。当表中有许多列时,删除列将为每条记录生成额外的t_bit,这将导致存储膨胀。100000,注意实际存储的时候值是颠倒的,所以是000001。为了看t_bits数组更清晰,我们加多几列。10000,颠倒后为00001。,所以第一列非空,与实际一致。判断字段是否为空代码在。原创 2023-05-13 21:53:04 · 3234 阅读 · 1 评论 -
从无法创建的索引看 PostgreSQL的create index concurrently(CIC)过程
CREATE INDEX CONCURRENTLY (CIC)大概是DBA们最常用的语句之一,创建索引时只加4级锁,不阻塞DML。听上去非常美好,但在大事务、长事务较多的系统,可能被阻塞得一个中午也建不上一个索引。本篇就从这个无法创建的索引开始,学习CIC的过程、原理以及注意事项。原创 2023-04-04 22:53:31 · 2903 阅读 · 0 评论 -
postgresql源码学习(54)—— HotStandby从库必须设置大于等于主库的参数
HotStandby从库必须设置大于等于主库的参数原创 2023-01-28 11:38:44 · 1645 阅读 · 2 评论 -
postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数
lazy vacuum之table_relation_vacuum函数与heap_vacuum_rel函数原创 2023-01-23 21:54:17 · 1608 阅读 · 0 评论 -
postgresql源码学习(52)—— vacuum①-准备工作与主要流程
关于vacuum的基础知识,参考,本篇从源码层继续学习vacuum相关操作在vacuum.c中,当手动执行vacuum及analyze命令,其主入口为ExecVacuum()函数——主要负责为真正执行操作的vacuum()函数做一系列准备工作(语句解析、选项设置与检查、测试设置等),核心是调用vacuum()函数。原创 2023-01-22 17:26:47 · 2519 阅读 · 0 评论 -
postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数
提交日志CLOG 原理 用途 管理函数原创 2022-11-30 15:11:19 · 1505 阅读 · 0 评论 -
postgresql源码学习(50)—— 小白学习Dtrace追踪源码函数调用
业务任意执行的一条语句、出现了某些怪异的现象,如何能知道它究竟调用了pg中的哪些函数?而哪些函数是不符合我们预期的?Dtrace就能解决这个问题。原创 2022-11-26 16:39:25 · 1792 阅读 · 2 评论 -
postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断
cmin与cmax 同事务内的可见性判断原创 2022-11-20 23:02:23 · 1198 阅读 · 0 评论 -
postgresql源码学习(十九)—— MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数
回顾一下前面提到的SNAPSHOT_MVCC类型快照的可见性判断条件:原创 2022-10-16 11:08:06 · 1610 阅读 · 3 评论 -
postgresql源码学习(47)—— PostmasterMain(4) 启动数据库与主循环
以下代码也在postmaster.c文件中,可以看到这个函数其实就是启动了StartupProcess进程。|->BackendStartup() ConnFree() ConnCreate()原创 2022-10-08 21:44:40 · 1422 阅读 · 0 评论 -
postgresql源码学习(46)—— PostmasterMain(3) 监听套接字与客户端认证
调用load_hba()函数和load_ident()函数读取客户端认证文件pg_hba.conf和pg_ident.conf。原创 2022-10-05 21:22:52 · 1173 阅读 · 0 评论 -
postgresql源码学习(45)—— PostmasterMain(2) GUC参数简介及设置
对于解析到的每个参数及其参数值,调用SetConfigOption函数完成参数修改。GUC(Grand Unified Configuration)参数,其实指的就是pg中的各类参数。铺垫了这么多,终于又回到PostmasterMain函数上,我们接着上次的代码继续往下看。解析postmaster命令行参数,并用于设置GUC参数值。每种类型的GUC参数都有两部分组成:共性部分+特性部分。,如果一切合法,则将当前目录转入数据目录。,相同参数优先级更高的来源值会生效。数据库内核分析》第二章。原创 2022-10-03 21:48:23 · 2650 阅读 · 0 评论 -
postgresql源码学习(44)—— PostmasterMain(1) —— 内存初始化与信号处理函数设置
信号是os响应某些状况而产生的事件,它可以明确由一个进程发给另一个进程,用这种方法传递信息或协调操作。进程可以自定义信号处理函数来处理信号,pg就是充分利用了这一点。原创 2022-10-02 23:58:28 · 1836 阅读 · 0 评论 -
clickhouse 中 ReplicasMaxAbsoluteDelay 的计算
主要是调用该函数,并给absolute_delay和relative_delay变量赋值,这里我们只看absolute_delay。可以看到ReplicasMaxAbsoluteDelay的时间,随着告警发送的日期在增长,但是始终是52年左右。因此大致可以猜测这个值是currenttime减去unix起始时间的秒数,表示一个无穷大而不是真正的延迟。然后是主要的,执行getAbsoluteDelay函数,获取延迟值。52年前刚好是1970年,即unix的起始时间附近。原创 2022-09-30 18:44:34 · 1206 阅读 · 0 评论 -
postgresql源码学习(43)—— main函数主要流程
main函数的主要作用是确定当前操作系统平台,根据平台做一些环境变量和内存初始化,然后通过对postgres命令的参数解析,调用对应函数,进入对应流程。跟大多数程序一样,pg的入口函数也是main.c文件中的main函数。其中最核心的就是PostmasterMain程序,我们后面再看。《PostgreSQL数据库内核分析》第二章。原创 2022-09-21 00:23:29 · 1231 阅读 · 0 评论 -
postgresql源码学习(十五)—— 行锁③-死锁检测
假设等待图中有环,且环全部由实边构成,那么此时只能中断某个事务来打破这个环,这就是死锁。若环还有虚边,说明有事务尚未真正持有锁,此时还可以通过调整事务顺序来避免死锁。假设事务A持有表的共享锁,事务B申请表的排他锁被阻塞,事务C又想申请该表共享锁。此时事务C需要等待事务B,于是BC都在等待队列中,pg称这种等待的边为“虚边”。在查找环的过程中,它会优先从waitOrders数组中选择等待队列,如果没有,才会使用锁本身的等待队列。假设事务A持有表的共享锁或排它锁,当事务B申请表的排他锁时,就要进入等待。原创 2022-09-18 00:40:28 · 1334 阅读 · 0 评论 -
postgresql源码学习(十四)—— 行锁②-update操作与行锁
本篇以最简单的update操作为例,来看更新过程中的行锁添加、冲突检测、元组状态判断、可见性判断等。heapam_visibility.c 文件中)根据不同的元组状态,决定继续执行何种操作。例如元组是否能被更新取决于是否可见,不可见的元组显然是无需更新的。元组对当前快照根本不可见,自然无法处理。技术内幕:事务处理深度探索》第2章。元组被已提交事务更新过。元组被已提交事务删除过。函数内容如下(有删减)原创 2022-09-17 17:32:57 · 2019 阅读 · 0 评论 -
postgresql源码学习(42)—— 崩溃恢复④ - 日志应用
确定日志来源之后,就可以开始应用WAL日志。在Rmgr中,每种类型的WAL日志都有startup,redo,cleanup等函数,其中最重要的就是redo函数。以最常见的insert为例,假如每个事务执行了插入并提交,此时数据还在buffer没有落盘,恰逢数据库宕机。在db下次启动时,就会读取到XLOG_HEAP_INSERT类型的WAL记录(对应Rmgr类型为RM_HEAP_ID),因此会进入heap_redo函数(在heapam.c文件)。原创 2022-08-24 00:00:47 · 1415 阅读 · 0 评论 -
postgresql源码学习(41)—— 崩溃恢复③ - 日志来源
pg会根据当前状态确定初始日志源,当日志源读取发生错误,或者状态发生改变时,会切换到其他日志源。这个功能对应函数是 WaitForWALToBecomeAvailable(在xlog.c文件)前篇中获取到了恢复起点,即开始回放日志的位置,后面我们就可以开始读取并应用日志了。不过在此之前还有一个问题,从哪里获取WAL日志呢?用于在不同时段,从不同的日志源获取WAL日志。,对于不同的用途,也有不同的日志来源。技术内幕:事务处理深度探索》第4章。崩溃恢复、从库日志应用、)表示待应用日志的来源,原创 2022-08-23 23:41:41 · 1511 阅读 · 0 评论 -
postgresql源码学习(40)—— 崩溃恢复② - 恢复起点
从if (InRecovery) 部分开始,真正开始日志应用。首先会更新控制文件,说明当前进入了Recovery模式,并将读到的检查点信息也保存到控制文件。如果有backup_label文件,但又无法获取到检查点或者redo点信息,数据库启动会报错。通常,崩溃恢复的起点是最近一次检查点,这个位置保存在控制文件中。在之前创建检查点的函数中我们也看到,每次检查点创建时都会刷新控制文件中的信息。文件,如果该文件存在,则优先从该文件获取检查点信息,作为故障恢复起点。技术内幕:事务处理深度探索》第。原创 2022-08-20 00:21:46 · 1276 阅读 · 0 评论 -
postgresql源码学习(39)—— 崩溃恢复① - Startup进程的三大作用
如果数据库宕机或者服务器故障,缓存中的脏页可能尚未被刷入磁盘,磁盘中的数据处于不一致状态。在数据库重新启动时,需要借助WAL日志将数据库恢复到一致的状态。崩溃恢复的核心进程是Startup进程,核心函数是StartupXLOG函数,它在pg启动时就会被调用,读取配置信息,应用WAL日志。下一篇,我们正式学习StartupXLOG函数,看不同场景下如何进行日志应用。《PostgreSQL技术内幕:事务处理深度探索》第4章。大功能——崩溃恢复、从库日志应用、(基于时间点的恢复)。日志应用都是分不开的。...原创 2022-08-14 12:18:17 · 1938 阅读 · 0 评论 -
postgresql源码学习(38)—— 备份还原② - do_pg_stop_backup函数
在执行pg_start_backup函数开启备份模式后,务必要执行pg_stop_backup函数结束备份 (详细参考下方源码)。确保如果PG_ENSURE_ERROR_CLEANUP中的代码运行失败,则将排他备份状态改回运行中。在源码中,pg_stop_backup实际对应的是do_pg_stop_backup函数。三、 pg_stop_backup_callback。二、 do_pg_stop_backup。技术内幕:事务处理深度探索》第。......原创 2022-08-13 16:29:00 · 1918 阅读 · 0 评论 -
postgresql源码学习(37)—— 备份还原① - do_pg_start_backup函数
关于pg备份的基础知识,参考 https://blog.csdn.net/Hehuyi_In/article/details/102641959pg的备份本质是是通过直接复制磁盘数据实现的,在全页写机制的文章中我们提到过,这可能会导致数据不一致。因此,在复制数据前必须做一些准备工作。pg_start_backup函数进行创建基础备份的准备工作(详细参考下方源码)。注意这里指的是pg中pg_start_backup函数的参数,而不是源码中的函数参数。非排他备份。......原创 2022-08-13 16:19:53 · 1922 阅读 · 0 评论 -
postgresql源码学习(36)—— 事务日志11 - 日志归档
上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......原创 2022-08-09 23:26:03 · 3748 阅读 · 0 评论 -
postgresql源码学习(35)—— 检查点⑤-检查点中的XLog清理机制
前篇我们提到,检查点的工作之一是删除无用的日志文件,本篇我们来看看其中具体的计算和删除函数。前文中相关代码如下(在6. 删除无用的日志文件):postgresql源码学习(32)—— 检查点④-核心函数CreateCheckPoint_Hehuyi_In的博客-CSDN博客主要函数和宏定义如下 估算两次checkpoint之间产生的xlog量,主要用于后面XLOGfileslop函数的日志预分配。 如果上次估算量比这次实际产生的要小,则将估算值更新为这次产生的量。否则,按照原创 2022-08-07 12:30:47 · 2481 阅读 · 2 评论 -
postgresql源码学习(34)—— 事务日志⑩ - 全页写机制
前几天看了阿里云关于全页写的直播,打算重新再整理下关于全页写的内容。原创 2022-07-30 18:01:53 · 1889 阅读 · 0 评论 -
postgresql源码学习(33)—— 事务日志⑨ - 从insert记录看日志写入整体流程
前面我们分开看了每一个步骤的具体函数,这里再通过一个简单insert语句的跟踪,来看看整体的流程。目前只看WAL相关的部分,因为insert整体涉及到非常多东西,有些是还没学习到的。原创 2022-07-30 15:06:33 · 1738 阅读 · 0 评论 -
postgresql源码学习(32)—— 检查点④-核心函数CreateCheckPoint
检查点④-核心函数CreateCheckPoint原创 2022-07-23 21:35:09 · 1907 阅读 · 0 评论