Recent Posts

londiste3 copy table’ snapshot & PostgreSQL logical replication’s snapshot 不同之处

4 minute read

背景 PostgreSQL有物理复制,也有逻辑复制。 物理复制是持续的从XLOG读取block data在对应的物理文件实行recovery的过程。 建立物理备份的standby时,会强制开启一个检查点,然后拷贝数据文件,拷贝完后的数据库其实是不一致的,没有关系,只要从检查点开始的所有XLOG都在,就可以恢复...

PostgreSQL 回归测试

9 minute read

背景 回归测试是PostgreSQL的测试方法之一。 回归测试,需要事先定义好测试脚本(通常是SQL脚本,放在sql目录中),同时定义好调用执行测试脚本的预期正确输出文件(通常放在expected目录中)。 测试使用make check或make installcheck进行,它会通过pg_regress程序...

PostgreSQL src/Makefile.global中的小坑

less than 1 minute read

背景 在编译一个插件时发现PostgreSQL的src/Makefile.global可能有一些坑你会踩到, 我们来看看坑是什么? src/Makefile.global datadir := ${datarootdir} ifeq "$(findstring pgsql, $(datadir))" "...

PostgreSQL C代码覆盖率测试(gcov, lcov)

8 minute read

背景 通常我们评判一个test case好坏的标准之一是代码的覆盖率,一个好的test case应该覆盖到所有的代码。 那么问题来了,我们怎么知道这个test case有没有覆盖到所有的代码呢? 以C代码为例,我们看看如何检测代码覆盖率。其他语言自然有其他语言的代码覆盖测试工具,例如plpgsql: htt...

piggly, 一个plpgsql 代码覆盖测试工具

less than 1 minute read

背景 https://github.com/kputnam/piggly RUBY写的一个postgresql plpgsql函数代码覆盖测试框架,测试脚本不限语言,你可以用perl,python。。。来写测试脚本。 这个测试框架虽然是几年前写的,但值得学习。 digoal’s 大量PostgreS...

用PostgreSQL玩国际象棋

less than 1 minute read

背景 PG的玩家有点疯狂。看看PG怎么玩国际象棋吧。 http://pgxn.org/dist/pg2podg/ http://pgxn.org/dist/pgchess/ http://api.pgxn.org/dist/pg2podg/0.1.3/pg2podg-0.1.3.zip http://ap...

pg_clog的一致性 & 异步事务提交

6 minute read

背景 异步提交是指不需要等待事务对应的wal buffer fsync到磁盘,即返回,而且写CLOG时也不需要等待XLOG落盘。 而pg_clog和pg_xlog是两部分存储的,那么我们想一想,如果一个已提交事务的pg_clog已经落盘,而XLOG没有落盘,刚好此时数据库CRASH了。 数据库恢复时,由于该事...

pg_clog的原子操作与pg_subtrans(子事务)

7 minute read

背景 如果没有子事务,其实很容易保证pg_clog的原子操作,但是,如果加入了子事务并为子事务分配了XID,并且某些子事务XID和父事务的XID不在同一个CLOG PAGE时,保证事务一致性就涉及CLOG的原子写了。 PostgreSQL是通过2PC来实现CLOG的原子写的。 1. 首先将主事务以外的CLOG...

PostgreSQL pg_clog fsync 频率分析

17 minute read

背景 在前面介绍过PostgreSQL除了XLOG以外,还有一些操作是需要调用fsync的。 《除了xlog,哪些操作可能还需要fsync ?》 其中之一是pg_clog,本文主要分析一下pg_clog是在什么时候需要调用fsync的? 引用wiki里的一段pg_clog的介绍。 https://wiki...