Ubuntu下離線安裝PostgreSQL

没有星星的夏季發表於2024-04-14

  首先,我的環境是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來安裝:

  Ubuntu下離線安裝PostgreSQL

  然後準備編譯環境,根據官網的介紹(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目錄下的檔案內容:

  Ubuntu下離線安裝PostgreSQL

  現在我們可以把這整個目錄打包一下,以後就可以把它直接發到伺服器上去部署了: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,本地連線不需要密碼,允許所有的遠端連線並且所有的遠端連線需要密碼:

  Ubuntu下離線安裝PostgreSQL

    # 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也頁面了

  Ubuntu下離線安裝PostgreSQL

相關文章