岁月

A JOURNAL OF TRAVEL · CODE · MARKETS
第三十六期 · 第 36 号 二〇二六年八月 · 立秋之后

openSUSE Leap 16.0 + PostgreSQL 18 搭建指南

2026-07-23 3 阅读

旧电脑改造数据库测试服务器 · 完整搭建流程

2026-07 · 技术 · 数据库部署 · openSUSE Leap 16.0 × PostgreSQL 18

标签:#openSUSE #PostgreSQL #Linux #数据库 #服务器部署 #Spring Boot


一台闲置的旧电脑,装上 openSUSE,跑起 PostgreSQL,接进后端的微服务——从零到一,一整条路都铺在这里。如果你想把手头积灰的机器改造成数据库测试服务器,照着本篇走即可。

本篇从版本选型、系统安装、SSH 与镜像配置,一路讲到数据库初始化、远程访问、接入 Spring Boot、备份维护与常见问题排查,适合作为一份可复现的搭建手册。

版本选择与推荐

推荐方案

推荐

PostgreSQL 18(openSUSE Leap 16.0 默认自带)

Leap 16.0 官方仓库直接集成 PostgreSQL 18,一条命令即可安装,无需额外配置第三方源。PostgreSQL 18 于 2025 年 9 月发布,是当前最新稳定版本,引入了数据页校验和默认启用、异步 I/O 支持等重要特性,官方支持至 2030 年 11 月 14 日

版本对比

版本 安装方式 支持截止 定位
PG 16 需 PGDG 源 EOL: 2028-11-09 老牌稳定
PG 17 需 PGDG 源 EOL: 2029-11-08 生产成熟
PG 18 ★ Leap 16.0 默认推荐 EOL: 2030-11-14 推荐选择
对比项 PostgreSQL 18(推荐) PostgreSQL 17
发布时间 2025-09-25 2024-09-26
当前小版本 18.4 17.10
支持截止 2030-11-14 2029-11-08
生产成熟度 新版本(持续更新中) 高(近2年验证)
安装方式 Leap 16.0 默认仓库直接安装 需添加 PGDG 官方源
适合场景 测试服务器、新项目 生产环境、长期项目

为什么选 PostgreSQL 18?

对于测试服务器,PostgreSQL 18 是最佳选择:Leap 16.0 默认自带,安装零门槛;作为最新版本,支持周期至 2030 年 11 月,覆盖时间最长;默认启用数据页校验和,安全性更高。如需更成熟的版本,参见下文附录通过 PGDG 源安装 PostgreSQL 17。

环境要求与准备

硬件最低要求

项目 最低要求 建议配置
CPU 2 GHz 双核(x86-64-v2 架构) 4 核及以上
内存 2 GB 4 GB 及以上
硬盘 40 GB 100 GB SSD
网络 需要联网(网络安装器) 千兆有线
介质 USB 接口(用于安装盘) -

CPU 架构限制

Leap 16.0 要求 CPU 支持 x86-64-v2 指令集(大致为 2008 年以后的处理器)。如果旧电脑 CPU 过老(如 Intel Core 2 Duo 之前),可能无法安装。可在 openSUSE 官网查看详细要求。

需要准备的物品

  • 一台 U 盘(≥ 2 GB,用于制作安装盘)
  • 另一台能上网的电脑(用于下载镜像和制作 U 盘)
  • 旧电脑的 BIOS/UEFI 设置中启用 USB 启动

安装 openSUSE Leap 16.0

3.1 下载安装镜像

前往 openSUSE 官方下载页面:https://get.opensuse.org/leap/16.0/

镜像类型 大小 适用场景
Offline Image(离线镜像) ~4.2 GB 网络不稳定时使用,包含全部包
Network Image(网络镜像) ~712 MB 推荐,体积小,安装时联网下载

选择建议

如果旧电脑能稳定联网,选择 Network Image(712 MB),下载快、制作 U 盘快。如果网络不稳定,选择 Offline Image(4.2 GB)。

