在CentOS上編譯安裝PostgreSQL

第一步:準備階段
html

獲取必需軟件包:node

CentOS中查看是否安裝了某個軟件的命令:rpm -qa | grep 軟件名。
which命令可查看某個軟件的安裝路徑。
使用 yum install 包名 來安裝軟件包。python

1.GNU make的版本3.80以上
[root@localhost ~]# rpm -qa | grep make
make-3.81-20.el6.x86_64linux

[root@localhost ~]# make -v
GNU Make 3.81c++

[root@localhost ~]# which gcc
/usr/bin/gcc正則表達式

2.ISO/ANSI編譯器,推薦最新版本的GCC算法

[root@localhost ~]# rpm -qa | grep gcc
gcc-4.4.7-4.el6.x86_64
libgcc-4.4.7-4.el6.x86_64
gcc-c++-4.4.7-4.el6.x86_64
[root@localhost ~]# gcc -v
gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)sql

3.源碼包的解壓工具tar,除此以外還有gzip或bzip2shell

[root@localhost ~]# rpm -qa | grep tar
libtar-1.2.11-17.el6_4.1.x86_64
tar-1.23-11.el6.x86_64
[root@localhost ~]# tar --version
tar (GNU tar) 1.23
4.默認使用GNU Readline庫
[root@localhost ~]# rpm -qa | grep readline
readline-6.0-4.el6.x86_64數據庫

5.默認使用zlib壓縮庫
[root@localhost ~]# rpm -qa | grep zlib
zlib-1.2.3-29.el6.x86_64

6.可選軟件包:

