0.準備階段
新增PG賬號,用於初始化、啓動和關閉數據庫
sudo groupadd postgres
sudo useradd -g postgres -m postgres
sudo passwd postgresjava
爲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/sudoerspython
使postgres用戶的bash生效:
sudo vim /etc/passwd
修改postgres行:
postgres:x:1001:1001::/home/postgres:
爲
postgres:x:1001:1001::/home/postgres:/bin/bashlinux
建立數據庫的數據目錄並設置其權限:
sudo mkdir -p /db/pgdata
sudo chown -R postgres:postgres /db/pgdatasql
以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.gzubuntu
設置全局的環境變量:
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/binvim
當即生效: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 -versionbash
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目錄。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的執行過程了。