3.2 制作 USB 安装盘

在另一台电脑上制作启动 U 盘:

macOS / Linux 制作 U 盘

# 1. 插入 U 盘,查看设备名
diskutil list # macOS
lsblk         # Linux

# 2. 卸载 U 盘(macOS,假设为 disk4)
diskutil unmountDisk /dev/disk4

# 3. 写入镜像(macOS)
sudo dd if=openSUSE-Leap-16.0-NET-x86_64.iso of=/dev/rdisk4 bs=4m

# 4. 弹出 U 盘
diskutil eject /dev/disk4

Windows 制作 U 盘(使用 Rufus)

# 1. 下载 Rufus: https://rufus.ie/
# 2. 打开 Rufus,选择 U 盘
# 3. 选择下载的 ISO 镜像
# 4. 分区类型选 GPT,目标系统选 UEFI
# 5. 点击"开始"写入

3.3 安装系统

  1. 将 U 盘插入旧电脑,开机时按 F12 / F2 / Esc(不同主板按键不同)进入启动菜单
  2. 选择 USB 设备启动
  3. 在 GRUB 菜单中选择 Installation
  4. Leap 16.0 使用全新的 Agama 安装器,按引导操作:
    • 选择语言:中文(简体)或 English
    • 选择键盘布局:Chinese / English (US)
    • 网络配置:选择有线连接或 Wi-Fi,设置静态 IP(推荐)
    • 磁盘分区:选择引导式分区,推荐方案:
      • /(根分区):Btrfs 文件系统,~30 GB
      • /home:XFS 文件系统,剩余空间
      • swap:与内存等大或内存的 1.5 倍
    • 系统角色:选择 Server(服务器模式,无桌面环境,资源占用低)
    • 时区:Asia/Shanghai
    • 创建 root 密码和普通用户
  5. 确认安装摘要,点击 Install 开始安装
  6. 安装完成后重启,拔出 U 盘

系统角色选择

数据库测试服务器建议选择 Server 角色(无桌面环境),可以节省约 500MB-1GB 内存,将更多资源留给 PostgreSQL。如果需要图形界面管理,可以选择 Server with GNOMEServer with KDE,但会占用更多内存。

SSH 远程登录配置

系统安装完成后,第一步是配置 SSH 远程登录。这样配完之后就能从开发机(如你的 Mac)远程操作服务器,无需再守在旧电脑前。需要完成两项核心工作:允许 root 用户 SSH 登录 + 为普通用户授予 sudo 权限

4.1 允许 root 用户 SSH 登录

Leap 16.0 Server 角色默认已安装并启动 sshd 服务,但默认禁止 root 用户直接 SSH 登录。需要修改配置文件开启:

# 编辑 SSH 服务配置文件
sudo vi /etc/ssh/sshd_config

# 找到 PermitRootLogin 行,取消注释并修改为:
PermitRootLogin yes

# 保存退出后,重启 sshd 服务使配置生效
sudo systemctl restart sshd

# 确认 sshd 服务正常运行
sudo systemctl status sshd

4.2 为普通用户授予 sudo 权限

安装系统时创建的普通用户默认没有 sudo 权限,无法执行管理员命令。将其加入 wheel 组即可获得 sudo 权限:

# 将普通用户加入 wheel 组(把 用户名 替换为实际用户名)
usermod -aG wheel 用户名

# 验证用户所属组(应看到 wheel)
groups 用户名

# 切换到该用户后,验证 sudo 权限
su - 用户名
sudo whoami
# 输入用户密码后,应输出: root

4.3 开放防火墙 SSH 端口

Leap 16.0 默认使用 firewalld,需要放行 SSH 服务才能从外部连接:

# 确认防火墙正在运行
sudo systemctl enable --now firewalld

# 永久开放 SSH 服务(默认 22 端口)
sudo firewall-cmd --add-service=ssh --permanent

