CentOS7安装PostgreSQL12

前言

不少环境仍停在 CentOS 7,需要继续装 PostgreSQL 12
官方 EL-7 主源已下线,只改归档源也常装不上:系统 yum 失效、旧 pgdg 残留,或国外站点访问不了。
本文先修复系统源,再改用国内镜像安装,并补充改密、业务账号与客户端连接。
不涉及系统升级,也不展开更高版本 PostgreSQL 的迁移。

安装

下文以 CentOS 7(x86_64)安装 PostgreSQL 12.22 为例。

可先确认系统版本:

1
cat /etc/os-release

CentOS 7PostgreSQL 12 均已 EOL。
官方主源对 EL-7 已返回 410 Gone;仅写归档源也不一定装得上——常见拦路虎是:系统 yum 源失效、旧 pgdg 仓库仍启用、GPG 密钥不对,或访问不了国外归档站。
下文按「先修系统源 → 换国内镜像 → 再装 PG」处理。

修复系统源

CentOS 7 官方镜像已停服,不修系统源时,装任何软件都可能失败。
可先备份并切到阿里云 centos-vault

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
sudo mkdir -p /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/ 2>/dev/null || true

cat << 'EOF' | sudo tee /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-7 - Base
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[updates]
name=CentOS-7 - Updates
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[extras]
name=CentOS-7 - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
EOF

sudo yum clean all
sudo yum makecache

清理旧源

若以前装过官方 repo,旧配置会继续指向已失效地址。
先移走:

1
sudo mv /etc/yum.repos.d/pgdg*.repo /etc/yum.repos.d/backup/ 2>/dev/null || true

配置 PG 源

国内优先用阿里云镜像(仍保留 rhel-712 包),并导入 RHEL7 专用 GPG 密钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo rpm --import https://yum.postgresql.org/keys/PGDG-RPM-GPG-KEY-RHEL7

cat << 'EOF' | sudo tee /etc/yum.repos.d/pgdg-12.repo
[pgdg12]
name=PostgreSQL 12 for RHEL/CentOS 7 - x86_64
baseurl=https://mirrors.aliyun.com/postgresql/repos/yum/12/redhat/rhel-7-x86_64
enabled=1
gpgcheck=1
gpgkey=https://yum.postgresql.org/keys/PGDG-RPM-GPG-KEY-RHEL7

[pgdg-common]
name=PostgreSQL common for RHEL/CentOS 7 - x86_64
baseurl=https://mirrors.aliyun.com/postgresql/repos/yum/common/redhat/rhel-7-x86_64
enabled=1
gpgcheck=1
gpgkey=https://yum.postgresql.org/keys/PGDG-RPM-GPG-KEY-RHEL7
EOF

sudo yum clean all
sudo yum makecache

若阿里云也访问异常,可把上面两个 baseurl 换成官方归档源:

1
2
https://yum-archive.postgresql.org/12/redhat/rhel-7-x86_64
https://yum-archive.postgresql.org/common/redhat/rhel-7-x86_64

安装服务

安装客户端与服务端:

1
sudo yum install -y postgresql12 postgresql12-server

yum 仍失败,可改为直接装 RPM(版本号按镜像站实际文件调整):

1
2
3
4
5
cd /tmp
curl -LO https://mirrors.aliyun.com/postgresql/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-libs-12.22-1PGDG.rhel7.x86_64.rpm
curl -LO https://mirrors.aliyun.com/postgresql/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-12.22-1PGDG.rhel7.x86_64.rpm
curl -LO https://mirrors.aliyun.com/postgresql/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-server-12.22-1PGDG.rhel7.x86_64.rpm
sudo yum localinstall -y ./postgresql12-*.rpm

初始化启动

初始化数据目录:

1
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

启动服务并设置开机自启:

1
2
sudo systemctl start postgresql-12
sudo systemctl enable postgresql-12

默认数据目录一般为:/var/lib/pgsql/12/data

配置

修改超级用户密码

安装后会创建 Linux 用户 postgres,以及同名超级用户与系统库,相当于 MySQL 里的系统库角色。
建议在改 pg_hba.conf 之前先设好密码:此时仍可用本机身份切换进入。

  1. 切换到 postgres 用户:
1
su postgres
  1. 进入 psql
1
psql
  1. 修改密码:
1
ALTER USER postgres WITH PASSWORD 'NewPassword';

改完后可用 \q 退出。
之后若本机已改为 md5,再用超级用户登录请走:

