Ubuntu 20.04下离线安装PostgreSQL

  首先,我的环境是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
    # 进行初始化
    /opt/postgresql-16.2/bin/initdb -D /opt/postgresql-16.2/data
    /opt/postgresql-16.2/bin/pg_ctl -D /opt/postgresql-16.2/data -l /opt/postgresql-16.2/logs/postgresql.log start
    /opt/postgresql-16.2/bin/createdb test
    /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
    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/

  但是个人推荐使用容器化来安装部署!仓库介绍:https://github.com/dpage/pgadmin4

  先获取镜像: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表示不限制

   更多参数配置可以参考官网的文档:https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html

  然后启动docker compose up -d,然后可以在web页面访问宿主机的8081端口就可以访问pgAdmin也页面了

  

posted @ 2024-04-14 18:58  没有星星的夏季  阅读(2054)  评论(1编辑  收藏  举报