# 重载防火墙使规则生效
sudo firewall-cmd --reload

# 验证 SSH 服务已放行
sudo firewall-cmd --list-all

4.4 从开发机测试远程登录

现在回到你的开发机(如 Mac),通过 SSH 连接服务器(将 192.168.1.100 替换为服务器实际 IP):

# 使用普通用户登录
ssh 用户名@192.168.1.100

# 使用 root 用户登录
ssh root@192.168.1.100

# 能成功进入服务器命令行,说明 SSH 配置完成

SSH 配置完成

现在可以从开发机远程操作服务器了,后续所有命令都可以通过 SSH 在开发机上执行,无需再直接在旧电脑前操作。

安全提醒

允许 root 用户直接 SSH 登录存在安全风险,仅适用于测试环境。生产环境应禁用 root 直接登录,仅使用普通用户 + sudo 提权,并配合 SSH 密钥认证。

更换软件源为清华镜像

openSUSE Leap 16.0 默认软件源位于国外服务器,国内下载速度很慢。更换为清华大学开源软件镜像源可大幅提升下载速度,后续所有 zypper install 都会从清华镜像拉取。

Leap 16.0 源结构变化

Leap 16.0 的软件源结构与旧版本不同:只有 oss 和 non-oss 两个源,不再有 update、backports、SLE 等源。因此只需要添加这两个镜像即可。

5.1 查看当前软件源

# 列出当前所有软件源
sudo zypper lr
# 会看到默认的 oss、non-oss 等源(指向 downloads.opensuse.org 等国外地址)

5.2 删除所有默认源

# 删除所有现有软件源
sudo zypper rr --all

# 或者逐个删除(先用 zypper lr 查看别名,再逐个删除)
# sudo zypper rr repo-oss
# sudo zypper rr repo-non-oss

5.3 添加清华镜像源

# 添加清华 oss 源(设置优先级 98,启用自动刷新)
sudo zypper ar -p 98 -f 'https://mirrors.tuna.tsinghua.edu.cn/opensuse/distribution/leap/16.0/repo/oss/' repo-oss

# 添加清华 non-oss 源
sudo zypper ar -p 98 -f 'https://mirrors.tuna.tsinghua.edu.cn/opensuse/distribution/leap/16.0/repo/non-oss/' repo-non-oss

5.4 清除旧缓存并刷新

# 清除所有旧缓存
sudo zypper clean --all

# 刷新软件源元数据
sudo zypper ref

5.5 验证镜像源

# 列出软件源,应只看到 repo-oss 和 repo-non-oss 两个源
sudo zypper lr
# 且 URL 指向 mirrors.tuna.tsinghua.edu.cn

常见问题:Repository type can't be determined

如果执行 zypper ref 报错 "Repository type can't be determined",说明仍有指向不存在路径的旧源残留。用 sudo zypper lr 检查源列表,将异常的旧源用 sudo zypper rr 源别名 删除后重新刷新。

镜像源切换完成

后续所有 zypper install 都从清华镜像下载,速度会有质的提升。接下来可以放心执行系统更新和软件安装。

系统基础配置

SSH 和镜像源都配置好之后,现在可以远程操作服务器并享受高速下载,接下来完成系统更新、静态 IP 和时区等基础配置:

6.1 更新系统

软件源已切换为清华镜像,此时更新会很快。首次登录(使用 root 或安装时创建的用户)执行:

# 刷新软件源
sudo zypper refresh

# 更新所有已安装的包
sudo zypper update

# 如果内核有更新,重启系统
sudo reboot

镜像已切换,更新很快

由于上一章已将软件源更换为清华镜像,zypper refreshzypper update 都会从国内镜像下载,速度相比默认国外源有质的提升。

6.2 配置静态 IP(推荐)

数据库服务器建议配置静态 IP,方便应用连接。使用 yast 或直接编辑网络配置:

# 打开 YaST 网络配置(如果安装了 YaST)
yast2 lan