1
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres

远程与认证

  1. 开放端口:
1
2
sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --reload
  1. 修改监听地址。
    编辑 /var/lib/pgsql/12/data/postgresql.conf,将监听改为全网卡:
1
vi /var/lib/pgsql/12/data/postgresql.conf

在配置中加入或改成:

1
listen_addresses='*'
  1. 修改认证方式。
    默认 pg_hba.conf 里,本机 127.0.0.1 / ::1 常是 ident:要求 Linux 用户名与数据库用户名一致。
    用业务用户 langchain_user 登录时就会报 Ident authentication failed
    规则按从上到下匹配,只在文件末尾追加一行往往救不了本机连接。

编辑配置:

1
vi /var/lib/pgsql/12/data/pg_hba.conf

把本机与远程相关行改成密码认证(md5),例如:

1
2
3
4
5
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
host all all 0.0.0.0/0 md5
  1. 重启服务使配置生效:
1
sudo systemctl restart postgresql-12

业务库与用户

先以超级用户进入 psql,再创建业务库与业务用户。

建库

创建业务库,并做基本切换检查:

1
2
3
CREATE DATABASE langchain_db;
\l
\c langchain_db

建用户与授权

创建业务用户并授予库级权限:

1
2
CREATE USER langchain_user WITH PASSWORD 'abcd1234';
GRANT ALL PRIVILEGES ON DATABASE langchain_db TO langchain_user;

切到目标库后,再补 schema / 表 / 序列权限,否则可能连得上却读写不了:

1
2
3
4
\c langchain_db
GRANT ALL ON SCHEMA public TO langchain_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO langchain_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO langchain_user;

需要回收库级权限时再用:

1
REVOKE ALL PRIVILEGES ON DATABASE langchain_db FROM langchain_user;

常见权限码:SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE

连接工具

业务用户与认证配好后,可用命令行或图形客户端连库。

连接参数

统一参数如下(按实际主机改 IP):

1
2
3
4
5
Host: 127.0.0.1
Port: 5432
Database: langchain_db
User: langchain_user
Password: abcd1234

连接串写法:

1
postgresql://langchain_user:abcd1234@127.0.0.1:5432/langchain_db

或:

1
host=127.0.0.1 port=5432 dbname=langchain_db user=langchain_user password=abcd1234

psql

安装服务端时一般已带上客户端,适合本机验证与排错:

1
psql -h 127.0.0.1 -p 5432 -U langchain_user -d langchain_db

按提示输入密码。
若报 Ident authentication failed,回到「远程与认证」改 pg_hba.conf 后重试。
连上后可用 \conninfo 查看当前会话。

图形客户端

日常管理可用这些工具,填入同一套参数即可:

  1. DBeaver:免费跨平台,兼容性较好,推荐优先使用
  2. pgAdmin 4:官方图形客户端,功能完整
  3. Navicat / DataGrip:商业工具,需注意版本是否支持 PostgreSQL 12

旧版 Navicat 连 PostgreSQL 12 时,打开对象树或表结构可能报:

1
ERROR: column c.relhasoids does not exist

原因是 relhasoids 在 PostgreSQL 12 已从系统表移除,旧客户端仍会查询该字段。
这通常不是库装坏了,而是客户端版本过旧。
建议使用 Navicat 16 及以上,或改用 DBeaver / pgAdmin 4 / psql

常用操作

库表速查

psql 中常用:

1
2
3
4
5
CREATE DATABASE langchain_db;
\l
\c langchain_db
CREATE TABLE test(id int, body varchar(100));
\d

退出 psql\q

主键自增

serial 类型

serial 实现自增;DROP 表时关联序列一般会一并删除:

1
2
3
4
5
CREATE TABLE tuser01(
id serial PRIMARY KEY,
name varchar,
age int4
);

自增序列

先创建序列:

1
CREATE SEQUENCE seq_user_id START 1;

再建表并引用序列:

1
2
3
4
5
6
CREATE TABLE tuser02 (
id int4 NOT NULL DEFAULT nextval('seq_user_id'),
name varchar(255),
age int4,
PRIMARY KEY (id)
);

若表已存在,需要补自增字段:

1
ALTER TABLE tuser02 ADD COLUMN id int8 NOT NULL DEFAULT nextval('seq_user_id');

或只更新已有字段的默认值:

1
ALTER TABLE tuser02 ALTER COLUMN id SET DEFAULT nextval('seq_user_id');