一、PostgreSQL簡介

PostgreSQL是自由的對象-關(guān)系型數(shù)據(jù)庫服務(wù)器(數(shù)據(jù)庫管理系統(tǒng)),在靈活的BSD許可證下發(fā)行。它在其他開放源代碼數(shù)據(jù)庫系統(tǒng)(比如MySQL和Firebird),和專有系統(tǒng)(比如Oracle、Sybase、IBM的DB2和Microsoft SQL Server)之外,為用戶提供了又一種選擇。
PostgreSQL不尋常的名字導(dǎo)致一些讀者停下來嘗試拼讀它,特別是那些把SQL拼讀為"sequel"的人。PostgreSQL開發(fā)者把它拼讀為"post-gress-Q-L",它也經(jīng)常被簡略念為"postgres"。
PostgreSQL維基百科:https://zh.wikipedia.org/wiki/PostgreSQL
二、實驗環(huán)境
操作系統(tǒng): CentOS7.5 Minimal?
IP: 192.168.1.106
三、安裝PostgreSQL
添加PostgreSQL9.5官方y(tǒng)um源
# yum -y? install? https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
# ll /etc/yum.repos.d/

安裝PostgreSQL9.5服務(wù)端和客戶端
#? yum? -y install? ?postgresql95? ??postgresql95-server??
# yum info??postgresql95? ??postgresql95-server??
# rpm? -ql? ?postgresql95??
# rpm? -ql??postgresql95-server??




# cat /etc/passwd

初始化數(shù)據(jù)庫,啟動數(shù)據(jù)庫
#? ?/usr/pgsql-9.5/bin/postgresql95-setup initdb??
#? ?cat /var/lib/pgsql/9.5/initdb.log

#??systemctl start? postgresql-9.5.service
# systemctl enable postgresql-9.5.service
# systemctl status? postgresql-9.5.service

默認的數(shù)據(jù)存方目錄是/var/lib/pgsql/9.5/data/
# ll? ?/var/lib/pgsql/9.5/data/??
可以看出數(shù)據(jù)里目錄的屬主屬組為postgres,默認目錄權(quán)限為700,文件權(quán)限為600?

如果你想自定義數(shù)據(jù)庫目錄,在輸出化數(shù)據(jù)前更改數(shù)據(jù)存放目錄然后初始化數(shù)據(jù)庫,啟動數(shù)據(jù)庫:
#? cat? ? /usr/lib/systemd/system/postgresql-9.5.service

設(shè)置數(shù)據(jù)庫目錄,假設(shè)為/opt/data/postgres
# vim???/usr/lib/systemd/system/postgresql-9.5.service
#####################################
Environment=PGDATA=/opt/data/postgres
######################################
# chown -R? postgres:postgres? /opt/data/postgres
# chmod 700??/opt/data/postgres
#??/usr/pgsql-9.5/bin/postgresql95-setup initdb??
#? systemctl start? postgresql-9.5.service
四、設(shè)置監(jiān)聽IP,開啟遠程連接
#??vim? /var/lib/pgsql/9.6/data/postgresql.conf
#######################################
listen_addresses = '192.168.1.106'
########################################
注:如果是設(shè)置 listen_addresses = '*'? 表示監(jiān)聽 0.0.0.0.0

# vim??/var/lib/pgsql/9.5/data/pg_hba.conf
#####################################
host? ? ?all? ? ? ? ?all? ? ? ?127.0.0.1/32? ? ? ?trust
host? ? all? ? ? ? ? ?all? ? ? 192.168.1.0/24? ? trust
######################################
注:設(shè)置你允許的客戶端網(wǎng)段,你可以設(shè)置為某個網(wǎng)段如 192.168.1.0/24,具體某個IP如 192.168.1.106 或者任何客戶端 0.0.0.0/0

五、數(shù)據(jù)庫的命令行操作
Postgres運行用戶默認是postgres,shell為 /bin/bash?
# su -? postgres