# 或者使用命令行方式查看当前网络接口
ip addr show

# 查看当前网关
ip route show

如果系统未安装 YaST,可通过 NetworkManager 命令行配置:

# 查看网络连接名称
nmcli connection show

# 设置静态 IP(假设连接名为 eth0,IP 为 192.168.1.100/24)
nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24
nmcli connection modify eth0 ipv4.gateway 192.168.1.1
nmcli connection modify eth0 ipv4.dns "8.8.8.8 114.114.114.114"
nmcli connection modify eth0 ipv4.method manual

# 重启网络连接使配置生效
nmcli connection up eth0

# 验证
ip addr show eth0

6.3 设置时区与时间同步

# 设置时区为上海
timedatectl set-timezone Asia/Shanghai

# 启用 NTP 自动时间同步
timedatectl set-ntp true

# 验证
timedatectl status

安装 PostgreSQL 18

openSUSE Leap 16.0 默认仓库包含 PostgreSQL 18,直接安装即可:

# 刷新软件源
sudo zypper refresh

# 安装 PostgreSQL 服务端和客户端
sudo zypper install postgresql18-server postgresql18

# 同时安装contrib扩展包(提供额外实用工具和扩展)
sudo zypper install postgresql18-contrib

安装过程中 zypper 会自动解决依赖关系。安装完成后验证版本:

# 查看 psql 客户端版本
psql --version
# 预期输出: psql (PostgreSQL) 18.x

# 查看 postgres 服务端版本
postgres --version
# 预期输出: postgres (PostgreSQL) 18.x

# 查看已安装的 PostgreSQL 相关包
zypper search -i postgresql

安装完成

安装完成后,系统会自动创建 postgres 系统用户,默认数据目录为 /var/lib/pgsql/data

初始化数据库集群

首次使用前需要初始化数据库集群。注意:openSUSE 不提供 postgresql-setup 脚本(这是 Red Hat/CentOS 的工具),需要手动使用 initdb 命令完成初始化。

重要提醒

openSUSE Leap 16.0 上 postgresql-setuppostgresql18-setup 命令均不存在。必须按以下步骤手动初始化。另外,如果之前执行过 systemctl start postgresql,数据目录可能已有残留文件,需要先清空。

手动初始化数据库集群

# 1. 如果服务已启动,先停止
sudo systemctl stop postgresql

# 2. 清空可能残留的数据目录(首次安装可跳过此步)
sudo rm -rf /var/lib/pgsql/data

# 3. 创建空的数据目录并设置权限
sudo mkdir -p /var/lib/pgsql/data
sudo chown postgres:postgres /var/lib/pgsql/data
sudo chmod 700 /var/lib/pgsql/data

# 4. 切换到 postgres 用户执行初始化
sudo su - postgres

# 5. 执行 initdb(此时是 postgres 用户身份)
initdb -D /var/lib/pgsql/data

# 预期输出类似:
# 属于此数据库系统的文件宿主为用户 "postgres".
# 数据库集簇将以区域环境设置 "zh_CN.UTF-8" 进行初始化.
# ...
# 成功。您现在可以用下面的命令启动数据库服务器:
#     pg_ctl -D /var/lib/pgsql/data -l logfile start

# 6. 初始化完成后退出 postgres 用户
exit

初始化做了什么?

initdb 会以 postgres 用户身份在 /var/lib/pgsql/data 目录下创建数据库集群,生成 postgresql.conf(主配置文件)和 pg_hba.conf(客户端认证配置文件)。

验证初始化结果

# 查看数据目录(需要 sudo 权限)
sudo ls -la /var/lib/pgsql/data/

# 预期看到: postgresql.conf, pg_hba.conf, PG_VERSION, base/, global/ 等

启动服务与开机自启

# 启动 PostgreSQL 服务
sudo systemctl start postgresql

# 设置开机自启动
sudo systemctl enable postgresql

