適用場景:舊系統維護、特定編譯選項需求、套件管理器無對應版本。生產環境建議使用官方 APT 倉庫安裝支援版本 (15/16)。
# 更新套件索引
sudo apt-get update
# 核心編譯工具鏈
sudo apt-get install -y build-essential libtool autoconf
# PostgreSQL 必要依賴庫
sudo apt-get install -y \
libreadline6-dev \ # psql 命令列編輯/歷史
zlib1g-dev \ # 壓縮支援
libssl-dev \ # SSL 連線加密
libkrb5-dev \ # Kerberos 驗證
libpam0g-dev \ # PAM 驗證
libxml2-dev \ # XML 功能
libxslt-dev \ # XSLT 功能
python-dev \ # PL/Python
perl \ # PL/Perl
tcl-dev \ # PL/Tcl
flex bison # 詞法/語法分析器產生器
# 選用:文件產生工具
sudo apt-get install -y docbook-dsssl docbook-xsl jade
# 建立工作目錄
mkdir -p ~/src && cd ~/src
# 下載原始碼 (官方 FTP)
wget https://ftp.postgresql.org/pub/source/v8.2.5/postgresql-8.2.5.tar.gz
# 解壓縮
tar -xzf postgresql-8.2.5.tar.gz
cd postgresql-8.2.5
# 配置編譯選項
./configure \
--prefix=/usr/local/pgsql-8.2.5 \
--with-openssl \
--with-libxml \
--with-libxslt \
--enable-thread-safety \
--with-perl \
--with-python \
--with-tcl \
--with-krb5 \
--with-pam \
--docdir=/usr/local/pgsql-8.2.5/share/doc
# 編譯 (利用多核心加速)
make -j$(nproc)
# 安裝 (需 root 權限)
sudo make install
# 建立軟連結方便管理
sudo ln -sf /usr/local/pgsql-8.2.5 /usr/local/pgsql
# 建立系統帳號 (無登入殼層、無家目錄)
sudo useradd -r -s /bin/false -d /usr/local/pgsql/data -c "PostgreSQL Server" postgres
# 建立資料目錄並設定權限
sudo mkdir -p /usr/local/pgsql/data
sudo chown postgres:postgres /usr/local/pgsql/data
sudo chmod 700 /usr/local/pgsql/data
# 切換到 postgres 使用者
sudo -u postgres -i
# 初始化 (指定編碼、語系、資料目錄)
/usr/local/pgsql/bin/initdb \
-D /usr/local/pgsql/data \
-E UTF8 \
--locale=zh_TW.UTF-8 \
-U postgres \
-W # 提示輸入超級使用者密碼
# 或無互動模式:
# /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E UTF8 --locale=C -U postgres -A md5
# 啟動 (前景模式,除錯用)
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
# 啟動 (背景守護進程模式,生產用)
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/pg_log/startup.log start
# 停止
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -m fast stop
# 重新載入設定
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data reload
# 狀態檢查
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data status
sudo tee /etc/systemd/system/postgresql-8.2.service <<'EOF'
[Unit]
Description=PostgreSQL 8.2.5 Database Server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -l ${PGDATA}/pg_log/startup.log
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA}
TimeoutSec=300
[Install]
WantedBy=multi-user.target
EOF
# 重載 systemd、啟用開機自動啟動、啟動服務
sudo systemctl daemon-reload
sudo systemctl enable postgresql-8.2
sudo systemctl start postgresql-8.2
sudo systemctl status postgresql-8.2
# UFW 開放埠
sudo ufw allow 5432/tcp
# postgresql.conf 允許遠端連線
sudo -u postgres sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /usr/local/pgsql/data/postgresql.conf
# pg_hba.conf 允許密碼驗證 (生產環境請限制 IP 範圍)
sudo -u postgres tee -a /usr/local/pgsql/data/pg_hba.conf <<'EOF'
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
host all all ::/0 md5
EOF
# 重新載入設定
sudo systemctl reload postgresql-8.2
# Ubuntu 套件庫版本 (可能較舊)
sudo apt-get install -y pgadmin3
# 或從官網下載較新版 .deb 安裝
# wget https://ftp.postgresql.org/pub/pgadmin3/release/v1.22.2/ubuntu/pgadmin3_1.22.2-1_amd64.deb
# sudo dpkg -i pgadmin3_*.deb
# sudo apt-get install -f
# 連線測試
/usr/local/pgsql/bin/psql -U postgres -d postgres -c "SELECT version();"
# 建立測試資料庫與表
/usr/local/pgsql/bin/createdb -U postgres testdb
/usr/local/pgsql/bin/psql -U postgres -d testdb -c "
CREATE TABLE test (id SERIAL PRIMARY KEY, name TEXT, created TIMESTAMP DEFAULT NOW());
INSERT INTO test (name) VALUES ('Ubuntu 編譯安裝測試');
SELECT * FROM test;"
# 備份測試
/usr/local/pgsql/bin/pg_dump -U postgres testdb > /tmp/testdb_backup.sql
# 記憶體設定 (假設 4GB RAM 專用資料庫伺服器)
shared_buffers = 1GB # 25% RAM
work_mem = 16MB
maintenance_work_mem = 256MB
effective_cache_size = 3GB # 75% RAM
# WAL / 檢查點
checkpoint_segments = 32
wal_buffers = 16MB
checkpoint_completion_target = 0.9
# 查詢規劃器
random_page_cost = 1.1 # SSD 優化
effective_io_concurrency = 200 # SSD 併發
# 平行查詢 (8.2 不支援,9.6+ 才有)
# max_parallel_workers_per_gather = 4
# 日誌
log_min_duration_statement = 1000
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
| 問題 | 解決方案 |
|---|---|
| configure: error: readline library not found | 安裝 libreadline6-dev (Ubuntu 18.04+) 或 libreadline5-dev (舊版) |
| configure: error: zlib library not found | 安裝 zlib1g-dev |
| make: *** [postgres] Error 1 (ld: cannot find -lssl) | 安裝 libssl-dev (Ubuntu 20.04+ 需 libssl1.1 相容) |
| initdb: could not access directory: Permission denied | 資料目錄擁有者非 postgres、權限非 700、SELinux/AppArmor 阻擋 |
| psql: could not connect to server: No such file or directory | 服務未啟、socket 目錄權限、/tmp/.s.PGSQL.5432 不存在 |
| pgAdmin 連線失敗 | pg_hba.conf 未允許、postgresql.conf listen_addresses、防火牆 |