$ psql --help
psql 是 PostgreSQL 中的一個命令行交互式客戶端工具,
它允許你交互地鍵入 SQL 命令,然后把它們發(fā)送給 PostgreSQL 服務(wù)器,再顯示 SQL 或命令的結(jié)果。
輸入的內(nèi)容允許來自一個文件,此外它還提供了一些元命令和多種類似 shell 的特性來實現(xiàn)書寫腳本,以及對大量任務(wù)的自動化工作。

postgresql95為我們提供了連接數(shù)據(jù)庫工具的客戶端軟件psql,postgresql96-server 是服務(wù)端軟件。psql命令有兩種格式,分別是:
#################################################
psql postgres://username:password@host:port/dbname?
?psql -U username -h hostname -p port -d dbname
##################################################

PostgreSQL安裝及初始化完成以后,在它的配置文件里,默認只允許本機連接,而且連接到服務(wù)器的認證方式是peer和ident。
#? cat? ?/var/lib/pgsql/9.5/data/pg_hba.conf

命令格式:

本地連接非常好理解,就是從安裝PostgreSQL的主機上連接,那 peer 和 ident 認證又是怎么回事呢?
PostgreSQL的官方文檔上是這么說的:

map映射是在data目錄下的pg_ident.conf目錄里配置的,其基本定義格式如下:
#? cat??/var/lib/pgsql/9.5/data/pg_ident.conf


(1)PostgreSQL的連接命令psql有兩種連接方式。不帶-h參數(shù)或host參數(shù)時,是local連接,用的是peer認證方式,通過unix或者linux系統(tǒng)的socket進行連接。如果使用-h localhost、-h 127.0.0.1、postgres@localhost 或 postgres@127.0.0.1 這樣的格式,則會使用host類型,使用TCP/IP的方式連接,使用的是ident的認證方式。
(2)需要修改配置文件設(shè)置好連接方式和認證方式,保證能夠正常連接。
前面我們講到,剛安裝好并初始化完畢后,PostgreSQL服務(wù)器默認監(jiān)聽的地址是本地地址,即localhost。
我們一般都是在自己的電腦上安裝客戶端,然后遠程連接到機房的物理服務(wù)器上。那怎么允許我們的機器可以連接到PostgreSQL服務(wù)器端呢?這里涉及到data目錄下兩個配置文件:
pg_hba.conf
postgresql.conf

默認監(jiān)聽localhost,這就是為什么剛安裝好的PostgreSQL只能在本機上連接的原因。
我們將這個地址修改為0.0.0.0或服務(wù)器的ip地址,如下所示:
#??vim? /var/lib/pgsql/9.6/data/postgresql.conf
######################################
listen_addresses = '192.168.1.106'
######################################
# systemctl? restart? postgres-9.5.service
這個時候還有一個問題,那就是認證的問題。
剛才我們講過peer和ident兩種認證方式,前者只適用于本地連接,而后者則需要從ident服務(wù)器上獲取用戶名,都不適合我們當(dāng)前的連接方式,那么還需要再修改認證方式,這里要介紹的認證方式是md5和trusted。

我們沒講過PostgreSQL的密碼設(shè)置問題,也沒有為數(shù)據(jù)庫設(shè)置一個密碼,那么我們只能先使用trusted的認證方式先連接到數(shù)據(jù)庫上,再考慮修改數(shù)據(jù)庫密碼的問題。
# vim??/var/lib/pgsql/9.5/data/pg_hba.conf
#####################################
host? ? ?all? ? ? ? ?all? ? ? ?127.0.0.1/32? ? ? ? ?trust
host? ? all? ? ? ? ? ?all? ? ??192.168.1.0/24? ? ?trust
######################################
注:設(shè)置你允許的客戶端網(wǎng)段