# 一步到位:启动并设置开机自启
# sudo systemctl enable --now postgresql

# 查看服务运行状态
sudo systemctl status postgresql

验证 PostgreSQL 是否正常运行:

# 切换到 postgres 用户,连接数据库
sudo su - postgres
psql

# 在 psql 中查看版本和连接信息
postgres-# SELECT version();
postgres-# SELECT current_date;
postgres-# \l  -- 列出所有数据库
postgres-# \q  -- 退出 psql(同时自动回到普通用户,无需再执行 exit)

服务启动成功

如果 systemctl status postgresql 显示 active (running),且 psql 能正常连接,说明 PostgreSQL 已成功运行。

配置远程访问

默认情况下 PostgreSQL 只允许本机连接。要让开发机(如你的 Mac)能远程连接数据库,需要修改两个配置文件。

10.1 修改 postgresql.conf — 监听地址

权限提醒

配置文件属于 postgres 用户,普通用户无权直接编辑。必须使用 sudo 提权。路径为 /var/lib/pgsql/data/postgresql.conf,注意不要拼写错误。

# 编辑主配置文件(必须用 sudo)
sudo vi /var/lib/pgsql/data/postgresql.conf

# 找到 listen_addresses 行(约第 60 行附近),取消注释并修改为:
listen_addresses = '*'

# 找到 port 行,确认端口(默认即可):
port = 5432

# 可选:调整最大连接数(默认100,测试环境够用)
max_connections = 100

10.2 修改 pg_hba.conf — 允许远程 IP 连接

# 编辑客户端认证配置文件(必须用 sudo)
sudo vi /var/lib/pgsql/data/pg_hba.conf

# 在文件末尾追加以下内容(允许所有 IP 通过密码连接):
# TYPE  DATABASE  USER  ADDRESS          METHOD
host    all       all   0.0.0.0/0        scram-sha-256
host    all       all   ::/0             scram-sha-256

安全提示

0.0.0.0/0 表示允许任意 IP 连接,仅适合测试环境。如果在内网中,建议限定网段,例如 192.168.1.0/24 只允许局域网内连接。

限定内网访问的更安全写法:

# 仅允许 192.168.1.x 网段连接
host    all       all   192.168.1.0/24    scram-sha-256

# 仅允许特定 IP 连接
host    all       all   192.168.1.50/32   scram-sha-256

10.3 重启服务使配置生效

sudo systemctl restart postgresql

# 确认服务正常
sudo systemctl status postgresql

创建数据库与用户

为你的 Spring Boot 应用创建专属的数据库和用户:

# 切换到 postgres 用户
sudo su - postgres

# 进入 psql 交互界面
psql

-- 创建应用用户并设置密码
postgres=# CREATE USER webapp WITH PASSWORD 'YourStrongPass2026';

-- 创建应用数据库并指定属主
postgres=# CREATE DATABASE web_app OWNER webapp;

-- 授予全部权限
postgres=# GRANT ALL PRIVILEGES ON DATABASE web_app TO webapp;

-- 退出 psql(同时自动回到普通用户,无需再执行 exit)
postgres=# \q

验证连接

# 在你的 Mac 上安装 psql 客户端(如已安装则跳过)
brew install libpq

# 连接测试(将 192.168.1.100 替换为服务器实际 IP)
psql -U webapp -d web_app -h 192.168.1.100 -p 5432 -W

# 输入密码后,如果看到 web_app=> 提示符,说明连接成功
web_app=> \q

防火墙配置

openSUSE Leap 16.0 默认使用 firewalld 防火墙。需要开放 PostgreSQL 的 5432 端口:

# 查看防火墙状态
sudo systemctl status firewalld

# 如果防火墙未运行,启动并设置开机自启
sudo systemctl enable --now firewalld

# 开放 PostgreSQL 服务(推荐方式,使用预定义服务名)
sudo firewall-cmd --add-service=postgresql --permanent

