首先,我的環境是Ubuntu 20.04
如果是線上安裝,根據官網的介紹很簡單
# 安裝包
sudo apt update
sudo apt install wget gnupg
# 匯入倉庫
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# 匯入秘鑰
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# 更新倉庫並安裝
sudo apt update
sudo apt -y install postgresql
不過這種方式安裝有個弊端,就是往往它安裝的版本都比較舊(當前是PostgreSQL 12),如果要按照新版的PostgreSQL,那麼就需要使用原始碼進行安裝了
注:為了方便使用,本文所編譯的安裝包也分享出來了,包括所需要的依賴,需要的可以去下載:
地址連結:https://pan.baidu.com/s/14pkGp_GN32WUNUtXY9F-rA (提取碼:3fvn)
編譯與安裝
PostgreSQL原始碼可以從官網下載,下載地址:https://www.postgresql.org/ftp/source/
這裡我採用PostgreSQL 16.2來安裝:
然後準備編譯環境,根據官網的介紹(https://www.postgresql.org/docs/current/installation.html):
# 安裝編譯環境(期間會選擇時區,亞洲輸入6,上海輸入70)
sudo apt update
sudo apt install make gcc tar pkg-config libicu-dev libreadline-dev zlib1g-dev
# 解壓
tar -zxf postgresql-16.2.tar.gz
# 切換目錄
cd postgresql-16.2
這裡環境的按照一定要按照./configure
提示來安裝,缺少哪個就安裝哪個
# 配置:--prefix表示存放編譯後的檔案目錄
sudo ./configure --prefix=/opt/postgresql-16.2
# 編譯
sudo make
# 安裝
sudo make install
編譯可能需要幾分鐘,執行完成之後,可以看到/opt/postgresql-16.2
目錄下的檔案內容:
現在我們可以把這整個目錄打包一下,以後就可以把它直接發到伺服器上去部署了:tar -zcf postgresql-16.2-bin.tar.gz -C /opt .
那麼怎麼安裝部署呢?
我這裡還是在Ubuntu20.04上安裝部署,根據官網提示(https://www.postgresql.org/docs/16/install-make.html),我們這麼來操作:
# 解壓到一個目錄,比如我這裡是/opt
sudo tar -zxf postgresql-16.2-bin.tar.gz -C /opt
# 建立資料目錄
sudo mkdir -p /opt/postgresql-16.2/data /opt/postgresql-16.2/logs
# 建立使用者(輸入密碼後一路回車)
adduser postgres
# 授權
sudo chown postgres /opt/postgresql-16.2/data /opt/postgresql-16.2/logs
# 切換使用者
su - postgres
# 進行初始化
sudo /opt/postgresql-16.2/bin/initdb -D /opt/postgresql-16.2/data
sudo /opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data -l /opt/postgresql-16.2/logs/postgresql.log start
sudo /opt/postgresql-16.2/bin/createdb test
sudo /opt/postgresql-16.2/bin/psql test
這裡可能會報錯,比如:/opt/postgresql-16.2/bin/initdb: error while loading shared libraries: libicuuc.so.66: cannot open shared object file: No such file or directory
這個就是說缺少相關依賴導致的,這個提示就是說缺少icu相關的依賴,這樣的話我們就需要按照它,一個簡單的方法是去倉庫找依賴包進行安裝,我用的Ubuntu,所以我就去它的apt倉庫找,地址:https://ubuntu.pkgs.org,找到之後把它下載下來,然後使用dpkg安裝就好了,要完成初始化,需要的包有:
# 先去搜尋下載這些包,或者按照下面的命令下載(Ubuntu20.04):
# icu相關,需要搜尋下載的包有:tzdata、libicu66、icu-devtools
wget http://archive.ubuntu.com/ubuntu/pool/main/i/icu/icu-devtools_66.1-2ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu66_66.1-2ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/t/tzdata/tzdata_2019c-3ubuntu1_all.deb
# 接著使用dpkg進行安裝
sudo dpkg -i tzdata_2019c-3ubuntu1_all.deb
sudo dpkg -i libicu66_66.1-2ubuntu2_amd64.deb
dpkg -i icu-devtools_66.1-2ubuntu2_amd64.deb
# readline相關,需要搜尋下載的包有:libtinfo6、libncurses6、libncursesw6、libc6、libc-dev-bin、linux-libc-dev、
# libcrypt-dev、libc6-dev、libncurses-dev、readline-common、libreadline8、libreadline-dev
wget http://archive.ubuntu.com/ubuntu/pool/main/n/ncurses/libtinfo6_6.2-0ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/n/ncurses/libncurses6_6.2-0ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/n/ncurses/libncursesw6_6.2-0ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc6-dev_2.31-0ubuntu9_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc-dev-bin_2.31-0ubuntu9_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/l/linux/linux-libc-dev_5.4.0-26.30_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/libx/libxcrypt/libcrypt-dev_4.4.10-10ubuntu4_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/n/ncurses/libncurses-dev_6.2-0ubuntu2_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/r/readline/readline-common_8.0-4_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/r/readline/libreadline8_8.0-4_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/r/readline/libreadline-dev_8.0-4_amd64.deb
dpkg -i libtinfo6_6.2-0ubuntu2_amd64.deb
dpkg -i libncurses6_6.2-0ubuntu2_amd64.deb
dpki -i libncursesw6_6.2-0ubuntu2_amd64.deb
dpkg -i libncursesw6_6.2-0ubuntu2_amd64.deb
dpkg -i libc6_2.31-0ubuntu9_amd64.deb
dpkg -i libc-dev-bin_2.31-0ubuntu9_amd64.deb
dpkg -i linux-libc-dev_5.4.0-26.30_amd64.deb
dpkg -i libcrypt-dev_4.4.10-10ubuntu4_amd64.deb
dpkg -i libc6-dev_2.31-0ubuntu9_amd64.deb
dpkg -i libncurses-dev_6.2-0ubuntu2_amd64.deb
dpkg -i libreadline-dev_8.0-4_amd64.deb
注意,有些包系統可能已經安裝過了,那就不需要再安裝了,可以跳過。
# 啟動
/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data start
# 停止
/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data stop
# 重啟
/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data restart
# 檢視狀態
/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data status
此外,為了方便程式啟停,我們做一個服務單元(postgresql.service):
[Unit]
Description=PostgreSQL
After=network-online.target
[Service]
Type=forking
WorkingDirectory=/opt/postgresql-16.2/bin
PIDFile=/opt/postgresql-16.2/data/postgresql.pid
User=postgres
ExecStart=/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data start
ExecStop=/opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data stop
Restart=always
RestartSec=40s
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=postgresql
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置
接著說下配置,首先,修改data/pg_hba.conf
,本地連線不需要密碼,允許所有的遠端連線並且所有的遠端連線需要密碼:
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 scram-sha-256
修改data/postgresql.conf
,主要是修改連線配置等:
# 繫結埠號
listen_addresses = '*'
# 時區(如果時區不對,那麼使用postgresql時,像NOW()等函式可能不是北京時間)
timezone = 'Asia/Shanghai'
log_timezone = 'Asia/Shanghai'
# 日誌輸出型別(stderr表示標準輸出)
log_destination = 'stderr'
# 開啟或者關閉日誌輸出(off是關閉)
logging_collector = on
# 日誌檔案所在的目錄
log_directory = '/opt/postgresql-16.2/logs'
# 日誌檔名的格式
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 日誌輪換策略(30d表示30天生成一個日誌檔案)
log_rotation_age = 30d
# 日誌輪換策略(100MB表示日誌檔案大小達到了這個限制就建立一個新日誌檔案)
log_rotation_size = 100MB
注:如果在配置中修改了時區,重啟後還不生效,那麼我們可以手動改下就好了:
# 顯示當前時區
SHOW timezone;
# 設定時區
SET TIMEZONE='Asia/Shanghai';
# 修改某個資料庫的時區
ALTER DATABASE yourdb SET TIMEZONE='Asia/Shanghai';
那麼剩下的就是新增使用者和授權了
首先在本地連線PostgreSQL,前面已經在data/pg_hba.conf
中配置本地連線不需要密碼了,所以可以直接連線上:
# 切換到postgres使用者
su - postgres
# 登入
/opt/postgresql-16.2/bin/psql
# 新增使用者
CREATE USER root WITH PASSWORD '123456';
# 授權
GRANT CONNECT ON DATABASE test TO root;
# 授權超管
ALTER USER root WITH SUPERUSER;
連線資料
我們可以使用命令列連線,比如:
# 使用命令列連線
/opt/postgresql-16.2/bin/psql -h localhost -p 5432 -U root -d test -W 123456
# 如果是本地,可以不需要密碼直接連線(因為我們有配置)
/opt/postgresql-16.2/bin/psql -h localhost -p 5432 -U root -d test -w
其實官方還給我們提供了一個網頁版的連線工具:pgAdmin4,你可以選擇去官網下載安裝:https://www.pgadmin.org/download/
但是個人推薦使用容器化來安裝部署!
先獲取映象:sudo docker pull dpage/pgadmin4
然後構建一個docker-compose.yml:
version: '2'
services:
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin
restart: always
ports:
- 8081:8081
environment:
PGADMIN_DEFAULT_EMAIL: test@your.com
PGADMIN_DEFAULT_PASSWORD: 123456
PGADMIN_LISTEN_ADDRESS: 0.0.0.0
PGADMIN_LISTEN_PORT: 8081
GUNICORN_LIMIT_REQUEST_LINE: 0
PGADMIN_DEFAULT_EMAIL:pgAdmin4頁面登入的使用者名稱
PGADMIN_DEFAULT_PASSWORD:pgAdmin4頁面登入密碼
PGADMIN_LISTEN_ADDRESS:pgAdmin4繫結地址,建議0.0.0.0
PGADMIN_LISTEN_PORT:pgAdmin4繫結的埠
GUNICORN_LIMIT_REQUEST_LINE:請求長度限制,0表示不限制
然後啟動docker compose up -d
,然後可以在web頁面訪問宿主機的8081埠就可以訪問pgAdmin也頁面了