在上一章中我們講了怎么安裝PostgreSQL,在數(shù)據(jù)庫安裝完成及啟動數(shù)據(jù)庫服務(wù)以后,需要連接到數(shù)據(jù)庫上對數(shù)據(jù)庫里的數(shù)據(jù)進(jìn)行操作。連接數(shù)據(jù)庫也可以分為兩種:
- 命令行連接,即PostgreSQL自帶的psql命令行工具
- 圖形工具連接,即各種軟件開發(fā)商提供的客戶端工具,常用的有PgAdmin,navicate for postgresql,前者是一款免費(fèi)工具,后者是一款收費(fèi)工具。大家根據(jù)自己的需要使用。
下面我們分別介紹這兩種連接方式。
1. 命令行連接
通過Linux系統(tǒng)平臺的命令行界面或Windows系統(tǒng)平臺的cmdline界面進(jìn)行連接。在上一章的內(nèi)容中,我們安裝了兩個軟件包,分別是 postgresql96 和 postgresql96-server 。postgresql96為我們提供了連接數(shù)據(jù)庫工具的客戶端軟件psql,postgresql96-server 是服務(wù)端軟件。psql命令有兩種格式,分別是:
psql postgres://username:password@host:port/dbname
psql -U username -h hostname -p port -d dbname
先解釋第一個命令格式里各個參數(shù):
- username:連接數(shù)據(jù)的用戶名,默認(rèn)值是postgres
- password:密碼,默認(rèn)值是postgres
- host:主機(jī)名,默認(rèn)值是localhost
- port:端口,默認(rèn)值是5432
- dbname:要連接的數(shù)據(jù)庫名,默認(rèn)值是postgres
第二個命令的各個參數(shù):
- -U username 用戶名,默認(rèn)值postgres
- -h hostname 主機(jī)名,默認(rèn)值localhost
- -p port 端口號,默認(rèn)值5432
- -d dbname 要連接的數(shù)據(jù)庫名,默認(rèn)值postgres
但是在知道了這個命令的基本用法以后,卻并不能直接連接到剛啟動的數(shù)據(jù)庫上,我們先嘗試一下:

可以看到連接直接失敗了,這是為什么呢?從出錯信息里我們看到,原因是認(rèn)證失敗。
查看了PostgreSQL的官網(wǎng)文檔以后才知道,PostgreSQL安裝及初始化完成以后,在它的配置文件里,默認(rèn)只允許本機(jī)連接,而且連接到服務(wù)器的認(rèn)證方式是peer和ident。如下圖所示:

這個配置是在data目錄下的pg_hba.conf文件里設(shè)置的,這個文件里的命令格式解釋如下:
- TYPE:指的是連接類型,一般有l(wèi)ocal和host兩種,local指的是本地連接,host指的是從遠(yuǎn)程主機(jī)連接或本地主機(jī)的localhost地址連接
- DATABASE:指的是要連接的數(shù)據(jù)庫,all表示所有,還可以使用具體的數(shù)據(jù)庫名,比如postgres
- USER:指的是用來連接的用戶名,all表示所有用戶,還可以使用具體的用戶名,比如postgres
- ADDRESS:指的是連接數(shù)據(jù)庫的客戶端IP地址來源,127.0.0.1/32表示只允許來自己本機(jī)的連接,0.0.0.0/0表示允許來自所有ip的連接,192.168.1.0/24表示允許192.168.1.1-192.168.1.255這個地址段的ip地址連接
- METHOD:表示連接的時候使用的認(rèn)證方式,常用的有trust,表示信任所有連接。md5,表示需要連接的客戶端提供一個加密密碼來登錄。
在linux系統(tǒng)上,data目錄默認(rèn)在/var/lib/psql/9.6/下。
本地連接非常好理解,就是從安裝PostgreSQL的主機(jī)上連接,那 peer 和 ident 認(rèn)證又是怎么回事呢?PostgreSQL的官方文檔的官方文檔上是這么說的:
peer認(rèn)證是安裝了PostgreSQL服務(wù)端的系統(tǒng),通過getpeereid()函數(shù)獲取連接客戶端的用戶名,然后通過map映射來進(jìn)行客戶認(rèn)證的一種認(rèn)證方式,要求只能用在客戶端和服務(wù)端都安裝在同一臺電腦上時,客戶端連接服務(wù)端的認(rèn)證。
ident認(rèn)證是客戶端從一個ident服務(wù)器上獲取一個用戶名,作為連接服務(wù)器端數(shù)據(jù)庫的用戶的認(rèn)證方式,也可能用到map映射。這種認(rèn)證方式只支持TCP/IP連接的方式。
上面的兩個認(rèn)證里都提到了map映射,map映射又指的什么呢?
map映射是用來將系統(tǒng)用戶映射到對應(yīng)的postgres數(shù)據(jù)庫用戶,用來限制指定的用戶使用指定的賬號來登陸。
介紹了這么多概念,可能不是很好理解,我們舉個例子說明并實(shí)際操作一下就明白了。map映射是在data目錄下的pg_ident.conf目錄里配置的,其基本定義格式如下:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
mm root postgres
- MAPNAME指的是映射的名稱
- SYSTEM-USERNAME就是系統(tǒng)用戶的名稱,比如root
- PG-USERNAME就是數(shù)據(jù)庫里存在的用戶名稱,比如postgres
上面定義的map意思就是,我定義了一個叫做mm的映射,當(dāng)客戶端用戶是root的時候,允許它用postgres用戶來登陸。
那么我們來嘗試連接一下。先將pg_hba.conf里的連接認(rèn)證方式修改為下面的格式:

