0.准备阶段
新增PG帐号,用于初始化、启动和关闭数据库
sudo groupadd postgres
sudo useradd -g postgres -m postgres
sudo passwd postgres
为postgres用户组指定sudo权限:
ll /etc/sudoers
sudo chmod 740 /etc/sudoers
ll /etc/sudoers
sudo vim /etc/sudoers
在%sudo处添加:
%postgres ALL=(ALL:ALL) ALL
将文件权限改回去:
sudo chmod 440 /etc/sudoers
使postgres用户的bash生效:
sudo vim /etc/passwd
修改postgres行:
postgres:x:1001:1001::/home/postgres:
为
postgres:x:1001:1001::/home/postgres:/bin/bash
创建数据库的数据目录并设置其权限:
sudo mkdir -p /db/pgdata
sudo chown -R postgres:postgres /db/pgdata
以postgres身份登录到Ubuntu。
1.下载并安装JDK
下载JDK(~/software):jdk-8u5-linux-i586.tar.gz
解压:
cd /opt
sudo mkdir jdk
sudo cp -r ~/software/jdk-8u5-linux-i586.tar.gz /opt/jdk
cd jdk
sudo tar zxvf jdk-8u5-linux-i586.tar.gz
设置全局的环境变量:
sudo vim /etc/profile
在文件最后增加:
export JAVA_HOME=/opt/jdk/jdk1.8.0_05
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
立即生效:source /etc/profile
将系统默认的jdk修改过来
sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_05/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_05/bin/javac 300
sudo update-alternatives --config java
sudo update-alternatives --config javac
检测
java -version
2.下载并安装Eclipse
(1)在http://www.eclipse.org/下载Eclipse C/C++的Linux版本(~/software):eclipse-cpp-kepler-SR2-linux-gtk.tar.gz
解压缩:(当前目录/opt/jdk)
cd ..
sudo tar zxvf ~/software/eclipse-cpp-kepler-SR2-linux-gtk.tar.gz
生成eclipse目录。
在Ubuntu中启动终端,进入该目录启动Eclipse:
postgres@lq-pc:~$ cd /opt/eclipse/
postgres@lq-pc:/opt/eclipse$ ./eclipse
选择workspace工作目录为:/home/postgres/workspace
(2)配置代码
再打开一个终端:
安装组件:
postgres@lq-pc:~$ sudo apt-get install make gcc g++ tar libreadline6-dev zlib1g-dev bison flex
postgres@lq-pc:~$ sudo apt-get install openssl libssl-dev
postgres@lq-pc:~$ sudo apt-get install libpam-dev
postgres@lq-pc:~$ sudo apt-get install libxml2 libxml2-dev
postgres@lq-pc:~$ sudo apt-get install libxslt-dev
postgres@lq-pc:~$ sudo apt-get install tcl tcl-dev
postgres@lq-pc:~$ sudo apt-get install libperl-dev
postgres@lq-pc:~$ sudo apt-get install python python-dev
安装systemtap:
postgres@lq-pc:~$ sudo apt-get install systemtap systemtap-sdt-dev
检查stap:
postgres@lq-pc:~$ stap --version
下载源码(~/software):postgresql-9.3.4.tar.gz
解压:
postgres@lq-pc:~$ cd
postgres@lq-pc:~$ mkdir project
postgres@lq-pc:~$ cd project
postgres@lq-pc:~/project$ tar zxvf ~/software/postgresql-9.3.4.tar.gz
postgres@lq-pc:~/project$ mv postgresql-9.3.4 pgsql
postgres@lq-pc:~/project$ cd pgsql
配置:
postgres@lq-pc:~/project/pgsql$ ./configure --prefix=$HOME/pgsql --with-pgport=5432 --with-perl --with-python --with-tcl --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety --with-wal-blocksize=16 --with-blocksize=16 --enable-dtrace --enable-depend --enable-cassert --enable-debug
(3)导入代码
在Eclipse主界面,点击File-Import,选择"C/C++"-"Existing Code as Makefile Project",Next,
在弹出的"Import Existing Code"对话框中,设置
Project Name:pgsql
Existing Code Location:/home/postgres/project/pgsql
Language:选择C,必须去掉"C++"复选框
Toolchain for Indexer Settings:选择Linux GCC
单击"Finash"按钮。
4.开发与调试
(1)新建Make Target
在调试PostgreSQL之前,首先需要将其安装到某个目录中,在Eclipse中是通过建立一个Make Target实现的。
在工程pgsql上单击右键,选择Make Targets-Create,在弹出的"Create Make Target"对话框中,输入:
Target name:install
单击OK。
编译安装:
在工程pgsql上单击右键,选择Make Targets-Build,选择install,单击Build。
直到出现"PostgreSQL installation complete.",表示安装完成。
此时,在$HOME/pgsql目录下,会生成bin、include、lib和share目录。
此时可以关闭eclipse了。
(2)尝试运行数据库
回到命令行,设置当前用户的环境变量:
postgres@lq-pc:~$ cd
postgres@lq-pc:~$ vim ./.profile
在末尾添加:
# add PG env
export PATH=$PATH:$HOME/pgsql/bin
export PGDATA=/db/pgdata
export PATH=$PATH:$HOME/pgsql/bin
export PGDATA=/db/pgdata
立即生效:postgres@lq-pc:~$ source ./.profile
初始化数据库目录:
postgres@lq-pc:~$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
(密码名字全拼)
初始化成功后,打开新的终端,执行source ./.profile,然后重新打开Eclipse,在pgsql上单击右键,Run as-Run Configurations,
在弹出的Run Configration对话框中的左侧,双击C/C++ Application,会创建一个一个名称为pgsql Default的配置界面:
Main选项卡:
C/C++ Application:src/backend/postgres
Project:pgsql
切换到Arguments选项卡:
Program arguments:-D /db/pgdata
单击Apply,然后单击Run。
直到出现信息
"LOG: database system was shut down at 2014-04-16 17:34:34 CST
LOG: autovacuum launcher started
LOG: database system is ready to accept connections"
表示数据库已成功启动。
查看postgres进程和相关后台进程:ps -ef | grep postgres
此时,可以在命令行,测试一下:
查看数据库:
psql -l
创建数据库:
createdb DemoDB
psql -l
登录刚才创建的数据库(进行操作):
psql DemoDB
退出PostgreSQL:
\q
(3)调试数据库代码
数据库运行成功后,一定要关闭已经开启的Postmaster进程才能进行调试,否则会提示"Postmaster已经存在"的错误。
关闭已启动的数据库进程:
点击Console面板右侧的红色Terminate关闭图标,即可关闭。
查看postgres进程,确认是否关闭:ps -ef | grep postgres
如果要调试Postgresql源码,要保证安装了gdb:sudo apt-get install gdb
单击工程右键,Debug As-Local C/C++ Application,选择"postgres"作为调试程序,单击OK,即可进入调试模式。
此时程序自动会在main函数处停下,所以要继续点击工具栏上的"Resume"按钮让主进程运行完,否则无法连接数据库。Debug运行完后会有和运行成功时一样的提示信息。
打开一个终端,查看postgres进程:ps -ef | grep postgres
debug模式的按钮简介:
Resume(F8):重新开始执行debug,一直运行直到遇到breakpoint
Suspend:暂挂
Terminate:终止
Disconnect:断开
Step Into:跳入
Step Over:跳出
Step Return:执行完当前函数,然后return跳出该函数
(4)服务进程(postgres的子进程)的调试
使用psql登录:
psql
查看其进程号:select pg_backend_pid();
注意:记住这个进程号,如2800。
打开另一个终端,输入ps -ef | grep postgres
发现此时,多了一个进程:
postgres 2800 2776 0 15:42 ? 00:00:00 postgres: postgres postgres [local] idle
回到Eclipse调试界面,单击菜单Run-Debug Configure,在弹出的Debug Configurations界面,双击C/C++ Attach to Application:
配置界面:
Name:postgres
Main选项卡:
C/C++ Application:src/backend/postgres
Project:pgsql
Build configuration:取消"Select configuration...",选择"Use Active"
单击Debug,然后会出现一个进程选择窗口,输入"post"在程序的进程列表中,选择进程号(2800)对应的postgres进程。
单击OK。
此时会遇到一个问题:
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
从ubuntu10.10开始,除非进程B是进程A的子进程,或者进程A为root运行,否则进程A不能调试进程B。这样一来增加了进程的安全。这个安全限制是默认的,但是可以通过修改配置文件来达到任意进程A可以调试进程B的目的。
解决方法:
1.可以通过下面的命令对这个限制进行临时修改,但是重启后限制依旧存在。
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
2.可以通过修改配置文件来接触限制(我选择了这种方式)
sudo vim /etc/sysctl.d/10-ptrace.conf
修改前:
kernel.yama.ptrace_scope = 1
修改后:
kernel.yama.ptrace_scope = 0
重启操作系统之后可以生效。
修改之后,再次调试子进程,单击OK,可以看到已经将调试工具挂上了这个postgres进程。
断点调试:
在postgres工程中的postgres.c文件(这个是psql命令的入口地方)中,搜索一下simple,就会看到一个大的switch语句,在这行加个断点。
回到命令行,输入一条SQL:
select 1+2;
回到Eclipse界面,程序停在了断点处,然后就可以在Eclipse中来追踪PostgreSQl的执行过程了。