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也页面了