PostgreSQL9.4在RHEL上的安裝

行百里er發表於2016-06-21

這次在測試中需要使用PostgreSQL來驗證某一具體功能是否正確,需要使用較為新一點的版本,因此就藉此機會:

  • 安裝和配置PostgreSQL;
  • 學習一些基本的用法。

安裝PostgreSQL

先是憑著直覺去了PostgreSQL的官網 翻了翻文件,下載了兩個比較常用版本的Manual,然後剛要著手安裝,卻發現需要使用原始碼編譯的方式!

使用原始碼在RHEL安裝PostgreSQL

我其實並不排斥使用原始碼編譯並安裝應用,只是覺得這個方式比較慢,且容易出錯(對我而言),如果有更好的alternative approach,我當然不會使用原始碼來安裝它。

這裡不介紹太多,如果需要的話,大家可以自行下載PostgreSQL Manual文件,裡面大概第15章有較為詳細的介紹,不再贅述了。

使用rpm packages安裝PostgreSQL

儘管PostgreSQL官網沒有明顯的連結,隨便一個搜尋引擎就能很容易搜尋到這樣一個網站PostgreSQL RPM很明顯,這個是PostgreSQL官網下的一個二級網站,費解的是不知道為什麼沒有放到明顯的位置,不知道是否原始碼編譯方式是否能夠更有效地利用系統資源(猜測)。

下面介紹如何使用rpm packages在RHEL5上安裝PostgreSQL。按照推薦,安裝過程其實非常簡單:

推薦的安裝方式

-1,使用wget獲取到包含PostgreSQL rpm mirror配置的package

wget http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm

-2, 安裝所獲取到的package

sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

-3,使用yum groupinstall安裝PostgreSQL

sudo yum groupinstall "PostgreSQL Database Server 9.4 PGDG"

如果你的網路足夠的好運,此處你應該已經安裝成功了,否則可能會提示無可用的mirror這樣的錯誤了。

不幸的是,我的網路沒那麼好運氣! 我在安裝過程中卻發現了我的伺服器無法連線到mirror,下載不到安裝所需要的rpm package。不知道是否因為這些mirror是否都被擋在了牆外,不得不workaround:

有CN特色的安裝方式