可選軟件包(詳細見文檔:http://www.postgresql.org/docs/9.3/interactive/install-requirements.html):
(1)爲了編譯PL/Perl服務器端編程語言,須要完整Perl的安裝,包括libperl庫和頭文件。
(2)爲了編譯PL/Python服務器端語言,須要一個包含頭文件和distuils模塊的Python安裝。
(3)爲了編譯PL/Tcl服務器端語言,須要Tcl的安裝。
(4)爲了使用NSL,即具備使用不一樣於英語的一種語言顯示消息的能力,須要一種Gettext API的實現。
(5)須要Kerberos, OpenSSL, OpenLDAP, and/or PAM,若是你想要使用這些服務支持認證或加密。
(6)爲了編譯PostgreSQL的文檔,有一組獨立的要求。查看http://www.postgresql.org/docs/9.3/interactive/docguide-toolsets.html


第二步:獲取並解壓縮PostgreSQL源碼及目錄簡介

1.下載源碼:官網:http://www.postgresql.org/ftp/source/,這裏下載的是最新版9.3.2.

2.解壓:

tar -zxvf postgresql-9.3.2.tar.gz

隨後會生成一個新的文件夾postgresql-9.3.2。(若是要壓縮則參數爲:-zcvf)

3.源碼目錄結構簡介:

進入解壓目錄:cd postgresql-9.3.2,查看其結構

(1)configure:源碼安裝的配置腳本

查看配置腳本支持的參數:./configure --help

(2)configure.in:configure文件的雛形

(3)COPYRIGHT:版權信息

(4)Makefile:Makefile模版

(5)GUNMakefile.in:Makefile的雛形

(6)HISTORY:版本變動的歷史記錄

(7)INSTALL:安裝簡要說明

(8)README:簡單說明

(9)aclocal.m4:config用的文件的一部分

(10)config/:config用的文件的目錄,存放了一些系統的配置文件,如c-compiler.m4文件中提供了檢測C編譯器的宏

(11)contrib/:已打包到PG源碼中的第三方貢獻的插件源碼

第三方插件簡介:

adminpack:一些管理函數
auth_delay:認證失敗後延遲報異常,能夠防止暴力破解
auto_explain:將超過指定執行時間的SQL的執行計劃輸出到日誌中
btree_gin:gin索引方法的btree操做符擴展(在某些狀況下「多列gin組合索引」比「多個btree單列索引」的bitmap anding更高效)
btree_gist:gist索引方法的btree操做符擴展(在組合索引中的某些列類型僅支持gist索引訪問方法,而另外一些列的類型支持btree以及gist時btree_gist更爲有效,同時btree_gist還新增了<>用於排他約束,<->用於近鄰算法)
chkpass:自動加密的字段類型(使用UNIX標準函數crypt()進行封裝,因此僅支持前8位安全)'abcdefghijkl'::chkpass--'abcdefgh'
citext:不區分大小寫的數據類型
cube:多維立方體類型,支持多維立方體對象的相同,相交,包含等運算
dblink:PostgreSQL跨庫操做插件
dict_int:全文檢索的一個字典模版,用於控制數字被拆分的最大長度,以控制數字在全文檢索中的分詞個數(maxlen=6:12345678 --> 123456截斷成6個,rejectlong=true則忽略這個分詞)
dict_xsyn:全文檢索的一個字典模塊,設置分詞的同義詞,支持同義詞匹配
dummy_seclabel:用於安全標籤SQL的測試
earthdistance:可使用cube或point類型計算地球表面兩點之間的距離
file_fdw:文件外部表模塊
fuzzystrmatch:單字節字符串之間的類似性判斷
hstore:用於存儲K-V數據類型,同時這個插件還提供了比較V類型相關的函數和操做符。例如提供數組,json,hstore之間的轉換,K-V的存在判斷,刪除K-V值
intagg:int類型的數組聚合函數(內建的array_agg函數已包含這個功能)
intarray:int類型的數組功能擴展庫,提供了一些經常使用的函數和操做符(數組元素個數,元素排序,元素下標,取元素子集,相交,包含,增長元素,刪除元素,合併等)
isn:提供國際通用的產品標識碼數據類型,例如ISBN,ISMN...
lo:大對象的一個可選模塊,lo類型以及自動unlink大對象的觸發器,方便大對象在消亡後的自動unlink,防止大對象存儲泄漏(相似內存泄漏)
ltree:異構數據類型以及操做函數和操做符。例如China.Zhejiang.Hang<@'China'
oid2name:id轉換成name的命令行工具,不屬於extension。或經過系統表查詢獲得.
pageinspect:用於讀取數據庫PAGE裸信息的插件,能夠讀main,fsm,vm FORK的頁數據,通常用於debug(使用時請參照對應數據庫版本的頭文件解讀信息)
passwordcheck:建立用戶或者修改用戶密碼時,檢查密碼的安全性,若是太弱的話,將返回錯誤。
pg_archivecleanup:清除歸檔文件的命令,不屬於extension
pgbench:數據庫性能測試的命令,不屬於extension
pg_buffercache:輸出當前的shared buffer的狀態數據(細化到page number)
pgcrypto:PostgreSQL的服務端數據加密的擴展庫
pg_freespacemap:輸出對象指定page或全部page的free space map信息
pgrowlocks:(從行頭信息中的informask獲取行鎖信息),注意輸出的不是snapshot
pg_standby:8.4以及之前的版本方便於建立warm standby的命令行
pg_stat_statements:跟蹤數據庫的SQL,收集SQL的統計信息
pgstattuple:行級統計信息(dead tuples,live tuples,table_len,free_space,free_percent),索引的統計信息
pg_test_fsync:測試磁盤的fsync速率。適用於選擇最快的wal_sync_method
pg_test_timing:測試系統定時器的開銷,開銷越大,explain analyze時間結果越不許,須要調整系統時鐘源
pg_trgm:將字符串拆分紅3個一組的多個單元,用於測試兩個字符串之間的近似度,比分詞更加暴力。
pg_upgrade:跨大版本的升級工具(例如9.0-->9.1)
pg_upgrade_support:pg_upgrade用到的服務端函數集
pg_xlogdump:從xlog中dump出一些易讀的底層信息
postgres_fdw:postgresq跨庫的外部表插件
seg:線段類型和浮點數的區間類型,以及相關的操做符,索引訪問方法等
sepgsql:基於SELinux安全策略的訪問控制模塊
spi:一些服務端的觸發器函數(例如跟蹤記錄的存活時間,被哪一個用戶修改了,記錄的修改時間等)
sslinfo:輸出ssl認證的客戶端的一些認證信息
start-scripts:數據庫啓動腳本模版
tablefunc:通常可用於行列變換,異構數據處理等
tcn:提供異步消息輸出的觸發器
test_parser:全文檢索中的一個自定義parser的測試插件
tsearch2:全文檢索相關的插件,在全文檢索未引入PG內核前的PG版本可使用這個插件來實現全文檢索功能,大於8.3之後就不須要這個了
unaccept:全文檢索相關的插件
uuid-ossp:生成UUID的插件
vacuumlo:大對象垃圾回收的命令
worker_spi:9.3新增的服務端worker編程範例
xml2:xml相關插件

(12)doc/:文檔目錄

(13)src/:源代碼目錄,存放了PG的核心代碼

src目錄簡介:

DEVELOPERS:面向開發人員的注視
Makefile:Makefile
Makefile.global.in:make的設定值(從configure生成的)
Makefile.shlib:共享庫用的Makefile
nls-global.mk:信息目錄用的Makefile文件的規則
backend/:數據庫引擎代碼,數據庫各個功能進程代碼,系統存儲部分代碼,事務處理代碼,查詢優化部分代碼等。PG最重要的代碼都位於此目錄
bin/:數據庫外圍工具代碼,如initdb,psql,pg_dump等的代碼
include/:系統依賴的頭文件統一按照c文件的目錄結構組織在include目錄下
interfaces/:數據庫系統提供的對外接口,如libpq。可是如ODBC、JDBC等不在這個目錄,它們做爲獨立的項目存在
makefiles/:存放了針對不一樣操做系統編譯所使用的makefile文件
pl/:pg提供的存儲過程,包括tcl、perl、python三種腳本語言支持的存儲過程和PL/pgSQL支持的存儲過程
port/:平臺移植相關的代碼,對src\bin下的工具提供的基本函數的支持,編譯後的樣式是一個lib庫
template/:針對不一樣操做系統提供的一些腳本樣例
test/:各類測試腳本,PG提供的迴歸測試用例和自動化測試框架
timezone/:時區相關代碼(從http://www.iana.org/time-zones同步的時區庫)
tools/:輔助開發工具
tutorial/:PG提供的部分示例,如如何寫PG認識的SQL,如何寫PG風格一致的C代碼等

backend目錄結構簡介:

access/數據訪問層(很重要的目錄),存放了和索引相關以及事務處理相關的代碼:各類存儲訪問方法(在各個子目錄下) common(共同函數)、gin (Generalized Inverted Index通用逆向索引)、gist (Generalized  Search Tree通用索引)、 hash (哈希索引)、heap (heap的訪問方法)、index (通用索引函數)、 nbtree (Btree函數)、transam (事務處理)。本層之下,是數據緩衝區,再下層,是真正的數據存儲層
bootstrap/:初始化數據庫時要使用的代碼,和src\bin\initdb下的initdb工具緊密相關。
catalog/:PG提供的針對系統表的操做代碼,包含用於操做系統表的專用函數。
parser/:編譯器,對SQL語句進行解析的代碼(注意gram.y文件)。即將SQL查詢轉化爲內部查詢樹。
optimizer/查詢優化器,根據查詢樹建立最優的查詢路徑和查詢計劃。
executor/   執行器(訪問的執行),執行來自Optimizer的查詢計劃。與commands目錄中的代碼聯合完成查詢處理功能。
commands/:執行非計劃查詢的SQL目錄,如create table命令等。SQL命令被解析後執行具體命令時對應的操做代碼(SELECT/INSERT/UPDATE/DELETE之外的SQL文的處理)
tcop/:postgres服務進程(數據庫引擎的進程)的主要部分,它調用Parser、Optimizer、Executor和Commands中的函數來執行客戶端提交的查詢。
foreign/:FDW(Foreign Data Wrapper)處理
lib/:共同函數,字符串處理和鏈表處理輔助函數。
libpq/處理與客戶端間的通訊,幾乎全部的模塊都依賴它。如:同身份認證或口令識別相關代碼,以進行安全的網絡通信。如ssl,md5等等。
main/:主程序模塊,它負責將控制權轉到Postmaster進程或Postgres進程。PG的main函數所在。PG啓動入口。
nodes/:定義系統內部所用到的節點、鏈表等結構,以及處理這些結構的函數。
po/:實現國際化(i18n)功能的一部分。把一些數據庫的提示信息國際化。
port/:平臺兼容性處理相關函數。屏蔽一些不一樣操做系統在一些實現上的差異。如windows上的socket、darwin系統上對system函數的支持、sunos4系統對於float類型的支持等。
postmaster/:監聽用戶請求的守護進程,並控制Postgres進程的啓動和終止。PG的主要進程。如主服務進程postmaster,歸檔進程pgarch等。
regex/:正則表達式庫及相關函數,用於支持正則表達式處理。
replication/:streaming replication
rewrite/:查詢重寫,根據規則系統對查詢進行重寫。
snowball/:支持全文檢索的代碼
storage/:很重要的一個目錄,有關物理存儲系統相關代碼。管理各類類型的存儲系統(如磁盤、閃存等),即共享內存、磁盤上的存儲、緩存等所有一次/二次記錄管理:buffer/(緩存管理)、 file/(文件)、freespace/(Fee Space Map管理) ipc/(進程間通訊)、large_object /(大對象的訪問函數)、 lmgr/(鎖管理)、page/(頁面訪問相關函數)、 smgr/(存儲管理器)。
tsearch/:全文檢索相關代碼

utils/:各類支持函數,如錯誤報告、各類初始化操做等等。各類模塊(目錄):adt/(嵌入的數據類型)、cache/(緩存管理)、 error/(錯誤處理)、fmgr/(函數管理)、hash/(hash函數)、init/(數據庫初始化、postgres的初期處理)、 mb/(多字節文字處理)、misc/(其餘)、mmgr/(內存的管理函數)、 resowner/(查詢處理中的數據(buffer pin及表鎖)的管理)、sort/(排序處理)、time/(事務的 MVCC 管理)

backend等的代碼的頭文件包含在include裏面。其組織雖然與backend的目錄結構相似,可是並不是徹底相同,基本上來講下一級的子目錄再也不設下一級目錄。例如backend的目錄下面有utils這個目錄,而util下面還有adt這個子目錄,可是include裏面省略了這個目錄,變成了扁平的結構。

第三步:源碼安裝PostgreSQL

詳細說明參考INSTALL文件或者http://www.postgresql.org/docs/9.3/interactive/install-procedure.html

步驟以下:

1.配置(Configuration)

進入源碼目錄:
[root@localhost backend]# cd ~/software/postgresql-9.3.
[root@localhost postgresql-9.3.2]# ./configure

這種默認的配置將編譯服務器和使用工具,以及全部客戶端應用程序和接口,只須要一個C編譯器。全部文件默認將安裝到/usr/local/pgsql中。
confiure命令的可選參數,參考:http://www.postgresql.org/docs/9.3/interactive/install-procedure.html

這裏,個人配置是可選參數設置以下

./configure --prefix=/opt/pgsql9.3.2 --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-debug

配置選項說明:

--prefix=/opt/pgsql9.3.2:安裝全部文件在/opt/pgsql9.3.2中(取代默認時的/usr/local/pgsql)。
--with-pgport=5432:爲服務器和客戶端設置默認端口號。默認是5432。
--with-perl:編譯PL/Perl服務端語言。
--with-python:編譯PL/Python服務端語言。
--with-tcl:編譯PL/Tcl服務端語言。
--with-openssl:編譯支持SLL(加密)鏈接。這須要安裝OpenSSL包。
--with-pam:編譯支持PAM(Pluggable Authentication Modules,可插拔認證模塊)
--without-ldap:編譯支持認證和鏈接參數檢查
--with-libxml:編譯libxml(支持SQL/XML),支持這個選項須要Libxml 2.6.23及最新版
--with-libxslt:編譯xml2模塊,使用libxslt
--enable-thread-safety:讓客戶端庫是線程安全的
--with-wal-blocksize=16:WAL:預寫式日誌(Write-Ahead Logging)
設置WAL的block size,以MB爲單位。這是在WAL日誌中的每一個獨立文件的大小。爲了控制WAL日誌傳送的粒度去調整其大小,這多是很是有用的。默認爲16MB。這個值必須是2的1到64次方(MB)。注意,改變這個值須要一個initdb。
--with-blocksize=16:設置block size,以KB爲單位。這是表的存儲和IO單元。默認爲8K,適用於大多數狀況;可是在特殊場合中,其餘的值多是很是有用的。這個值必須是2的1到32次方(KB)。注意,改變這個值須要一個initdb。
--enable-dtrace:編譯PostgreSQL支持動態跟蹤工具DTrace
--enable-debug:把全部程序和庫以帶有調試符號的方式編譯
--enable-nls[=LANGUAGES]:打開本地語言支持(NLS),即以非英文顯示程序的信息的能力。LANGUAGES是一個空格分隔的語言代碼列表,標識你想支持的語言。好比--enable-nls='de fr'。(你提供的列表和實際支持的列表之間的交集將會自動計算出來。)若是你沒有聲明一個列表,那麼就安裝全部可用的翻譯。

(還能夠在--enable-debug前,添加兩個選項:--enable-depend --enable-cassert)

配置過程可能會遇到依賴的動態庫缺失,  安裝這些缺失的庫便可。

記錄下我這裏的缺失lib的安裝:

dtrace工具的安裝:

PostgreSQL支持動態跟蹤, 能夠經過dtrace或者systemtap工具統計相關探針的信息。

在CentOS中安裝systemtap:
在安裝systemtap前,要保證kernel對應的kernel-devel包的版本保持一致:

檢查:
[root@localhost ~]# rpm -qa|grep kernel
[root@localhost ~]# uname -a

不一致的話,則安裝對應的kernel-devel版本或者升級kernel:
[root@localhost ~]# yum install kernel-devel
或:[root@localhost ~]# yum update kernel
重啓服務器。

安裝systemtap
[root@localhost ~]# yum install systemtap systemtap-sdt-devel

其中:
安裝systemtap時,安裝了systemtap-devel、systemtap-client和systemtap-runtime這3個包。
systemtap-sdt-devel是編譯PostgreSQL時,選項--enable-dtrace須要的包

使用命令:
[root@localhost ~]# rpm -qf /usr/bin/stap
systemtap-devel-2.3-4.el6_5.x86_64
systemtap-client-2.3-4.el6_5.x86_64
rpm -qf:查詢文件隸屬的軟件包

檢查stap是否正常
[root@localhost ~]# stap
A script must be specified.
Try '--help' for more information.

此時stap是正常的。接着測試下:
[root@localhost ~]# stap -ve 'probe begin { log("hello world") exit() }'
Pass 1: parsed user script and 96 library script(s) using 198456virt/26648res/3080shr/24072data kb, in 260usr/40sys/296real ms.
Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 198852virt/27396res/3320shr/24468data kb, in 10usr/0sys/10real ms.
Pass 3: using cached /root/.systemtap/cache/ca/stap_ca2aff10c84d1cf00083e0eb3e5d7082_1033.c
Pass 4: using cached /root/.systemtap/cache/ca/stap_ca2aff10c84d1cf00083e0eb3e5d7082_1033.ko
Pass 5: starting run.
hello world
Pass 5: run completed in 40usr/80sys/404real ms.

stap調試好後,就能夠用來跟蹤postgresql了。
PostgreSQL編譯時必須開啓dtrace支持,即--enable-dtrace。
開啓dtrace後,數據庫將啓用代碼中的探針或跟蹤點。

回到PG的繼續從新執行configure,遇到問題以及解決方法:

(1)問題1:
no
configure: error: could not determine flags for linking embedded Perl.
This probably means that ExtUtils::Embed or ExtUtils::MakeMaker is not
installed.

解決方法:
yum install perl-ExtUtils-Embed

(2)問題2:
configure: error: readline library not found
If you have readline already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.

解決方法:
yum install readline readline-devel

(3)問題3:
checking for inflate in -lz... no
configure: error: zlib library not found
If you have zlib already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-zlib to disable zlib support.

解決方法:
yum install zlib zlib-devel

(4)問題4:
checking for CRYPTO_new_ex_data in -lcrypto... no
configure: error: library 'crypto' is required for OpenSSL
解決方法:
yum install openssl openssl-devel

(5)問題5:
checking for pam_start in -lpam... no
configure: error: library 'pam' is required for PAM
解決方法:
yum install pam pam-devel

(6)問題6:
checking for xmlSaveToBuffer in -lxml2... no
configure: error: library 'xml2' (version >= 2.6.23) is required for XML support
解決方法:
yum install libxml2 libxml2-devel

(7)問題7:
checking for xsltCleanupGlobals in -lxslt... no
configure: error: library 'xslt' is required for XSLT support
解決方法:
yum install libxslt libxslt-devel

(8)問題8:
configure: error: Tcl shell not found
解決方法:
yum install tcl tcl-devel

(9)問題9:
checking for ldap.h... no
configure: error: header file is required for LDAP
解決方法:
yum install openldap openldap-devel

(10)問題10:
checking for Python.h... no
configure: error: header file <Python.h> is required for Python
解決方法:
yum install python python-devel

(11)問題11:
Error when bootstrapping CMake:
Cannot find appropriate C++ compiler on this system.
Please specify one using environment variable CXX.
See cmake_bootstrap.log for compilers attempted.
解決方法:
yum install gcc-c++

2.編譯

Configure成功以後,執行編譯:
[root@localhost postgresql-9.3.2]# gmake world
(make world安裝包含了文檔,全部的contrib)

3.安裝

接着安裝(帶world參數能夠安裝PG的附屬信息,如文檔,幫助等):
[root@localhost postgresql-9.3.2]# gmake install-world


第四步:配置PG

1.新建普通用戶,用於初始化數據庫, 開啓和關閉數據庫

[root@localhost postgresql-9.3.2]# groupadd postgres
[root@localhost postgresql-9.3.2]# useradd -g postgres postgres
[root@localhost postgresql-9.3.2]# passwd postgres

2.建立數據庫的數據目錄並設置其權限

[root@localhost postgresql-9.3.2]# mkdir -p /db/pgdata
[root@localhost postgresql-9.3.2]# chown -R postgres:postgres /db/pgdata

3.設置環境變量

[root@localhost postgresql-9.3.2]# su - postgres
[postgres@localhost ~]$ vim ./.bash_profile
在文件最後添加:

# add PG env
export PGHOME=/opt/pgsql9.3.2
export PGDATA=/db/pgdata
export PATH=$PGHOME/bin:$PATH
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=en_US.utf8
export DATE=`date +"%Y-%m-%d %H:%M:%S"`
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
alias rm='rm  -i'
alias ll='ls -lh'
#alias pg_start='pg_ctl start -D $PGDATA'
#alias pg_stop='pg_ctl stop -D $PGDATA -m fast'
 
#psql -h 主機名 -p 端口號 -U 用戶名 -W(強制口令提示) [-d]數據庫名
#psql -h $GHOST -p $PGPORT -U $PGUSER -W -d $PGDATABASE
#PGHOST 設置數據庫服務器名。 若是它以一個斜槓開頭,那麼它聲明一個 Unix 域套接字而不是 TCP/IP 通信; 其值就是該套接字文件存儲的目錄(在缺省安裝中,這個目錄會是 /tmp)
#export PGHOST=$PGDATA
export PGHOST=localhost
#PGPORT 設置 TCP 端口號或者設置與 PostgreSQL 通信的 Unix 域套接字的文件擴展。
export PGPORT=5432
export PGUSER=postgres #用於與數據庫鏈接的用戶名,initdb -U posgtres指定
#export PGDATABASE=demo#數據庫名

修改環境變量後,能夠從新登陸該用戶或者source .bash_profile讓環境變量生效。

測試一下:

[postgres@localhost ~]$ source .bash_profile
[postgres@localhost ~]$ psql -V
psql (PostgreSQL) 9.3.2

第五步:初始化數據庫集羣
[postgres@localhost ~]$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
看到以下提示信息,表示初始化成功,下一步能夠啓動數據庫了。
Success. You can now start the database server using:

    postgres -D /db/pgdata
or
    pg_ctl -D /db/pgdata -l logfile start

第六步:啓動和關閉數據庫

啓動:
[postgres@localhost ~]$ pg_ctl start -D $PGDATA -l pgsql.log
server starting
[postgres@localhost ~]$ ls
pgsql.log
啓動經過-l選項指定的日誌,這裏指定到當前路徑下。也能夠指定postgres用戶具備可寫權限的任何目錄。

查看數據庫狀態:
[postgres@localhost ~]$ pg_ctl status
pg_ctl: server is running (PID: 2524)
/opt/pgsql9.3.2/bin/postgres "-D" "/db/pgdata"

查看數據庫的後臺進程:
[postgres@localhost ~]$ ps -ef | grep postgres
postgres  2524     1  0 17:26 pts/2    00:00:00 /opt/pgsql9.3.2/bin/postgres -D /db/pgdata
postgres  2526  2524  0 17:26 ?        00:00:00 postgres: checkpointer process
postgres  2527  2524  0 17:26 ?        00:00:00 postgres: writer process
postgres  2528  2524  0 17:26 ?        00:00:00 postgres: wal writer process
postgres  2529  2524  0 17:26 ?        00:00:00 postgres: autovacuum launcher process
postgres  2530  2524  0 17:26 ?        00:00:00 postgres: stats collector process

關閉:
[postgres@localhost ~]$ pg_ctl stop -D $PGDATA
waiting for server to shut down.... done
server stopped
[postgres@localhost ~]$ pg_ctl status
pg_ctl: no server running

第七步:登陸數據庫

以postgres身份來啓動數據庫(前面已經過su - postgres切換):
[postgres@localhost ~]$ pg_ctl start -D $PGDATA -l pgsql.log

列出全部可用的數據庫:
[postgres@localhost ~]$ psql -l
該命令執行後,而後退出。

登陸數據庫:
使用"psql 數據庫名"登陸數據庫。缺省數據庫名時,鏈接到默認的數據庫postgres。
[postgres@localhost ~]$ psql
psql (9.3.2)
Type "help" for help.

postgres=# select version();
                                                   version

--------------------------------------------------------------------------------
------------------------------
 PostgreSQL 9.3.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120
313 (Red Hat 4.4.7-4), 64-bit
(1 row)

使用PostgreSQL數據庫命令行交互工具psql登陸數據庫後,能夠執行SQL命令或者psql提供的元命令。使用\?能夠查看psql的全部元命令和功能說明。
登陸數據庫後,命令行提示符爲"數據庫名=#",如:"postgres=#"。

登陸後,psql經常使用的元命令:

\?, 查看psql全部可使用的元命令和說明信息;
\l,列出全部的數據庫信息;
\c demodb, 鏈接到demodb數據庫;
\c[onnect] [數據庫名稱|- 用戶名稱|- 主機|- 端口|-], 鏈接到新的數據庫;
\d, 列出表,視圖和序列;
\d 名稱, 描述表,視圖,序列,或索引;
\db [模式], 列出表空間
\di [模式], 列出全部索引;
\dt [模式], 列出全部表;
\dT [模式], 列出數據類型
\h, 列出全部的SQL命令;
\h select, 列出select語句的語法;
\i file, 執行來自file的命令;
\q, 退出psql;
select * from pg_stat_activity; 顯示當前活動任務列表.

第八步:簡單的操做
新建數據庫,鏈接數據庫,執行增刪改查的操做,刪除數據庫
接着第七步,先\q退出psql:
postgres=# \q
接着執行以下操做:
新建數據庫
[postgres@localhost ~]$ createdb test
查看全部數據庫:
[postgres@localhost ~]$ psql -l
鏈接到test數據庫
[postgres@localhost ~]$ psql test
psql (9.3.2)
Type "help" for help.

test=#
建立數據表
test=# create table person(id int, name varchar(10), sex char(1), birth date);
CREATE TABLE
test=# create table demo(id int);
CREATE TABLE
列出表,視圖和序列:
test=# \d
 public | demo   | table | postgres
 public | person   | table | postgres
查看錶結構:
test=# \d person
 id     | integer               |
 name   | character varying(10) |
 sex    | character(1)          |
 birth  | date                  |

插入數據:
test=# insert into person(id,name,sex,birth) values(1,'zhangsan','1','1990-01-08');
INSERT 0 1
查詢表中的數據:
test=# select * from person;
 id |   name   | sex |   birth
----+----------+-----+------------
  1 | zhangsan | 1   | 1990-01-08
(1 row)

更新數據:
test=# update person set name='lisi' where id=1;
UPDATE 1

刪除數據:
test=# delete from person where id = 1;
DELETE 1

新增字段:
alter table person add column address varchar(50);
ALTER TABLE
test=# \d person
修改字段類型:
alter table person alter column address type varchar(20);
ALTER TABLE
test=# \d person
修改字段名:
alter table person rename column id to no;
修改表名:
alter table person rename to person_demo;
刪除字段:
alter table person drop column address;
ALTER TABLE
test=# \d person

新增主鍵:
test=# alter table person add primary key(id);
ALTER TABLE
test=# \d person

增長約束:
惟一約束:
test=# alter table person add constraint unique_name unique(name);
ALTER TABLE
test=# \d person

刪除約束:
test=# alter table person drop constraint unique_name;
test=# \d person
test=# alter table person drop constraint person_pkey;
test=# \d person

查看建表語句:


刪除表:
test=# drop table person;
test=# \d

刪除數據庫:
先退出psql,後刪除數據庫:
test=# \q
[postgres@localhost ~]$ dropdb test;

其實,能夠在psql中直接經過sql命令建立和刪除數據庫
[postgres@localhost ~]$ psql
postgres=# \l
postgres=# create database test;
CREATE DATABASE
postgres=# \l
postgres=# \c test;
test=# create table t(id int);
CREATE TABLE
test=# \d

test=# \c postgres
postgres=# drop database test;DROP DATABASEpostgres=# \l

相關文章
相關標籤/搜索