# 或者直接开放端口
sudo firewall-cmd --add-port=5432/tcp --permanent

# 重载防火墙使规则生效
sudo firewall-cmd --reload

# 验证已开放的端口和服务
sudo firewall-cmd --list-all

验证端口是否可达(从开发机执行)

# 使用 nc 测试端口连通性
nc -zv 192.168.1.100 5432

# 预期输出: Connection to 192.168.1.100 port 5432 [tcp/postgresql] succeeded!

连接 Spring Boot 应用

13.1 修改后端配置

将 user-service 的 application.yml 数据源切换为 PostgreSQL:

spring:
  datasource:
    # 注释掉 MySQL 配置
    # url: jdbc:mysql://localhost:3306/web_app?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    # username: root
    # password: root
    # driver-class-name: com.mysql.cj.jdbc.Driver

    # 启用 PostgreSQL 配置
    url: jdbc:postgresql://192.168.1.100:5432/web_app
    username: webapp
    password: YourStrongPass2026
    driver-class-name: org.postgresql.Driver
    hikari:
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 30000
      max-lifetime: 1800000
      connection-timeout: 30000
      pool-name: UserServiceHikariCP

13.2 创建数据库表

连接到 PostgreSQL 并执行建表脚本:

-- 使用 webapp 用户连接 web_app 数据库
-- psql -U webapp -d web_app -h 192.168.1.100 -W

CREATE TABLE tb_user (
    id          BIGSERIAL       PRIMARY KEY,
    username    VARCHAR(100)    NOT NULL UNIQUE,
    email       VARCHAR(200),
    phone       VARCHAR(20),
    status      INTEGER         DEFAULT 1,
    group_name  VARCHAR(100),
    role        VARCHAR(100),
    create_time     TIMESTAMP  DEFAULT CURRENT_TIMESTAMP,
    last_login_time TIMESTAMP
);

-- 插入测试数据
INSERT INTO tb_user (username, email, phone, status, group_name, role)
VALUES
    ('admin', 'admin@example.com', '13800000001', 1, '系统管理组', '管理员'),
    ('zhangsan', 'zhangsan@example.com', '13800000002', 1, '开发组', '开发人员'),
    ('lisi', 'lisi@example.com', '13800000003', 0, '测试组', '测试人员');

-- 验证
SELECT * FROM tb_user;

PostgreSQL 与 MySQL 语法差异

PostgreSQL 使用 BIGSERIAL 替代 MySQL 的 AUTO_INCREMENT,自动创建序列并自增。MyBatis 的 useGeneratedKeys="true" 配合 keyProperty="id" 依然有效。

备份与维护

14.1 手动备份

# 备份单个数据库
sudo su - postgres
pg_dump -U postgres -d web_app -F c -f /tmp/web_app_backup.dump

# 备份所有数据库
pg_dumpall -U postgres -f /tmp/all_databases.sql

# 备份为纯 SQL 文本
pg_dump -U postgres -d web_app -f /tmp/web_app.sql

# 退出 postgres 用户
exit

14.2 恢复数据库

sudo su - postgres

# 从自定义格式恢复
pg_restore -U postgres -d web_app -c /tmp/web_app_backup.dump

# 从 SQL 文本恢复
psql -U postgres -d web_app -f /tmp/web_app.sql

exit

14.3 设置自动备份(cron 定时任务)

# 创建备份目录
mkdir -p /var/lib/pgsql/backups

# 创建备份脚本
cat > /var/lib/pgsql/backups/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/var/lib/pgsql/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# 保留最近 7 天的备份
find $BACKUP_DIR -name "web_app_*.dump" -mtime +7 -delete
# 执行备份
sudo su - postgres -c "pg_dump -U postgres -d web_app -F c -f $BACKUP_DIR/web_app_$DATE.dump"
echo "Backup completed: web_app_$DATE.dump"
EOF

# 赋予执行权限
chmod +x /var/lib/pgsql/backups/backup.sh