六、PostgreSQL密碼設(shè)置
我們在上一節(jié)中講了兩種連接PostgreSQL的方式,分別是命令行連接和圖形界面連接。這里不知道大家有沒有發(fā)現(xiàn)一個問題,就是不管是在命令行連接或者是圖形界面連接的時候,我們都沒有要求大家設(shè)置密碼或者輸入密碼?
這是因為在PostgreSQL安裝完成后,我們使用/usr/pgsql-9.5/bin/postgresql96-setup initdb命令進行初始化的時候,并沒有通過這個命令指定初始用戶postgres的密碼。當(dāng)我們在服務(wù)器命令行界面使用peer認證直接登陸時,沒要求我們輸入密碼,但是要記住,這樣使用數(shù)據(jù)庫是非常危險的,特別是你的數(shù)據(jù)庫布置在云服務(wù)器的時候,很可能分分鐘就被黑掉。在圖形界面連接的時候,我們還設(shè)置了使用trust認證方式,這種方式默認允許不使用密碼即可進行連接,也是非常危險的。
為了避免這些意外情況,我們介紹一下如何設(shè)置以及修改用戶的密碼。
1. 初始化時設(shè)置密碼
當(dāng)使用rpm包或PostgreSQL的官方y(tǒng)um源安裝好PostgreSQL以后,不要使用/usr/pgsql-9.5/bin/postgresql95-setup initdb命令進行初始化,而是使用initdb命令。,
命令語法:
initdb [命令選項] [--pgdata | -D] 目錄名

介紹完這個命令的用法以后,我們嘗試使用這個命令來初始化數(shù)據(jù)庫并給postgres用戶設(shè)置一個密碼。
這個命令是不能用root用戶來允許的,因此先切換到postgres用戶:
# su? - postgres?
$? /usr/pgsql-9.5/bin/initdb? -A md5? -U postgres -W -D? 9.5/data

在這個命令中,我們使用的是md5加密密碼,超級用戶是postgres,目錄是postgres用戶的家目錄下的9.6/data/目錄,完整路徑是/var/lib/psql/9.5/data/。
因為我們沒有設(shè)置編碼模式,從圖中我們可以看到默認使用的是UTF8編碼,然后執(zhí)行過程中有讓我們輸入密碼,輸入密碼確認以后,開始創(chuàng)建目錄,設(shè)置各種參數(shù)。
配置完成以后還給出了啟動PostgreSQL服務(wù)的命令:
$? /usr/pgsql-9.5/bin/pg_ctl? ?-D 9.5/data? ?-l? logfile? ?start
pg_ctl是postgresql自帶的管理工具,也是只能在普通用戶權(quán)限下執(zhí)行的命令。
這里我們先暫時不使用這個工具。初始完成以后,我們使用systemctl啟動PostgreSQL服務(wù)器:
#? su -? root?
# systemctl start postgresql-9.5.service
此時登錄就可以看到已經(jīng)要求你輸入賬號密碼了,輸入剛才我們初始化時設(shè)置的密碼,成功登陸。
我們再看看配置文件pg_hba.conf,如下所示:
# cat? ? /var/lib/pgsql/9.5/data/pg_hba.conf

此時所有的默認認證方式都是我們剛才設(shè)置的md5認證方式,說明設(shè)置成功。
2. 初始化完成后修改密碼
如果使用的是默認的初始化模式,則默認使用的是peer和ident的認證方式,配置好這兩種認證方式以后,是不需要密碼就可以登陸。
這時候可以先登陸到PostgreSQL服務(wù)器,然后修改密碼,修改密碼有兩種方式:
psql命令工具修改密碼
PostgreSQL的SQL語句修改密碼
psql用來修改的命令工具是\password,命令行界面登錄成功以后,輸入這個命令,就可以直接修改當(dāng)前用戶的密碼。
比如我們是postgres用戶登陸,輸入這個密碼則修改postgres的密碼,若是其他用戶,則修改其他用戶的密碼,如下所示:

連續(xù)輸入兩遍密碼,即成功修改,退出以后重新登陸時就需要輸入新密碼。
SQL語句用來修改密碼的格式如下:
ALTER USER username PASSWORD? 'passwordtext';

