前言
在centos 7虚拟机环境下使用eclipse编译和测试postgresql-13.3
yum
1 | yum clean all # 清除缓存目录下的软件包及旧的header |
依赖安装
根据postgresql-13.3源码根目录下的INSTALL文件的描述,必须安装下述软件:
1 | - GNU make version 3.80 or newer is required; other make programs or |
GNU make version 3.80
我的centos 7中默认安装了GNU make version 3.82
1 | [root@localhost ~]# make --version |
Recent versions of GCC
centos 7的gcc版本是
1 | [root@localhost ~]# gcc -v |
因此,不需要再安装了。
tar, gzip, bzip2
已经安装好了
readline
已经安装好了
zlib
已经安装好了
1 | If you are building from a Git tree instead of using a released source |
Flex
Bison
eclipse helios安装
http://www.eclipse.org/downloads/packages/release/helios/sr2/eclipse-ide-cc-developers 这是下载安装包的网址。
configure
【2】【3】先创建安装目录,我在$HOME/Desktop文件里创建了postgres/13.3文件夹用于安装。
在解压的postgresql源码目录下执行命令:
1 | ./configure --prefix=$HOME/Desktop/postgres/13.3 --enable-depend --enable-cassert --enable-debug |
其中—prefix指定PostgreSQL要安装的目录 (这个目录可以任意指定,但是建议使用绝对路径,这样在后续开发过程中不会出现因路径问题而产生的一系列莫名其妙的问题) —enable-depend、 —enable-cassert及 —enable-debug对于开发来说是必须的,尤其是 —enable-debug如果要调试和开发PostgreSQL源码必须进行指定。
如果要调试方便,需要在configure后修改编译选项
找到src/Makefile.global文件,然后修改下述代码:
1 | CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O2 |
将-O2选项去掉,它是编译器优化选项,如果打开了,代码的执行顺序会变化,使得使用gdb追踪代码比较困难,gdb调试的时候打印变量值时会出现<value optimized out>。
编译
eclipse下编译
首先,在helios eclipse中的File->import中选择C/C++->Import Existing Code,然后填写如下表格。

点击NEXT,然后将“Existing Code Location”指向已经configure的postgreSQL源码的目录,具体见下面。然后等待编译完成。

最后在console中出现这个代码表示make成功。
1 | All of PostgreSQL successfully made. Ready to install. |
linux命令行编译
在postgresql源码根目录下执行:
1 | make |
安装
eclipse下安装

右击右边的Make Target下面的postgresql-13.3,然后点击New,出现一个窗口,按照下述方式填写。

点击OK,就会在Make Target下出现绿色的install选项,双击install进行安装。在console中出现下面的文字,表示安装成功。
1 | PostgreSQL installation complete. |
命令行安装
在postgresql根目录下执行命令:
1 | make install |
初始化
在$HOME//Desktop/postgres/13.3的bash中运行下述代码:
1 | export PATH=$HOME/Desktop/postgres/13.3/bin:$PATH |
注意,不能在root下执行上述代码,在普通用户中执行。
注意:上述环境变量的配置是暂时的,我在关机重启后就不能使用postgres的命令了;如果要永远改变,需要将变量放在~/.bash_profile文件中。
如果不想在环境变量中指定PGDATA,可以在initdb参数中指定。当然initdb可以指定很多参数:
1 | initdb $HOME/Documents/postgresql-13.3/DemoDir -X /mnt/pmem0/pg_wal |
启动和关闭
启动:
1 | pg_ctl -D /home/zhouhuahui/postgresql-13.3/data -l logfile start |
关闭:
1 | pg_ctl stop -m smart |
测试
查看我们创建的数据库
1 | psql -l -p 5432 # 如果不加-p选项,默认在5432端口启动服务器 |
创建数据库
1 | createdb mydb -p 5432 |
登录到数据库
1 | psql mydb |
首先运行数据库,然后使用下述命令查看进程
1 | ps x |
然后选择postgres程序的pid,比如是7426,使用gdb进行调试
1 | gdb |
这个时候可能会出现Missing seperate debuginfos的错误,参考问题/调试错误解决。
pgbench
参考《pgbench(postgresql压力测试工具)》:https://blog.csdn.net/qq_35651267/article/details/87969328
1 | createdb pgbench -p 5435 |
nvm: 1620,1592
disk: 1193, 1207
取消安装
在项目根目录下执行:
1 | make uninstall |
问题
yum命令错误
1 | Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast |
直接运行下述命令
1 | yum clean all |
configure错误
configure时出现:
1 | configure: error: readline library not found |
但是我已经安装了readline。根据博客的经验,【1】可能时缺少readline-devel,因此把它安装了试试。然后再测试,又出现zlib未安装的提示,因此安装了zlib-devel,这次成功了。
用户错误
当我要initdb时,发现postgres要求用户不是root,因此我切换到普通用户,然后将/root/Desktop目录下的eclipse安装目录,eclipse workspace目录以及postgres目录拷贝到/home/zhouhuahui/Desktop下。但是却发现,这些拷贝的文件夹都有锁。

通过chown命令可以给指定用户开锁。
1 | su |
调试错误
当使用gdb attach 7426命令对postgres进程进行调试时,出现:Missing seperate debuginfos: use debuginfo-install....的错误,这个可能是确收glib导致的。
首先,进入root用户:su
然后,修改/etc/yum.repos.d/CentOS-Debuginfo.repo文件:设置enable=1。
接着,yum install glibc
最后:debuginfo-install glibc
引用
【1】https://www.cnblogs.com/shuaixf/archive/2011/11/29/2268292.html
【2】https://blog.csdn.net/anzelin_ruc/article/details/8539411
【3】Postgres8源码分析_彭智勇