然后重啟PostgreSQL服務(wù),再進(jìn)行連接。命令如下:
systemctl restart postgresql-9.6
psql -U postgres

可以看到,此時就能夠正常連接了。
我們嘗試一下切換到另外一個用戶test,然后再使用這個命令連接,命令如下:
su - test
psql -U postgres

可以看到,此時的用戶名不是root,就不能使用postgres用戶來連接,提示認(rèn)證失敗。那么再回到root用戶,然后嘗試一下PostgreSQL另外一種連接方式,命令如下:
psql postgres://postgres@
從上圖中可以看到,可以正常連接。
最后我們總結(jié)一下:
(1).PostgreSQL的連接命令psql有兩種連接方式。不帶-h參數(shù)或host參數(shù)時,是local連接,用的是peer認(rèn)證方式,通過unix或者linux系統(tǒng)的socket進(jìn)行連接。但是如果使用-h localhost、-h 127.0.0.1、postgres@localhost 或 postgres@127.0.0.1 這樣的格式,則會使用host類型,使用TCP/IP的方式連接,使用的是ident的認(rèn)證方式。我們剛才只修改了peer認(rèn)證使用map映射,因此ident認(rèn)證會提示出錯,如下所示:

(2)需要修改配置文件設(shè)置好連接方式和認(rèn)證方式,保證能夠正常連接。
上面所有的內(nèi)容就是命令行連接方式的內(nèi)容
2. 圖形界面連接
PostgreSQL官方提供了用來連接PostgreSQL數(shù)據(jù)庫的圖形界面工具,叫做pgAdmin,目前最新版本已經(jīng)是pgAdmin 4。但是在使用的時候發(fā)現(xiàn),pgAdmin 4使用的是web形式來連接數(shù)據(jù)庫,pgAdmin 4客戶端就像是一個專用的瀏覽器,連接的時候會很慢。而pgAdmin 3更像是一個客戶端工具,連接速度非???,切換數(shù)據(jù)庫和表的時候速度也更快。因此,這里我們使用pgAdmin3來講解,等到后面pgAdmin 4的版本有改進(jìn)了之后再更新這部分的內(nèi)容。
pgAdmin的官網(wǎng)地址是http://www.pgadmin.org,打開官網(wǎng)后,其頁面如下所示:

看介紹可以知道pgAdmin是世界上最流行和特性最豐富的PostgreSQL開源管理和開發(fā)平臺。我們點(diǎn)擊Download頁面,選擇pgAdmin 3的最新版本下載:

下載完成后直接安裝,安裝的過程就不過多說了,相信安裝軟件對于大家還是不難的。安裝好以后,打開pgAdmin 3的界面,如下所示:

- 左邊的對象瀏覽器是你的服務(wù)器頁面,pgAdmin 將服務(wù)器分為一個個服務(wù)器組,一個組里可以包含多臺服務(wù)器,便于管理。
- 右邊上面位置則是用來顯示服務(wù)器或服務(wù)器中的數(shù)據(jù)庫、表的各種詳細(xì)信息頁面
- 右邊下面位置則是用來執(zhí)行SQL語句的位置,這也是為什么pgAdmin被成為管理和開發(fā)平臺的原因之一。
點(diǎn)擊文件,選擇添加服務(wù)器:

