我成功在 Ubuntu ARM32 上編譯安裝了最新版 PostgreSQL ( 17.4 )。

這篇文章中的命令主要來源於 PostgreSQL 官方文檔。我已經實際測試過這篇文章中的每個命令。

可以在這裡看到能夠成功安裝的系統 PostgreSQL 构建农场

編譯安裝 PostgreSQL 17.4

1. 創建目錄並進入目錄

mkdir postgresql && cd postgresql
  • mkdir postgresql:創建一個名為 postgresql 的新目錄。
  • cd postgresql:進入剛剛創建的 postgresql 目錄。

2. 下載 PostgreSQL 原始碼

wget https://ftp.postgresql.org/pub/source/v17.4/postgresql-17.4.tar.bz2
  • wget:從指定的 URL 下載檔案。
  • https://..../postgresql-17.4.tar.bz2:PostgreSQL 17.4 版本的壓縮原始碼包的下載連結。如果連結失效,您可以自行查找新連結。

3. 解壓縮原始碼包

tar xjf postgresql-17.4.tar.bz2
  • tar:用於處理 .tar 壓縮檔案。

  • xjf:解壓縮 tar 檔案的選項:

    • x:解壓縮檔案。
    • j:使用 bzip2 壓縮格式(.bz2)。
    • f:指定要解壓縮的檔案。
  • postgresql-17.4.tar.bz2:要解壓縮的檔案名。

4. 進入解壓縮後的原始碼目錄

cd postgresql-17.4
  • 進入解壓縮後的 PostgreSQL 17.4 原始碼目錄。

5. 安裝依賴包

sudo apt install libssl-dev libsystemd-dev libxml2-dev libreadline-dev
  • sudo apt install:使用 apt 包管理器安裝軟體包。
  • libssl-devlibsystemd-devlibxml2-devlibreadline-dev:安裝 PostgreSQL 編譯所需的開發庫,分別是 SSL 庫、Systemd 庫、XML 庫和 Readline 庫。

6. 配置編譯選項

./configure --prefix=/usr/local/pgsql --with-openssl --with-libxml --with-systemd
  • ./configure:準備 PostgreSQL 的編譯環境。
  • --prefix=/usr/local/pgsql:指定 PostgreSQL 安裝目錄為 /usr/local/pgsql
  • --with-openssl:啟用 OpenSSL 支援。
  • --with-libxml:啟用 XML 支援。
  • --with-systemd:啟用 Systemd 支援。

7. 編譯原始碼

make -j$(nproc)
  • make:啟動編譯過程。
  • -j$(nproc):使用 nproc(系統的 CPU 核心數)來並行執行編譯任務,加速編譯過程。

8. 安裝 PostgreSQL

sudo make install
  • sudo make install:使用 sudo 以管理員權限執行安裝,make install 將編譯好的檔案安裝到系統中,安裝到前面 ./configure 命令中指定的 /usr/local/pgsql 目錄。

9. 設定環境變數

使用文字編輯器 1. 編輯 /etc/profile 檔案

sudo nano /etc/profile
  • sudo:表示以超級使用者(管理員)權限運行命令。因為修改 /etc/profile 檔案需要管理員權限。
  • nano:這是一個文字編輯器,常用於終端環境中編輯檔案。
  • /etc/profile:這是一個全域配置文件,用於設定系統範圍內的環境變數和啟動配置。所有使用者登入系統時,都會執行這個檔案中的設定。
  1. 添加環境變數
export PATH=/usr/local/pgsql/bin:$PATH
  • export:用於設定一個環境變數,使其在當前和子程序中可用。
  • PATH:這是一個環境變數,包含了系統中可執行檔案的目錄列表。系統在執行命令時,會根據 PATH 變數中列出的目錄來查找命令。
  • /usr/local/pgsql/bin:這是 PostgreSQL 資料庫的可執行檔案目錄,添加它意味著在該目錄下的可執行檔案(如 psql)會被系統識別。
  • :$PATH:這裡 $PATH 代表原本已有的路徑,將新的路徑 /usr/local/pgsql/bin 加入到原有 PATH 的前面。這樣,系統會先檢查新的目錄,然後再檢查原有路徑。

這段命令的作用是將 PostgreSQL 的可執行檔案目錄添加到系統的環境變數 PATH 中,確保在命令行中可以直接運行 PostgreSQL 的命令(如 psql),而不需要提供完整路徑。修改後的設定會對所有使用者生效

