因为最近组里的项目和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
cd postgresql-9.5.4 进去
这里要注意的是,由于我希望后面能跟踪代码的运行路径,所以我要在编译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"
然后输入如下命令:
./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=16 --with-blocksize=16 --enable-dtrace --enable-debug
其中--prefix是指定软件的安装路径,--with选项是指安装本文件依赖的库文件。如有不清楚可以自己学习下configure命令的相关参数。
运行之后,显示如下错误:
果然 缺少了dtrace,没关系,我们使用yum命令:
找到了,我的机器是64位的,所以果断选择第二个:
使用yum命令(当然其实也可以用rpm命令,但是yum命令自己就可以解决各种包之间的依赖问题,所以推荐yum命令)安装:
yum install -y systemtap-sdt-devel.x86_64
安装成功!
然后继续运行configure命令,遇到其他包的问题类似上面的处理,这里就不赘述了。
当然,对于伸手党们,下面的这个链接可供参考:
http://blog.csdn.net/luojinbai/article/details/44217551
运行上面的configure命令后,如果显示如下的画面那就是成功了。
然后再运行make命令,耐心等待一会,make会需要几分钟时间。
这样之后就可以make install命令了
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:
并创建密码:
然后我们切换到postgres用户下(切记是 su - ,“-”不可少):
编辑/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一下)
然后会有以下显示:
数据库的初始化完成!
然后运行
pg_ctl start
启动postgres数据库实例。此时你就可以使用
ps -ef | grep postgres
看到postgresql进程了。
现在我们可以进入数据库,使用如下命令:
psql -h 127.0.0.1 -d postgres -U postgres
当然,如果是进入本机的和用户名同名的数据库,直接psql即可,具体解释可查看postgresql官方手册。
如果我们比较懒,不想每次登录手动启动psql,那么设置下psql开机启动。
PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下:
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的代码结构和调试方法。