修改成功后會提示ALTER ROLE。
密碼修改成功以后,將配置文件里的認證方式修改為md5認證
#? cat?/var/lib/pgsql/9.5/data/pg_hba.conf

#? systemctl restart postgresql-9.5.service

# psql? ?-U? postgres -p 5432

重啟完成后,重新登陸就需要輸入密碼登陸了,不管是命令行登錄還是圖形工具登錄。
注意:psql并不支持像mysql命令行那樣直接把密碼作為參數(shù)傳遞進去進行非交互式登錄,必須使用password file或者環(huán)境變量。
https://www.postgresql.org/docs/current/libpq-envars.html
https://www.postgresql.org/docs/current/libpq-pgpass.html
3.基本信息查看
(1)通過psql命令查看,命令是psql --version
#? s - postgres
$psql --version

(2)登錄后通過SQL語句查看,命令是:SELECT version();
這個命令查看的信息更詳細,可以看到服務(wù)器版本,平臺型號,編譯信息等。
(3)查看數(shù)據(jù)庫信息

總結(jié):
這一章里我們學(xué)習(xí)的內(nèi)容是如何給用戶設(shè)置密碼、如何配置用戶的認證方式以及如何查看用戶的基本信息。
設(shè)置密碼分為兩種方式,分別是psql命令行形式和SQL語句形式
用戶認證可以在初始化時進行配置,也可以在初始化完成后修改pg_hba.conf文件進行配置
查看表的信息也是通過兩種方式,一種是psql的命令行工具,例如\l、\d、\c等,另外一種是PostgreSQL提供的函數(shù),例如pg_relation_size()等。這里要注意的一點是,PostgreSQL提供的函數(shù)如果帶參數(shù)時,要用引號將參數(shù)引起來否則會報錯。
七、設(shè)置防火墻
CentOS7.x? 防火墻中內(nèi)置了PostgreSQL服務(wù),配置文件位置:
#? ls? /usr/lib/firewalld/services/

?# cat /usr/lib/firewalld/services/postgresql.xml

放行相關(guān)服務(wù)端口方式1:
#? firewall-cmd --add-service=postgresql? ?--zone=pubilic? ?--permanent?
# firewall-cmd --reload?
放行相關(guān)服務(wù)端口方式2:
#?firewall-cmd --add-port=5432? ?--zone=pubilic? ?--permanent
# firewall-cmd --reload?
八、參考
PostgreSQL FAQ
https://wiki.postgresql.org/wiki/FAQ/zh-hant
Documentation /PostgreSQL 9.5/The pg_hba.conf File
https://www.postgresql.org/docs/9.5/auth-pg-hba-conf.html
https://my.oschina.net/liuyuanyuangogo/blog/497239
CentOS 7 安裝、配置、使用 PostgreSQL 9.5
http://www.itdecent.cn/p/7e95fd0bc91a
CentOS 7 安裝PostgreSQL 9.6
http://www.itdecent.cn/p/d26ae43446a2
Centos 7 安裝 PostgreSQL
https://www.cnblogs.com/stulzq/p/7766409.html
PostgreSQL與MySQL比較
http://bbs.chinaunix.net/thread-1688208-1-1.html
Linux downloads (Red Hat family)
https://www.postgresql.org/download/linux/redhat/
PostgreSQL RPM Building Project - Repository Packages
https://yum.postgresql.org/repopackages.php
PostgreSQL使用教程
http://www.itdecent.cn/p/d9fecdeaa759
http://www.itdecent.cn/p/f246dc45e6dc
http://www.itdecent.cn/p/bd6680e4abf3
psql使用入門
http://valleylord.github.io/post/201408-psql-basic
高效使用 PostgreSQL 命令行
https://www.atjiang.com/postgresql-on-the-command-line
PostgreSQL psql 命令語法參數(shù)說明
https://itbilu.com/database/postgre/410auo8xZ.html