初始化 PostgreSQL 資料庫

這些命令主要用於在 Linux 伺服器上手動配置 PostgreSQL 資料庫伺服器,包括創建 PostgreSQL 系統使用者、初始化資料庫、啟動資料庫服務,並將其註冊為 systemd 服務,以便開機自動啟動。

1. 創建 PostgreSQL 使用者

sudo useradd -m -U -r -d /var/lib/postgresql -s /bin/bash postgres
  • sudo:以超級使用者權限執行命令。
  • useradd:創建新使用者。
  • -m:創建使用者的 home 目錄。
  • -U:同時創建一個與使用者名相同的使用者群組。
  • -r:創建一個系統使用者(系統使用者 UID 低於 1000,不用於登入)。
  • -d /var/lib/postgresql:指定 home 目錄為 /var/lib/postgresql
  • -s /bin/bash:指定 shell 為 /bin/bash
  • postgres:使用者名。

該命令創建了一個 PostgreSQL 專用的系統使用者 postgres


2. 更改 PostgreSQL 目錄的所有者

sudo chown postgres /usr/local/pgsql
  • chown postgres /usr/local/pgsql:將 /usr/local/pgsql 目錄的所有者更改為 postgres 使用者,使其可以讀寫該目錄。

3. 設定 PostgreSQL 使用者的密碼

sudo passwd postgres
  • passwd postgres:修改 postgres 使用者的密碼。

4. 切換到 PostgreSQL 使用者

su postgres
  • su postgres:切換到 postgres 使用者,以便使用 PostgreSQL 相關命令。

5. 初始化資料庫

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
  • initdb -D /usr/local/pgsql/data:在 /usr/local/pgsql/data 目錄中初始化資料庫儲存。

6. 啟動 PostgreSQL 資料庫

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  • postgres -D /usr/local/pgsql/data:以 postgres 程序啟動資料庫,資料儲存在 /usr/local/pgsql/data 目錄。

7. 在另一個終端會話中,進入資料庫

su postgres
/usr/local/pgsql/bin/psql
  • psql:PostgreSQL 的命令行互動工具,進入資料庫 shell。

8. 設定資料庫使用者的密碼

ALTER USER postgres WITH PASSWORD 'your_new_password';
  • 修改資料庫使用者 postgres 的密碼。

9. 創建 systemd 服務

sudo nano /etc/systemd/system/postgresql.service
  • nano /etc/systemd/system/postgresql.service:編輯 systemd 配置文件,讓 PostgreSQL 可以作為服務運行。

配置文件內容:

[Unit]
Description=PostgreSQL server
#Documentation=man:postgres(1)
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target
  • Description=PostgreSQL server:描述該服務是 PostgreSQL 伺服器。
  • After=network-online.target:等待網路連接可用後再啟動 PostgreSQL。
  • User=postgres:以 postgres 使用者運行。
  • ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data:啟動 PostgreSQL 伺服器。
  • ExecReload=/bin/kill -HUP $MAINPID:重載時發送 HUP 信號。
  • KillMode=mixed:混合終止模式。
  • KillSignal=SIGINT:終止 PostgreSQL 程序的信號。
  • TimeoutSec=infinity:超時設定為無限。

10. 啟用 systemd 服務

sudo systemctl daemon-reload
sudo systemctl start postgresql
sudo systemctl status postgresql
sudo systemctl enable postgresql
  • daemon-reload:重新載入 systemd 配置,使新的 postgresql.service 生效。
  • start postgresql:啟動 PostgreSQL 服務。
  • status postgresql:檢查 PostgreSQL 運行狀態。
  • enable postgresql:開機自動啟動 PostgreSQL。

這些命令的目的是:

  1. 創建一個專門用於運行 PostgreSQL 的 postgres 使用者。
  2. 初始化資料庫儲存目錄。
  3. 啟動 PostgreSQL 資料庫,並進入 psql 互動式命令行。
  4. 配置 systemd 使 PostgreSQL 作為系統服務運行,並支持開機自啟動。

這樣 PostgreSQL 伺服器就能正常運行,並可以在系統啟動時自動啟動。

參考資料

PostgreSQL: Documentation: 17: Chapter 17. Installation from Source Code