旧电脑改造数据库测试服务器 · 完整搭建流程
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 安装系统
- 将 U 盘插入旧电脑,开机时按
F12/F2/Esc(不同主板按键不同)进入启动菜单 - 选择 USB 设备启动
- 在 GRUB 菜单中选择 Installation
- Leap 16.0 使用全新的 Agama 安装器,按引导操作:
- 选择语言:中文(简体)或 English
- 选择键盘布局:Chinese / English (US)
- 网络配置:选择有线连接或 Wi-Fi,设置静态 IP(推荐)
- 磁盘分区:选择引导式分区,推荐方案:
/(根分区):Btrfs 文件系统,~30 GB/home:XFS 文件系统,剩余空间swap:与内存等大或内存的 1.5 倍
- 系统角色:选择 Server(服务器模式,无桌面环境,资源占用低)
- 时区:Asia/Shanghai
- 创建 root 密码和普通用户
- 确认安装摘要,点击 Install 开始安装
- 安装完成后重启,拔出 U 盘
系统角色选择
数据库测试服务器建议选择 Server 角色(无桌面环境),可以节省约 500MB-1GB 内存,将更多资源留给 PostgreSQL。如果需要图形界面管理,可以选择 Server with GNOME 或 Server 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 refresh和zypper 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-setup和postgresql18-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-setup、postgresql18-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)
还没有评论,来抢沙发。