PostgreSQL安装与第一个业务数据库

本篇在一台新的 Ubuntu 24.04 LTS 服务器上安装 PostgreSQL 16,创建独立业务账号和数据库,再验证中文数据写入、退出后重新读取。使用系统软件源中的软件包,应用与数据库先部署在同一台服务器,不开放公网5432端口。已有 PostgreSQL 集群的服务器,应先核对现有版本、端口和数据目录,不按新装流程重复创建。

安装软件包,查看真正运行的数据库实例

使用能执行sudo的系统账户,先确认系统版本和软件源候选包:

cat /etc/os-release
sudo apt update
apt-cache policy postgresql-16 postgresql-client-16
sudo apt install postgresql-16 postgresql-client-16
pg_lsclusters

正常的新安装通常显示 16 main,状态为 online,端口为5432。以实际输出为准;若存在其他集群,不要把其他版本的数据目录复制过来覆盖。确认本篇这套实例:

sudo systemctl status postgresql@16-main --no-pager
sudo -u postgres psql -X -p 5432 -d postgres -c "SELECT version();"

postgresql.service 可能是管理多个实例的汇总服务,因此仅看到它 active (exited) 还不够。这里需要实际集群在线,而且SQL查询能够返回版本。若你的集群名或端口不同,后面的命令也要对应修改。

创建业务账号和独立数据库

Ubuntu的本机管理可以使用系统用户postgres,通过socket进入数据库。该账户用于管理,不填写到网站的日常连接配置。

sudo -u postgres psql -X -p 5432 -d postgres

进入psql后先创建角色。下面的示例名称需要确认尚未使用;如果角色已经存在,就停止核对用途,不继续改它的密码:

\set ON_ERROR_STOP on
CREATE ROLE baole_app LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION;

收到CREATE ROLE成功结果后,再设置密码和创建数据库。数据库已经存在时同样停止,不删除重建:

\password baole_app
CREATE DATABASE baole_site OWNER baole_app ENCODING 'UTF8' TEMPLATE template0;
\du baole_app
\l baole_site
\q

\password 会提示两次输入密码,避免把明文密码写进SQL历史。baole_app 和 baole_site 是示例名称,可以统一换成项目专用名称。该账号是这一个业务库的所有者,适合初始化和迁移;多角色项目可在上线时再拆分权限更小的运行账号。

使用业务账号连接,再写入一条中文数据

以下命令在Linux终端运行,明确指定 127.0.0.1 使用TCP密码认证:

psql -X -h 127.0.0.1 -p 5432 -U baole_app -d baole_site -W

输入刚设置的数据库密码,执行:

SELECT current_user, current_database(), inet_server_addr(), inet_server_port();
BEGIN;
CREATE TABLE public.baole_connection_check (
    id integer PRIMARY KEY,
    note text NOT NULL
);
INSERT INTO public.baole_connection_check VALUES (1, '宝乐云数据库连接测试');
COMMIT;
SELECT id, note FROM public.baole_connection_check;

第一条应显示业务账号、目标库、127.0.0.1和实际端口;最后一条应返回中文测试内容。建表和写入放在同一事务内,任何一步报错都先执行 ROLLBACK;。若测试表已经存在,停止操作,改用独立的新表名后重新执行整段事务,避免向原有表插入数据。

输入 \q 退出,再执行同一条连接命令重新登录,读取刚才的记录:

SELECT id, note FROM public.baole_connection_check WHERE id = 1;

重新连接后仍能读取,说明不是只打开了一个空的客户端窗口。确认该表仅有本次示例数据后,可用 DROP TABLE public.baole_connection_check; 清理测试表;应用使用的库和账号继续保留。

把连接信息填写到程序里

配置项 本篇示例
数据库类型 PostgreSQL,使用程序对应的PostgreSQL驱动。
主机和端口 127.0.0.1:5432;按实际实例端口填写。
数据库与用户 baole_site / baole_app。
密码 刚通过\password设置的独立密码,保存在程序的受控配置中。

用同一组配置运行程序的数据库检查或初始化,再验证程序实际读写。应用运行在容器或另一台服务器时,127.0.0.1的含义会改变,需要另外设计连接路径;不要仅为连通就把数据库监听地址和访问范围全部放开。

常见报错怎样处理

现象 检查位置
Peer authentication failed 通常走了本机socket身份匹配。业务密码连接明确使用-h 127.0.0.1,不把认证规则改成trust。
password authentication failed 核对账号、目标实例和密码。必要时由postgres管理员在正确实例中用\password baole_app重设。
Connection refused 检查pg_lsclusters、实际监听端口和对应实例日志;不是先改数据库密码。
permission denied for schema public 检查当前账号及数据库所有者,确认连接的是刚创建的目标库;不要直接给所有用户授予全局权限。

实例没有启动时,可查看 sudo journalctl -u postgresql@16-main -n 80 --no-pager;涉及配置的真实路径可由管理连接执行 SHOW config_file; 和 SHOW hba_file; 获取。正式写入业务数据前,继续配置 PostgreSQL备份与恢复验证。