# 添加 cron 定时任务(每天凌晨 2:00 执行)
crontab -e
# 在文件中添加以下行:
# 0 2 * * * /var/lib/pgsql/backups/backup.sh >> /var/lib/pgsql/backups/backup.log 2>&1

14.4 日常维护命令

sudo su - postgres

# 查看数据库大小
psql -c "SELECT pg_size_pretty(pg_database_size('web_app'));"

# 查看所有数据库
psql -c "SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;"

# 查看当前连接数
psql -c "SELECT count(*) FROM pg_stat_activity;"

# 手动执行 VACUUM 清理(释放空间)
psql -d web_app -c "VACUUM ANALYZE tb_user;"

# 查看 PostgreSQL 日志位置
ls /var/lib/pgsql/data/log/

exit

附录:安装其他 PostgreSQL 版本(可选)

openSUSE Leap 16.0 默认仓库已包含 PostgreSQL 18,通常无需额外安装旧版本。如果因特殊需求需要安装其他版本,可通过 PostgreSQL 官方 PGDG 仓库安装:

# 1. 添加 PostgreSQL 官方仓库(Leap 16.0 专用 reporrpm)
sudo zypper install https://download.postgresql.org/pub/repos/zypp/reporpms/LEAP-16.0-x86_64/pgdg-suse-repo-latest.noarch.rpm

# 2. 刷新仓库
sudo zypper refresh

# 3. 查看可用的 PostgreSQL 版本
sudo zypper search postgresql17-server

# 4. 安装 PostgreSQL 17
sudo zypper install postgresql17-server postgresql17 postgresql17-contrib

# 5. 初始化(注意:openSUSE 没有 postgresql-setup,需手动 initdb)
# 如果是全新安装:
sudo su - postgres
initdb -D /var/lib/pgsql/data
exit

# 6. 启动服务
sudo systemctl enable --now postgresql

# 7. 验证版本
psql --version
# 预期: psql (PostgreSQL) 17.x

版本共存注意事项

openSUSE 默认一次只运行一个 PostgreSQL 版本。如果从 PG 18 切换到其他版本,需要先停止旧服务,清空数据目录后重新初始化。生产环境建议使用 pg_upgrade 工具迁移数据。

常见问题排查

问题 1:远程连接被拒绝

psql: error: connection to server at "192.168.1.100", port 5432 failed:
Connection refused

排查步骤:

  • 检查 PostgreSQL 服务是否运行:sudo systemctl status postgresql
  • 检查 listen_addresses 是否设为 '*'
  • 检查防火墙是否放行 5432:sudo firewall-cmd --list-all
  • 检查端口是否监听:sudo ss -tlnp | grep 5432

问题 2:认证失败

psql: error: connection to server at "192.168.1.100" failed:
FATAL: password authentication failed for user "webapp"

排查步骤:

  • 检查 pg_hba.conf 中的认证方式是否为 scram-sha-256
  • 重置用户密码:sudo su - postgres -c "psql -c \"ALTER USER webapp WITH PASSWORD 'newpass';\""
  • 修改 pg_hba.conf 后必须重启:sudo systemctl restart postgresql

问题 3:找不到 postgresql-setup 命令

这是 openSUSE 上的常见问题

postgresql-setup 是 Red Hat/CentOS/Fedora 的工具,openSUSE 不提供此命令。无论是否带版本号(postgresql-setuppostgresql18-setup),在 openSUSE 上都会提示"找不到命令"。请按以下步骤手动初始化。

# 确认 initdb 命令位置
sudo find / -name "initdb" -type f 2>/dev/null
# 通常在 /usr/bin/initdb 或 /usr/lib/postgresql18/bin/initdb

# 手动初始化数据库集群
sudo su - postgres
initdb -D /var/lib/pgsql/data
exit

问题 4:initdb 报错"目录已存在但不为空"

initdb: 错误: 目录 "/var/lib/pgsql/data" 已存在,但不为空