在服務(wù)器信息頁面填寫服務(wù)器詳細(xì)信息:
- 名稱:你給這個服務(wù)器取的名字,比如244服務(wù)器
- 主機(jī):服務(wù)器的ip地址
- 端口號:默認(rèn)值5432,如果你的服務(wù)器修改了監(jiān)聽的端口好,則可以在這里修改
- 服務(wù):可不填
- 維護(hù)數(shù)據(jù)庫:即你要連接的數(shù)據(jù)庫
- 用戶名:用來連接的用戶名
- 密碼:連接的用戶的密碼
- 顏色:你可以選擇一種顏色來標(biāo)記你的服務(wù)器
-
組:為你服務(wù)器選擇的管理組
填寫完成后如下所示:
image.png
點(diǎn)擊確定以后就會自動連接數(shù)據(jù)庫,這個過程是默認(rèn)保存密碼的。因此會彈出一個提示,忽略提示即可。但是連接出錯了,如下所示:
image.png
前面我們講到,剛安裝好并初始化完畢后,PostgreSQL服務(wù)器默認(rèn)監(jiān)聽的地址是本地地址,即localhost。而pgAdmin我們一般都是在自己的電腦上安裝,然后遠(yuǎn)程連接到機(jī)房的物理服務(wù)器上。那怎么允許我們的機(jī)器可以連接到PostgreSQL服務(wù)器端呢?這里涉及到data目錄下兩個配置文件:
- postgresql.conf
- pg_hba.conf
在postgresql.conf中有一個listen_address的配置,它的默認(rèn)值如下:
image.png
默認(rèn)監(jiān)聽localhost,這就是為什么剛安裝好的PostgreSQL只能在本機(jī)上連接的原因。我們將這個地址修改為0.0.0.0或服務(wù)器的ip地址,如下所示:
listen_addresses = '192.168.1.244'
然后重啟服務(wù)器,查看一下PostgreSQL服務(wù)端監(jiān)聽的地址:
image.png
可以看到,確實(shí)監(jiān)聽在192.168.1.244這個地址上了。這個時候還有一個問題,那就是認(rèn)證的問題。剛才我們講過peer和ident兩種認(rèn)證方式,前者只適用于本地連接,而后者則需要從ident服務(wù)器上獲取用戶名。都不適合我們當(dāng)前的連接方式,那么還需要再修改認(rèn)證方式,這里要介紹的認(rèn)證方式是md5和trusted。
md5 認(rèn)證方式是通過賬號密碼的方式認(rèn)證,但是密碼的傳輸過程是使用md5加密的
trust 認(rèn)證方式則是不進(jìn)行任何認(rèn)證,默認(rèn)信任所有的連接,屬于最不安全的一種認(rèn)證方式。
但是從第一章到現(xiàn)在,我們都沒講過PostgreSQL的密碼設(shè)置問題,也沒有為數(shù)據(jù)庫設(shè)置一個密碼,那么我們只能先使用trusted的認(rèn)證方式先連接到數(shù)據(jù)庫上,再考慮修改數(shù)據(jù)庫密碼的問題。修改pg_hba.conf中的連接方式如下:
host all all trust
重啟服務(wù)器,再從pgAdmin上連接:

此時可以連接成功,連接成功后,服務(wù)器的信息會出現(xiàn)在左邊窗口的服務(wù)器組里。雙擊服務(wù)器名稱,就能看到服務(wù)器的詳細(xì)信息,如下所示:

以上就是所有圖形工具連接PostgreSQL的內(nèi)容。
最后來總結(jié)一下:
要想成功連接到安裝好的數(shù)據(jù)庫上,需要考慮到下面三個配置文件
- pg_hba.conf:用來配置連接位置、認(rèn)證方式
- postgresql.conf:用來配置服務(wù)器端監(jiān)聽的地址和端口,配置選項(xiàng)是listen_addresses和listen_port。
- pg_ident.conf:用來設(shè)置ident和peer認(rèn)證方式的用戶名映射
3. 需要注意的問題
- 一定要理解本地連接、遠(yuǎn)程連接的概念以及和pg_hba.conf中的TYPE類型進(jìn)行對應(yīng)
- 從自己本機(jī)連接服務(wù)器上的PostgreSQL的時候,要考慮服務(wù)器上面有沒有防火墻,如果有的話,要在防火墻上將PostgreSQL監(jiān)聽的端口放開。RHEL7 放開5432端口的命令如下:
firewall-cmd --zone=public --add-port=5432/tcp --permanent
firewall-cmd --reload



