postgresql编译安装与调试(一)

因为最近组里的项目和postgresql有关,并且需要查看和调试源码,所以专门学习了一下如何安装和调试postgresql,此博文用来记录自己的安装和调试过程。安装环境是CentOS6(CentOS7可能稍微有点不一样,不过大体上是一样的),调试工具是gdb。

既然是希望后期能够调试和跟踪源码,我们选择从源码编译安装。我们首先从官网取Source,官网在这里:

https://www.postgresql.org/ftp/source/

在这里你可以看到发布的所有postgresql版本,我取的是postgresql9.5.4这个版本,其他版本的编译流程也是类似的,大家随意,这里不赘述了。

取到source后,准备开始编译安装。

这里需要注意的postgresql编译需要预装一些工具。除了make、gcc(GNU编译器套件)这些基本必备的工具,还要有zlib、bison(一个YACC语法分析生成器的GNU实现)、readline等等。。。。太多记不住?

没关系,我们先进去编译,遇到缺少的包,会提示你缺少相应的包,再安装上即可。

取到源码 我们先解压:tar -zxvf postgresql-9.5.4.tar.gz

postgresql编译安装与调试(一)

cd postgresql-9.5.4 进去

postgresql编译安装与调试(一)

这里要注意的是,由于我希望后面能跟踪代码的运行路径,所以我要在编译configure的时候加上--enable-debug的选项,并且修改src/Makefile.global文件:

CFLAGS = -O2 -Wall -Wmissing-prototypes -Wpointer-arith \
-Wdeclaration-after-statement -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv

把上面的"-O2"选项删除,然后加上"-g" 如下所示:

CFLAGS = -g -Wall -Wmissing-prototypes -Wpointer-arith \
-Wdeclaration-after-statement -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv

为什么要这么做呢?因为"-O2"是编译器的优化选项,如果打开了,代码的执行顺序会改变,使得追踪起代码来比较困难。当然去除了优化选项,编译后的可执行文件会比较大,而且会比较慢,所以不太适合生产环境。所以切记这个操作仅仅是在学习的时候而设置的。

不想修改文件的话,也可以先这样做:

export CFLAGS = "-g -Wall -Wmissing-prototypes -Wpointer-arith \
-Wdeclaration-after-statement -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv"

postgresql编译安装与调试(一)

然后输入如下命令:

./configure --prefix=/opt/psql --with-perl --with-tcl --with-python --with-openssl 
--with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety
--with-wal-blocksize= --with-blocksize= --enable-dtrace --enable-debug

其中--prefix是指定软件的安装路径,--with选项是指安装本文件依赖的库文件。如有不清楚可以自己学习下configure命令的相关参数。

运行之后,显示如下错误:

postgresql编译安装与调试(一)

果然 缺少了dtrace,没关系,我们使用yum命令:

postgresql编译安装与调试(一)

找到了,我的机器是64位的,所以果断选择第二个:

使用yum命令(当然其实也可以用rpm命令,但是yum命令自己就可以解决各种包之间的依赖问题,所以推荐yum命令)安装:

yum install -y systemtap-sdt-devel.x86_64

postgresql编译安装与调试(一)

安装成功!

然后继续运行configure命令,遇到其他包的问题类似上面的处理,这里就不赘述了。

当然,对于伸手党们,下面的这个链接可供参考:

http://blog.csdn.net/luojinbai/article/details/44217551

运行上面的configure命令后,如果显示如下的画面那就是成功了。

postgresql编译安装与调试(一)

然后再运行make命令,耐心等待一会,make会需要几分钟时间。

postgresql编译安装与调试(一)

这样之后就可以make install命令了

postgresql编译安装与调试(一)

make install也OK了!

然后你就会发现在/opt/目录下找到你安装的psql了

其中:

/opt/psql/bin里面放的是可执行命令,比如createdb之类的;

/opt/psql/lib里面放的是库文件;

/opt/psql/include里面放的是头文件;

/opt/psql/share是相关的资源文件。

这些文件如果在configure命令中没有指定--prefix的话,会安装到/usr/local/目录下,以后要删除的时候就要一个个找了,比较麻烦。

好的 我们安装好了postgresql程序,接下来进行配置。

为了安全考虑,postgresql不允许使用root用户操作数据库,我们在系统中为使用postgresql添加一个用户postgres:

postgresql编译安装与调试(一)

并创建密码:

postgresql编译安装与调试(一)

然后我们切换到postgres用户下(切记是 su - ,“-”不可少):

postgresql编译安装与调试(一)

编辑/home/postgres下的.bash_profile

设置以下的环境变量

export PGHOME=/opt/psql  (这个就是我们的安装目录)

export PGDATA=~/data        (数据存放的目录,这个看你高兴了,不要求一定放在这里)

export PATH=$PATH:$HOME/bin:$PGHOME/bin

然后source一下

source  ~/.bash_profile

使环境变量生效。

接下来初始化数据库,使用initdb命令(如果提示command not found,那么很有可能是你上面的PGHOME设置错误或者没有source一下)

然后会有以下显示:

postgresql编译安装与调试(一)

数据库的初始化完成!

然后运行

pg_ctl start

启动postgres数据库实例。此时你就可以使用

ps -ef | grep postgres

看到postgresql进程了。

现在我们可以进入数据库,使用如下命令:

psql -h 127.0.0.1 -d postgres -U postgres

postgresql编译安装与调试(一)

当然,如果是进入本机的和用户名同名的数据库,直接psql即可,具体解释可查看postgresql官方手册。

如果我们比较懒,不想每次登录手动启动psql,那么设置下psql开机启动。

PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下:

postgresql编译安装与调试(一)

linux文件即为自启动脚本。

1)修改linux文件属性,添加X属性(这里如果提示无权限的话,切换到root用户进行操作)

[root@localhost start-scripts]# chmod a+x linux

2) 复制linux文件到/etc/init.d目录下,更名为postgresql

[root@localhost start-scripts]# cp linux /etc/init.d/postgresql

3)修改/etc/init.d/postgresql文件的两个变量

prefix设置为postgresql的安装路径:/opt/psql

PGDATA设置为postgresql的数据目录路径:/home/postgres/data

执行service postgresql start,就可以启动PostgreSQL服务

4) 执行service postgresql start,就可以启动PostgreSQL服务

[root@localhost start-scripts]# service postgresql start

5)设置postgresql服务开机自启动

[root@localhost start-scripts]# chkconfig --add postgresql

执行上面的命令,就可以实现postgresql服务的开机自启动。

这次就先写这么多,第二部分再介绍下postgresql的代码结构和调试方法。

上一篇:Android 之 Shape (圆角输入框)


下一篇:Windows如何使用Apache的ab工具进行网站性能测试(Apache服务器自带了ab压力测试工具,可以用来测试网站性能,使用简单方便)