上文中講到提示無法找到可用的mirror,之所以要找mirror是因為需要下載對應的package,那麼我幫你下載到本地,然後直接安裝就可以了(就是這麼簡單):
-1, 下載PostgreSQL所需要的Server, Libs, Contrib, Client等rpm packages

 - *1.1 這裡[PostgreSQL for RHEL5](http://yum.postgresql.org/9.4/redhat/rhel-5-x86_64/repoview/postgresqldbserver94.group.html) 可以下載上述所需要的rpm檔案們;* 
 - *1.2 最好被他們都放在同一個目錄下,這樣做的好處是即使rpm packages直接有依賴關係,也可以讓系統自己去決定安裝先後順序。 *

-2,使用yum安裝所下載到的rpm package

sudo yum install *.rpm

然後一路確認下去,最後就得到了安裝成功的提示了。

So, now the installed PostgreSQL instance is ready for use!

簡單配置PostgreSQL

成功安裝了PostgreSQL之後,現在可以使用它來測試了:一般情況下,安裝之後,需要啟動服務,然後方能正常使用。先來看看安裝PostgreSQL之後,是否有服務安裝了,RHEL下,這些服務通常會在/etc/init.d/目錄下有對應的啟動指令碼。檢視後發現/etc/init.d/目錄下多出了一個檔案postgresql-9.4

還是慣例,以root身份啟動這個服務,不過這裡有可能會提示你啟動失敗,是因為PostgreSQL 9.4會要求先初始化資料庫,然後才能提供服務,提示資訊如下:

/var/lib/pgsql/9.4/data is missing. Use "service postgresql-9.4 initdb" to initialize the cluster first.

所以,安裝PostgreSQL 9.4之後,正確的使用流程應該是:
-1, 先初始化db

sudo service postgresql-9.4 initdb

此處需要執行一點時間, Be patient!

-2,啟動PostgreSQL9.4服務

sudo service postgresql-9.4 start

此處應該能看到綠色的[OK]啦!然後就可以使用PostgreSQL了!

-3, 驗證啟動結果

- 3.1 安裝PostgreSQL成功之後,系統就會自動建立使用者postgres這個使用者,可以通過檢視`/etc/passwd`這個檔案,確定是否正確建立了這個使用者;
- 3.2 切換到使用者postgres登入,使用如下命令檢視是否可以正常登入到PostgreSQL資料庫,如果提示“postgres=#”則表示已經正確建立了postgres資料庫並能正確使用這個資料庫了!
-bash-3.2$ psql
psql (9.4.8)
Type "help" for help.
postgres=#

-4,建立使用者和庫
現在可以建立業務所使用的使用者和資料庫了,其實建立過程也比較簡單(也許沒有追求太深入,留後深造!),下面給出主要的命令:

- 4.1 先在root使用者下建立一個系統使用者 wh
useradd -s /bin/bash -d /home/wh -p passw0rd wh
- 4.2 然後在postgres使用者下連線到PostgreSQL Server,執行如下的使用者建立命令:
-bash-3.2$ psql
psql (9.4.8)
Type "help" for help.

postgres=# CREATE USER wh WITH PASSWORD `passw0rd`;
- 4.3 建立資料庫並授權給所建立的使用者    
-bash-3.2$ psql
psql (9.4.8)
Type "help" for help.

postgres=# CREATE DATABASE test_db OWNER wh;
postgres=# GRANT ALL PRIVILEGES ON DATABASE test_db TO wh;
postgres=# q
- 4.4 切換到wh在使用者,嘗試連線到資料庫
-bash-3.2$ psql test_db
psql (9.4.8)
Type "help" for help.

test_db=>

至此,已經能夠正確使用新建立的使用者wh成功連線到新建立的PostgreSQL資料庫了!

客戶端訪問PostgreSQL Server

通過上文所做的操作,已經能夠讓你在PostgreSQL所在機器本身操作建立的資料庫了,但是,通常情況下,我們需要從其他的機器連線到資料庫伺服器,以便更好的讓應用伺服器和資料庫伺服器都能發揮出更佳的效能。

通過客戶端連線PostgreSQL

  • 1, 通過PostgreSQL Client嘗試連線到PostgreSQL Server,卻被提示無法連線:
$ psql -h 192.168.1.101 -p 5432 -U wh test_db -W
Password for user wh:
psql: could not connect to server: Connection refused
    Is the server running on host "192.168.1.101" and accepting
    TCP/IP connections on port 5432?

其原因是因為預設情況下,PostgreSQL雖然正確啟動了,資料庫伺服器本身也能夠正常的訪問,但是,其他的機器並不能通過TCP/IP連線到PostgreSQL服務,預設它並未監聽任何TCP/IP埠。

  • 2, 這裡就需要配置TCP/IP監聽,以便允許其他機器訪問PostgreSQL服務:
sudo vim /var/lib/pgsql/9.4/data/postgresql.conf
# 1, 修改listen_addresses = `*`
# 2, 修改port = 5432
# 3, 取消對應行的註釋

# 重啟PostgreSQL服務
sudo service postgresql-9.4 restart
Stopping postgresql-9.4 service:                           [  OK  ]
Starting postgresql-9.4 service:                           [  OK  ]
  • 3, 再次從客戶端嘗試連線到PostgreSQL服務
$ psql -h 192.168.1.101 -p 5432 -U wh test_db -W
Password for user wh:
psql: FATAL:  no pg_hba.conf entry for host "192.168.1.102", user "wh", database "test_db", SSL off

出現這個錯誤有兩方面的解釋:

  • 首先,埠5432已經開放監聽了,並且接收到了PostgreSQL客戶端的連線請求;
  • 其次, 驗證客戶端連線合法性出錯了,因為客戶端“192.168.1.102”並未被允許連線。
  • 4,新增客戶端到白名單
    在PostgreSQL伺服器上修改配置檔案/var/lib/pgsql/9.4/data/pg_hba.conf
sudo vim /var/lib/pgsql/9.4/data/pg_hba.conf
# 新增允許IP 192.168.1.102連線的配置項
host    all       all       192.168.1.102/32    md5

回到客戶端再次嘗試連線,你就會發現這次是可以成功連線到PostgreSQL服務了。

$ psql -h 192.168.1.101 -p 5432 -U wh test_db -W
Password for user wh:
psql (9.4.8)
Type "help" for help.

test_db=>

至此,PostgreSQL已經可以在遠端Client正常使用了。


相關文章