这通常是因为之前执行过 systemctl start postgresql,systemd 自动在数据目录中生成了残留文件。需要清空后重新初始化:

# 1. 停止服务
sudo systemctl stop postgresql

# 2. 删除残留数据目录
sudo rm -rf /var/lib/pgsql/data

# 3. 创建空目录并设置权限
sudo mkdir -p /var/lib/pgsql/data
sudo chown postgres:postgres /var/lib/pgsql/data
sudo chmod 700 /var/lib/pgsql/data

# 4. 重新初始化
sudo su - postgres
initdb -D /var/lib/pgsql/data
exit

# 5. 启动服务
sudo systemctl start postgresql

问题 5:配置文件为空或路径不对

# 配置文件路径(注意拼写,必须是 sudo 权限编辑):
# /var/lib/pgsql/data/postgresql.conf  ← 主配置文件
# /var/lib/pgsql/data/pg_hba.conf      ← 认证配置文件

# 正确的编辑命令:
sudo vi /var/lib/pgsql/data/postgresql.conf
sudo vi /var/lib/pgsql/data/pg_hba.conf

# 常见拼写错误(避免!):
# 错误: /var/lib/posql/data/postgresq.conf  ← posql 应为 pgsql,postgresq 应为 postgresql
# 错误: 不加 sudo 直接 vi 编辑  ← 权限不够,会打开空文件

问题 6:查看 PostgreSQL 日志

# 查看最新日志(Leap 16.0 默认使用 systemd journal)
sudo journalctl -u postgresql -n 50 --no-pager

# 实时跟踪日志
sudo journalctl -u postgresql -f

# 查看 PostgreSQL 自身日志文件
sudo ls -la /var/lib/pgsql/data/log/
sudo cat /var/lib/pgsql/data/log/postgresql-*.log

问题 7:执行建表语句报错 permission denied for schema public

ERROR: permission denied for schema public

使用 Navicat 或其他数据库工具,以普通用户(如 webapp_user)连接数据库执行 CREATE TABLE 建表语句时出现上述错误。

原因:PostgreSQL 15+ 默认安全策略变更

从 PostgreSQL 15 开始,默认安全策略发生变更——普通用户不再默认拥有 public 模式的 CREATE 权限。这是官方刻意提升的安全改进,并非 Bug。受影响版本包括 PostgreSQL 15、16、17、18 及后续版本。

解决方案(以 postgres 超级用户执行):

-- 方式一:给所有用户授权(适合测试环境)
GRANT ALL ON SCHEMA public TO PUBLIC;
GRANT ALL ON DATABASE web_app TO PUBLIC;

-- 方式二:仅给指定用户授权(更安全,推荐生产环境)
GRANT ALL ON SCHEMA public TO webapp_user;
GRANT ALL ON DATABASE web_app TO webapp_user;
# 切换到 postgres 超级用户
sudo su - postgres

# 连接数据库并执行授权语句
psql -d web_app -c "GRANT ALL ON SCHEMA public TO PUBLIC;"
psql -d web_app -c "GRANT ALL ON DATABASE web_app TO PUBLIC;"

# 退出
exit

补充说明

  • **Navicat 用户:**将连接切换为 postgres 超级用户执行更新后的建表脚本,完成后再切回 webapp_user 进行日常操作。
  • 建表脚本(schema_postgresql.sql)已更新,在脚本开头加入了上述 GRANT 授权语句。
  • 权限问题解决后,重新执行建表脚本,再执行 init-data_postgresql.sql 初始化数据。
  • **参考:**PostgreSQL 15 Release Notes — "The public schema now has CREATE privileges revoked from all users by default"。

openSUSE Leap 16.0 + PostgreSQL 18 数据库测试服务器搭建指南 · 生成日期:2026-07-23 · 适用于后端微服务工程 user-service 数据库环境

评论 (0)

还没有评论,来抢沙发。

发表评论