前言
PostgreSQL(简称 pgsql)是一款功能强大的开源关系型数据库,凭借其高稳定性、优秀的扩展性以及对 SQL 标准的严格遵循,被广泛应用于企业级开发、数据分析、后端服务搭建等各类场景。无论是数据库初学者入门,还是运维人员日常管理,掌握 PostgreSQL 的基础操作与核心维护技能都是必不可少的。
本文将围绕 PostgreSQL 日常使用与维护展开,从基础的登录、库表操作,到模式设计、备份恢复,再到远程连接配置、密码重置,全方位梳理 PostgreSQL 日常运维的关键技能,内容模块化、操作步骤化,助力大家系统化建立 PostgreSQL 的操作能力,高效完成数据库管理与开发工作。
一、PostgreSQL 基本使用
PostgreSQL 的基础操作是日常维护的核心,所有高级操作都建立在基础操作之上,本节将详细讲解登录、数据库、数据表、模式、数据的各类核心操作。
1.1 数据库登录
PostgreSQL 登录必须使用postgres 系统用户,这是数据库的默认超级用户,登录后命令提示符会显示为postgres=#,其中postgres代表当前默认连接的数据库。
bash
运行
# 方式1:直接切换postgres用户后登录
[root@bogon ~]# su - postgres
psql (16.3)
Type "help" for help.
postgres=#
# 方式2:直接执行psql命令登录
[postgres@bogon ~]$ /usr/local/pgsql/bin/psql
1.2 数据库核心操作
数据库的增删查改、大小查看是最基础的操作,PostgreSQL 提供了元命令、扩展元命令、SQL 命令三种方式实现,同时内置了专用函数用于数据库大小统计,以下是详细操作方法。
1.2.1 数据库操作全指令
表格
| 操作类型 | 操作指令 | 说明 |
|---|---|---|
| 列出所有数据库 | \l |
元命令,快速列出数据库基础信息,类似 MySQL 的 SHOW DATABASES |
| 列出所有数据库(详情) | \l+ |
扩展元命令,比 \l 多显示 Size、Tablespace、Description 列 |
| 列出所有数据库(SQL) | SELECT datname FROM pg_database; |
通过系统表查询,pg_database 存储所有数据库元信息 |
| 创建数据库 | CREATE DATABASE 数据库名; |
标准 SQL 命令,例:CREATE DATABASE mydb; |
| 删除数据库 | DROP DATABASE 数据库名; |
标准 SQL 命令,例:DROP DATABASE mydb; |
| 切换数据库 | \c 数据库名/\connect 数据库名 |
元命令,切换后提示符变为「数据库名 =#」 |
| 查看数据库大小(字节) | SELECT pg_database_size('数据库名'); |
内置函数,返回字节数,例:pg_database_size ('mydb') |
| 查看数据库大小(易读) | SELECT pg_size_pretty(pg_database_size('数据库名')); |
嵌套函数,将字节转为 KB/MB/GB 等易读单位 |
1.2.2 关键说明
- 元命令:PostgreSQL 交互式终端 psql 中以
\开头的命令,用于快速管理数据库,是日常操作的首选方式; - 系统表
pg_database:属于 pg_catalog 模式,存储数据库名称、所有者、编码等元信息,无论当前连接哪个数据库,该表始终可见; pg_size_pretty():通用格式化函数,可将任意字节数的数值转为人类易读的存储单位,是 PostgreSQL 中查看大小的常用函数。
1.3 数据表核心操作
数据表是存储数据的核心载体,PostgreSQL 支持标准 SQL 数据类型,同时提供了丰富的自定义类型和几何类型,数据表的操作涵盖列出、创建、复制、删除、查看结构等,以下是详细操作指南。
1.3.1 数据表操作全指令
表格
| 操作类型 | 操作指令 | 说明 |
|---|---|---|
| 列出当前模式表 | \dt |
元命令,显示 search_path 中模式的表,默认 public 模式 |
| 列出表 / 视图 / 序列 | \d |
元命令,比 \dt 涵盖更多数据库对象 |
| 列出指定模式表 | \dt 模式名.* |
元命令,例:\dt hr.* 列出 hr 模式下所有表 |
| 列出所有表(含系统表) | \dt *.* |
元命令,显示当前数据库所有模式的所有表 |
| 列出表(SQL) | SELECT * FROM pg_tables WHERE schemaname = '模式名'; |
通过视图查询,pg_tables 为 pg_catalog 下的逻辑视图 |
| 创建数据表 | CREATE TABLE 表名(字段1 类型,字段2 类型,...); |
标准 SQL,例:CREATE TABLE test (id int,name char (10)); |
| 复制数据表(结构 + 数据) | CREATE TABLE 新表名 AS TABLE 原表名; |
快速复制,含表结构和所有数据,例:CREATE TABLE test2 AS TABLE test; |
| 删除数据表 | DROP TABLE 表名; |
标准 SQL,例:DROP TABLE test2; |
| 查看表结构 | \d 表名; |
元命令,显示字段、类型、可空性、默认值等信息 |
| 查看表结构(详情) | \d+ 表名; |
扩展元命令,显示更多表属性信息 |
1.3.2 关键说明
- 支持的常用数据类型:int、smallint、real、double precision、char (N)、varchar (N)、date、time、timestamp、interval,同时支持用户自定义数据类型;
pg_tables:是 pg_catalog 模式下的逻辑视图,基于 pg_class 和 pg_namespace 构建,并非物理表,可直接查询获取表的详细信息;- 复制表说明:
CREATE TABLE ... AS TABLE ...会完整复制原表的结构和数据,但不会复制索引、约束等附加属性,若需完整复制需单独处理索引和约束。
1.4 模式(Schema)操作
在 PostgreSQL 中,模式(Schema) 是数据库内的逻辑容器,用于组织和管理数据库对象(表、视图、函数、索引等),类似文件系统中的文件夹。其核心作用是避免命名冲突 、实现权限隔离,允许在同一个数据库中为不同业务、不同用户划分独立的对象空间,这也是 PostgreSQL 与 MySQL 的重要区别之一。
1.4.1 模式操作全指令
表格
| 操作类型 | 操作指令 | 说明 |
|---|---|---|
| 创建模式 | CREATE SCHEMA 模式名; |
标准 SQL,例:CREATE SCHEMA hr; |
| 删除空模式 | DROP SCHEMA 模式名; |
标准 SQL,仅能删除无任何对象的空模式 |
| 强制删除模式 | DROP SCHEMA 模式名 CASCADE; |
标准 SQL,删除模式及其所有关联对象(表 / 视图等) |
| 列出所有模式 | \dn |
元命令,快速列出当前数据库的所有模式 |
| 列出所有模式(SQL) | SELECT schema_name FROM information_schema.schemata; |
通过信息模式查询,兼容 SQL 标准 |
| 在指定模式建表 | CREATE TABLE 模式名.表名(字段 类型,...); |
显式指定模式,例:CREATE TABLE hr.employees (id SERIAL PRIMARY KEY); |
| 切换单个默认模式 | SET search_path TO 模式名; |
修改搜索路径,仅优先搜索指定模式 |
| 切换多个默认模式 | SET search_path TO 模式1,模式2,...; |
按优先级排序,例:SET search_path TO hr,public; |
| 查看当前模式 | SELECT current_schema(); |
内置函数,返回当前默认的模式名 |
| 查看搜索路径 | SHOW search_path; |
查看模式的搜索优先级配置 |
1.4.2 模式核心特性
- 默认模式 public :PostgreSQL 每个数据库都有一个默认模式
public,若创建对象时未指定模式,默认会放入public模式中; - 搜索路径 search_path :类似系统的 PATH 环境变量,控制数据库对象的解析顺序,避免每次查询都显式指定模式名。默认值为
"$user", public,表示优先查找与当前用户名同名的模式,再查找public模式; - 模式隔离性 :不同模式中可以存在同名表 ,跨模式查询时需显式指定模式名(如
schema1.users),或通过search_path设置默认模式实现隐式查询; - 无需切换数据库:模式是数据库内的逻辑分组,所有模式操作都在当前数据库连接中完成,无需重新建立数据库连接。
1.4.3 模式隔离性实操示例
通过实操演示不同模式中创建同名表并实现跨模式查询,步骤如下:
sql
-- 步骤1:创建数据库并切换
CREATE DATABASE mydb;
\c mydb;
-- 步骤2:创建两个同名模式
CREATE SCHEMA schema1;
CREATE SCHEMA schema2;
-- 步骤3:在不同模式中创建同名users表并插入数据
CREATE TABLE schema1.users (id int);
INSERT INTO schema1.users VALUES(1);
CREATE TABLE schema2.users (id int);
INSERT INTO schema2.users VALUES(2);
-- 步骤4:跨模式显式查询(指定模式名)
SELECT * FROM schema1.users; -- 结果:id=1
SELECT * FROM schema2.users; -- 结果:id=2
-- 步骤5:通过search_path实现隐式查询
SET search_path TO schema1;
SELECT * FROM users; -- 默认访问schema1.users,结果:id=1
SET search_path TO schema2;
SELECT * FROM users; -- 默认访问schema2.users,结果:id=2
1.5 数据基本操作
数据的增删改查(CRUD)是数据库使用的基础,PostgreSQL 支持标准的 SQL 数据操作语句,语法简洁,与主流关系型数据库保持一致,以下是详细操作示例(以 test 表:id int、name char (10)、age int 为例)。
1.5.1 数据操作全指令
表格
| 操作类型 | 操作指令 | 示例 |
|---|---|---|
| 插入数据 | INSERT INTO 表名 VALUES(值1,值2,...); |
INSERT INTO test VALUES(1,'zhangsan',18); |
| 查询所有数据 | SELECT * FROM 表名; |
SELECT * FROM test; |
| 条件查询数据 | SELECT 字段1,字段2 FROM 表名 WHERE 条件; |
SELECT name,age FROM test WHERE id=1; |
| 修改数据 | UPDATE 表名 SET 字段=值 WHERE 条件; |
UPDATE test SET age=20 WHERE id=1; |
| 删除数据 | DELETE FROM 表名 WHERE 条件; |
DELETE FROM test WHERE id=1; |
1.5.2 实操示例
sql
-- 1. 创建测试表
CREATE TABLE test(id int,name char(10),age int);
-- 2. 插入数据
INSERT INTO test VALUES(1,'zhangsan',18); -- 结果:INSERT 0 1
-- 3. 查询数据
SELECT * FROM test; -- 结果:id=1, name=zhangsan, age=18
-- 4. 修改数据
UPDATE test SET age=20 WHERE id=1; -- 结果:UPDATE 1
SELECT * FROM test; -- 结果:age变为20
-- 5. 删除数据
DELETE FROM test WHERE id=1; -- 结果:DELETE 1
SELECT * FROM test; -- 结果:0行记录
1.5.3 关键说明
- 插入数据时,值的数量、类型必须与表的字段一一对应;
- 修改和删除数据时,必须指定 WHERE 条件,否则会修改 / 删除表中所有数据,造成数据丢失;
- PostgreSQL 的增删改查语句支持所有标准 SQL 的条件运算符(=、>、<、AND、OR、IN 等)和函数。
1.6 PostgreSQL 常用元命令汇总
元命令是 psql 终端的快捷操作命令,是日常维护中使用频率最高的指令,以下汇总了 PostgreSQL 的核心常用元命令,方便快速查阅。
表格
| 元命令 | 功能说明 | 备注 |
|---|---|---|
\l |
列出所有数据库 | 基础信息 |
\l+ |
列出所有数据库(详情) | 含大小、表空间、描述 |
\c 库名 |
切换数据库 | 等价于 \connect 库名 |
\dn |
列出所有模式 | |
\db |
列出所有表空间 | |
\dt |
列出当前模式的所有表 | 默认 public 模式 |
\dt 模式.* |
列出指定模式的所有表 | |
\dt *.* |
列出当前数据库所有表(含系统表) | |
\d 表名 |
查看表结构 | 字段、类型、可空性等 |
\d+ 表名 |
查看表结构(详情) | 更多表属性 |
\du |
列出所有数据库用户 / 角色 | 含权限、所属组等 |
\? |
查看所有元命令的帮助说明 | 元命令查询帮助 |
\q |
退出 psql 交互式终端 |
二、PostgreSQL 备份与恢复
数据是企业的核心资产,定期备份数据库是日常运维的必备工作 ,PostgreSQL 提供了三种基础备份方法:SQL 转储、文件系统级备份、连续归档,其中SQL 转储是最常用、最灵活的备份方式,适用于绝大多数场景,本文将以 SQL 转储为主,详细讲解备份与恢复的全流程。
2.1 备份与恢复的三种方式对比
为了更清晰地选择适合的备份方式,以下对三种基础备份方法进行对比,分析其优缺点和适用场景:
表格
| 备份方式 | 核心工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SQL 转储 | pg_dump、pg_dumpall | 1. 跨版本兼容,可在新版本中恢复;2. 跨架构兼容,支持 32/64 位服务器互转;3. 备份文件为 SQL 文本,易阅读、易修改;4. 不阻塞普通数据库操作;5. 可选择性备份(指定模式 / 表) | 1. 备份 / 恢复速度相对较慢;2. 备份文件体积较大 | 1. 中小型数据库日常备份;2. 数据库迁移(跨版本 / 跨服务器);3. 选择性备份指定对象 |
| 文件系统级备份 | 系统命令(cp/tar) | 1. 备份 / 恢复速度快;2. 操作简单,直接复制数据文件 | 1. 强版本依赖,仅能在同版本服务器恢复;2. 备份时需停止数据库或保证数据一致性;3. 不可跨架构恢复 | 1. 大型数据库快速全量备份;2. 本地服务器灾备恢复;3. 测试环境快速克隆 |
| 连续归档 | pg_basebackup + WAL 归档 | 1. 支持增量备份,备份体积小;2. 可恢复到任意时间点;3. 对数据库性能影响小 | 1. 配置复杂,需开启 WAL 归档;2. 恢复流程繁琐;3. 需额外的存储空间存储 WAL 日志 | 1. 企业级核心数据库;2. 要求 RTO/RPO 极低的场景;3. 需要时间点恢复的需求 |
2.2 SQL 转储:单数据库备份(pg_dump)
pg_dump是 PostgreSQL 提供的专用单数据库备份工具,属于客户端应用,可在任意能访问数据库的主机上执行备份,生成的备份文件为 SQL 命令集,可通过 psql 恢复,是日常使用最广泛的备份工具。
2.2.1 pg_dump 核心特性
- 非阻塞备份:pg_dump 工作时不会阻塞数据库的普通读 / 写操作,仅会阻塞需要排他锁的操作(如 ALTER TABLE);
- 数据一致性:备份文件为 pg_dump 开始运行时刻的数据库快照,备份过程中数据库的更新不会被包含在备份中;
- 权限要求:需要对备份的表拥有读权限,备份整个数据库时通常需要以数据库超级用户(postgres)运行;
- 跨版本 / 跨架构:是唯一支持跨 PostgreSQL 版本、跨服务器架构(32/64 位)的备份方式;
- 选择性备份:可通过参数指定备份某个模式、某个表,无需备份整个数据库。
2.2.2 pg_dump 基本用法
bash
运行
# 基础用法:备份单个数据库到文本文件
pg_dump 数据库名 > 备份文件.sql
# 示例:备份mydb数据库到/opt/backup/mydb_20241001.sql
pg_dump mydb > /opt/backup/mydb_20241001.sql
2.2.3 pg_dump 常用参数
pg_dump 提供了丰富的参数,用于实现远程备份、指定用户、选择性备份等功能,核心常用参数如下:
表格
| 参数 | 功能说明 | 示例 |
|---|---|---|
-h 主机IP/域名 |
指定数据库服务器的主机地址 | pg_dump -h 192.168.10.102 mydb > mydb.sql |
-p 端口号 |
指定数据库服务器的端口(默认 5432) | pg_dump -p 5433 mydb > mydb.sql |
-U 用户名 |
指定连接数据库的用户名(默认当前系统用户) | pg_dump -U postgres mydb > mydb.sql |
-n 模式名 |
仅备份指定的模式 | pg_dump -n hr mydb > mydb_hr.sql |
-t 表名 |
仅备份指定的表 | pg_dump -t test mydb > mydb_test.sql |
-F c |
生成自定义格式的备份文件(体积更小、恢复更快) | pg_dump -F c mydb > mydb.dump |
-v |
显示备份详细过程(verbose) | pg_dump -v mydb > mydb.sql |
2.2.4 远程备份示例
bash
运行
# 远程备份192.168.10.102上的mydb数据库,指定用户postgres,端口5432
pg_dump -h 192.168.10.102 -p 5432 -U postgres mydb > /opt/backup/mydb_remote.sql
2.3 SQL 转储:单数据库恢复
pg_dump 生成的文本格式备份文件,可通过 PostgreSQL 的交互式终端工具psql 进行恢复,自定义格式的备份文件(-F c)可通过pg_restore工具恢复,以下讲解最常用的文本文件恢复方法。
2.3.1 恢复前准备
- 恢复的目标数据库必须已存在 ,且需从
template0模板创建(避免 template1 中的自定义内容影响恢复); - 备份库中对象的拥有者、权限用户必须已存在于目标数据库中,否则无法恢复原有的所属关系和权限;
- 确保目标数据库无同名的库表对象,避免恢复时冲突。
2.3.2 基本恢复命令
bash
运行
# 步骤1:创建空数据库(从template0模板)
createdb -T template0 目标数据库名
# 步骤2:恢复备份文件到目标数据库
psql 目标数据库名 < 备份文件.sql
# 示例:恢复mydb_20241001.sql到新数据库mydb_new
createdb -T template0 mydb_new
psql mydb_new < /opt/backup/mydb_20241001.sql
2.3.3 高级恢复参数
为了提升恢复的安全性和完整性,psql 提供了核心参数,用于处理恢复过程中的错误:
表格
| 参数 | 功能说明 | 示例 |
|---|---|---|
--set ON_ERROR_STOP=on |
遇到 SQL 错误时立即退出恢复,避免部分恢复 | psql --set ON_ERROR_STOP=on mydb < mydb.sql |
-1/--single-transaction |
将整个恢复过程作为单个事务执行,要么完全成功,要么完全回滚 | psql -1 mydb < mydb.sql |
-h/-p/-U |
远程恢复时指定主机、端口、用户名 | psql -h 192.168.10.103 -U postgres mydb < mydb.sql |
2.3.4 恢复后优化
恢复完成后,建议在目标数据库上执行ANALYZE命令,更新数据库的统计信息,让查询优化器能生成更高效的执行计划:
sql
-- 对整个数据库执行ANALYZE
ANALYZE;
-- 对指定表执行ANALYZE
ANALYZE 表名;
2.4 SQL 转储:整库集簇备份(pg_dumpall)
pg_dump仅能备份单个数据库,且无法备份数据库集簇级别的信息(如角色、用户、权限、表空间等),PostgreSQL 提供了pg_dumpall工具,用于备份整个数据库集簇的所有内容,包括所有数据库、角色、表空间、权限等。
2.4.1 pg_dumpall 基本用法
bash
运行
# 基础用法:备份整个数据库集簇到文本文件
pg_dumpall > 全量备份文件.sql
# 示例:备份整个集簇到/opt/backup/pg_all_20241001.sql
pg_dumpall > /opt/backup/pg_all_20241001.sql
2.4.2 核心常用参数
表格
| 参数 | 功能说明 | 示例 |
|---|---|---|
-h/-p/-U |
远程备份时指定主机、端口、用户名 | pg_dumpall -h 192.168.10.102 -U postgres > pg_all.sql |
--globals-only |
仅备份集簇级别的全局信息(角色、表空间、权限) | pg_dumpall --globals-only > pg_globals.sql |
-v |
显示详细备份过程 | pg_dumpall -v > pg_all.sql |
2.4.3 全量恢复命令
pg_dumpall 生成的备份文件,同样通过 psql 进行恢复,恢复时通常需要连接到 postgres 数据库(默认的系统数据库),且需要超级用户权限:
bash
运行
# 全量恢复整个数据库集簇
psql -f 全量备份文件.sql postgres
# 示例:恢复pg_all_20241001.sql
psql -f /opt/backup/pg_all_20241001.sql postgres
2.4.4 关键说明
- pg_dumpall 的恢复过程会自动创建数据库、角色、表空间,无需提前手动创建;
- 若备份中包含表空间,需确保目标服务器的表空间路径与源服务器一致,否则恢复失败;
--globals-only参数常用于单独备份用户和权限,配合 pg_dump 的单数据库备份,实现完整的集簇备份(先恢复全局信息,再恢复单个数据库)。
2.5 跨服务器数据库迁移
利用 pg_dump 和 psql 的管道功能,可实现直接从源服务器将数据库迁移到目标服务器,无需生成中间备份文件,提升迁移效率,适用于数据库跨服务器部署的场景。
2.5.1 跨服务器迁移命令
bash
运行
# 格式:pg_dump 源服务器参数 源数据库 | psql 目标服务器参数 目标数据库
pg_dump -h 源IP -p 源端口 -U 源用户 源数据库 | psql -h 目标IP -p 目标端口 -U 目标用户 目标数据库
# 示例:将192.168.10.102的mydb迁移到192.168.10.103的mydb_new
pg_dump -h 192.168.10.102 -p 5432 -U postgres mydb | psql -h 192.168.10.103 -p 5432 -U postgres mydb_new
2.5.2 迁移前准备
- 目标服务器需提前创建目标数据库(从 template0 模板);
- 源服务器和目标服务器的 PostgreSQL 服务均需正常运行,且网络互通;
- 执行命令的主机需能同时访问源服务器和目标服务器的 5432 端口;
- 确保目标服务器的用户拥有创建表、模式等对象的权限。
三、PostgreSQL 远程连接配置
PostgreSQL 默认仅允许本地(127.0.0.1)连接,无法通过远程主机访问,在实际生产和开发中,通常需要配置远程连接,实现多主机访问数据库,远程连接配置分为修改监听地址 和配置访问权限两步,同时支持不同的认证方式,以下是详细配置流程。
3.1 配置前准备
3.1.1 配置文件路径
PostgreSQL 的核心配置文件有两个,不同安装方式的路径不同,需根据实际安装方式确认:
表格
| 安装方式 | postgresql.conf(主配置文件) | pg_hba.conf(访问控制文件) |
|---|---|---|
| dnf/yum 安装 | /var/lib/pgsql/data/ | /var/lib/pgsql/data/ |
| 源码编译安装 | /usr/local/pgsql/data/ | /usr/local/pgsql/data/ |
3.1.2 核心配置文件作用
- postgresql.conf:主配置文件,用于配置数据库的监听地址、端口、内存、日志等全局参数;
- pg_hba.conf:访问控制文件,全称 PostgreSQL Host-Based Authentication,用于配置哪些主机、哪些用户可以访问哪些数据库,以及使用的认证方式。
3.2 步骤 1:修改监听地址
PostgreSQL 默认监听地址为127.0.0.1,仅允许本地访问,需修改为*(监听所有 IP 地址),实现远程主机的 TCP/IP 连接。
3.2.1 编辑 postgresql.conf 文件
bash
运行
# 以dnf安装为例,打开主配置文件
vim /var/lib/pgsql/data/postgresql.conf
# 找到listen_addresses配置项,取消注释并修改为*
listen_addresses = '*' # what IP address(es) to listen on;
3.2.2 关键说明
listen_addresses:指定数据库监听的 IP 地址,多个地址用逗号分隔,*表示监听所有 IPv4 和 IPv6 地址;- 该配置项默认被注释,需先删除前面的
#取消注释,再修改值; - 若仅允许特定 IP 访问,可指定具体 IP,例:
listen_addresses = '127.0.0.1,192.168.10.102'。
3.3 步骤 2:配置访问权限(pg_hba.conf)
修改监听地址后,还需在 pg_hba.conf 中配置远程主机的访问权限,指定哪些 IP 可以访问 、访问哪些数据库 、使用哪些用户 、采用哪种认证方式,这是 PostgreSQL 远程连接的核心配置。
3.3.1 编辑 pg_hba.conf 文件
bash
运行
# 以dnf安装为例,打开访问控制文件
vim /var/lib/pgsql/data/pg_hba.conf
# 找到IPv4 local connections段,在其下方添加远程访问规则
host all all 0.0.0.0/0 trust
3.3.2 访问规则格式说明
pg_hba.conf 的访问规则遵循固定格式,每一行代表一条规则,格式为:
plaintext
连接类型 数据库名 用户名 客户端IP地址 认证方式
各字段说明:
- 连接类型 :
host表示允许 TCP/IP 远程连接,local表示仅允许本地 unix 套接字连接; - 数据库名 :指定允许访问的数据库,
all表示所有数据库,也可指定具体数据库名(如 mydb); - 用户名 :指定允许访问的数据库用户,
all表示所有用户,也可指定具体用户名(如 postgres); - 客户端 IP 地址 :指定允许连接的主机 IP,使用 CIDR 表示法,
0.0.0.0/0表示所有 IPv4 地址,::/0表示所有 IPv6 地址,也可指定具体 IP 段(如 192.168.10.0/24); - 认证方式 :PostgreSQL 支持多种认证方式,核心常用的有 3 种:
trust:信任认证,无需输入密码,直接连接,仅适用于开发 / 测试环境,生产环境禁止使用;md5:MD5 密码认证,客户端需输入密码,密码以 MD5 方式加密传输;scram-sha-256:SHA-256 加密认证,PostgreSQL 10 + 版本推荐的认证方式,安全性更高,生产环境首选。
3.3.3 常用访问规则示例
plaintext
# 允许192.168.10.0/24网段的所有用户访问所有数据库,使用scram-sha-256认证
host all all 192.168.10.0/24 scram-sha-256
# 允许192.168.10.100主机的postgres用户访问mydb数据库,使用md5认证
host mydb postgres 192.168.10.100/32 md5
# 允许所有IPv6地址的所有用户访问所有数据库,使用trust认证(测试环境)
host all all ::/0 trust
3.4 步骤 3:重启 PostgreSQL 服务
修改 postgresql.conf 和 pg_hba.conf 后,配置不会立即生效,需重启 PostgreSQL 服务,使配置生效:
bash
运行
# 重启PostgreSQL服务
systemctl restart postgresql
# 验证服务是否正常运行
systemctl status postgresql
# 验证监听端口(5432)是否开启
ss -tnl | grep 5432
若验证结果显示0.0.0.0:5432和[::]:5432,说明监听地址配置成功。
3.5 步骤 4:设置数据库用户密码(非 trust 认证)
若在 pg_hba.conf 中配置的认证方式为md5或scram-sha-256,则需要为数据库用户设置密码,否则无法远程连接,以 postgres 用户为例:
sql
-- 登录PostgreSQL后,修改postgres用户密码
ALTER USER postgres WITH PASSWORD '你的密码';
-- 示例:ALTER USER postgres WITH PASSWORD '123456';
3.6 步骤 5:验证远程连接
在远程主机上,通过 psql 命令连接目标 PostgreSQL 服务器,验证配置是否成功,分两种认证方式演示:
3.6.1 trust 认证(无密码)
bash
运行
# 格式:psql -h 目标服务器IP -U 数据库用户 数据库名
psql -h 192.168.10.102 -U postgres postgres
直接登录成功,提示符显示postgres=#,说明配置成功。
3.6.2 md5/scram-sha-256 认证(需密码)
bash
运行
# 格式:psql -h 目标服务器IP -U 数据库用户 数据库名
psql -h 192.168.10.102 -U postgres postgres
执行后提示输入密码,输入正确的密码后登录成功,说明配置成功。
3.7 远程连接注意事项
- 生产环境安全规范 :
- 禁止使用
trust认证方式,必须使用scram-sha-256(推荐)或md5; - 禁止配置
0.0.0.0/0(所有 IP),仅允许指定的业务 IP/IP 段访问; - 定期修改数据库用户密码,避免弱密码;
- 禁止使用
- 防火墙配置:确保目标服务器的防火墙开放 5432 端口,否则远程主机无法连接;
- 配置生效 :修改 pg_hba.conf 后,除了重启服务,也可执行
pg_ctl reload实现配置热加载,无需重启服务; - 多个访问规则 :pg_hba.conf 的规则从上到下依次匹配,一旦匹配到某条规则,就不再继续匹配,因此需将严格的规则放在前面。
四、PostgreSQL 密码重置
在日常维护中,若忘记 PostgreSQL 的超级用户(postgres)密码,可通过修改 pg_hba.conf 的认证方式,实现免密登录后重置密码,整个过程无需卸载或重新安装数据库,以下是详细的密码重置流程(适用于所有 PostgreSQL 版本)。
4.1 密码重置全步骤
步骤 1:备份访问控制配置文件
为了防止配置修改错误,重置密码前需先备份 pg_hba.conf 文件,方便后续恢复:
bash
运行
# 以dnf安装为例,备份pg_hba.conf
cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak
步骤 2:修改 pg_hba.conf 为本地免密认证
编辑 pg_hba.conf 文件,将本地 IPv4 连接的认证方式修改为trust,实现本地免密登录:
bash
运行
vim /var/lib/pgsql/data/pg_hba.conf
# 找到IPv4 local connections段,将认证方式改为trust
# 原配置可能为scram-sha-256或md5,修改后:
host all all 127.0.0.1/32 trust
关键说明:仅修改本地 127.0.0.1 的认证方式,远程连接的认证方式可保持不变,避免影响远程业务。
步骤 3:重启 PostgreSQL 服务
修改配置后,重启服务使免密认证生效:
bash
运行
systemctl restart postgresql
步骤 4:免密登录并重置密码
切换到 postgres 用户,免密登录 PostgreSQL,执行密码修改命令,自定义新密码:
bash
运行
# 切换postgres用户
su - postgres
# 免密登录PostgreSQL
psql
# 重置postgres用户密码,替换为你的新密码
ALTER USER postgres WITH PASSWORD 'new_password';
# 示例:ALTER USER postgres WITH PASSWORD '654321';
执行成功后,会显示ALTER ROLE,说明密码修改成功。
步骤 5:恢复原 pg_hba.conf 配置文件
密码重置完成后,需恢复之前备份的 pg_hba.conf 文件,还原原有认证方式,保证数据库安全:
bash
运行
# 以dnf安装为例,恢复备份的配置文件
cp /var/lib/pgsql/data/pg_hba.conf.bak /var/lib/pgsql/data/pg_hba.conf
# 重启服务使配置生效
systemctl restart postgresql
步骤 6:验证新密码
重新登录 PostgreSQL,验证新密码是否生效:
bash
运行
# 切换postgres用户
su - postgres
# 登录时需输入新密码
psql -U postgres
输入重置后的新密码,成功登录则说明密码重置完成。
4.2 密码重置注意事项
- 仅修改本地认证 :重置密码时,建议仅修改
127.0.0.1/32的本地认证方式,避免修改远程连接规则,影响线上业务; - 及时恢复配置 :密码重置完成后,必须立即恢复原 pg_hba.conf 配置,禁止长期使用
trust免密认证; - 备份文件保留:建议暂时保留 pg_hba.conf.bak 备份文件,待确认密码正常使用后再删除;
- 其他用户密码重置 :该方法同样适用于其他数据库用户的密码重置,只需将命令中的
postgres替换为对应的用户名即可,例:ALTER USER test WITH PASSWORD 'new_pwd';。
五、总结与运维建议
本文全面梳理了 PostgreSQL 日常维护的核心技能,从基础的登录、库表操作、模式设计,到核心的备份恢复、远程连接配置,再到应急的密码重置,覆盖了 PostgreSQL 日常使用的全场景,核心总结如下:
- 基础操作核心 :元命令是 PostgreSQL 日常操作的快捷方式,熟练使用
\l、\c、\dt、\d等元命令可大幅提升运维效率;模式(Schema)是实现数据库对象隔离的关键,合理设计模式可避免命名冲突,简化权限管理; - 备份恢复规范 :定期备份是数据安全的核心保障,中小型数据库首选
pg_dump单库备份,企业级集簇备份需配合pg_dumpall --globals-only备份用户和权限;恢复时建议使用-1参数实现事务级恢复,避免部分恢复导致的数据不一致; - 远程连接安全 :远程连接配置需完成「修改监听地址 + 配置访问权限」两步,生产环境禁止使用
trust认证和全 IP 访问,必须使用scram-sha-256认证并限制指定 IP 段; - 应急处理能力:密码重置是运维必备的应急技能,核心思路是「修改本地认证为 trust→免密登录→重置密码→恢复原配置」,整个过程需做好配置备份,避免操作失误。
5.1 日常运维建议
- 操作规范化:所有数据库操作建议在测试环境验证后,再在生产环境执行;执行删除、修改操作前,必须先备份数据,避免数据丢失;
- 备份自动化:通过 Linux 的 crontab 定时任务,实现 pg_dump 备份的自动化,建议每天全量备份,保留 7-15 天的备份文件,并存放在异地存储;
- 配置文件管理:对 postgresql.conf、pg_hba.conf 等核心配置文件进行版本管理,修改后记录变更内容,方便问题追溯;
- 权限最小化:为业务应用创建专用的数据库用户,仅授予所需的最小权限(如仅对指定模式的表拥有增删改查权限),禁止业务应用使用 postgres 超级用户;
- 监控与日志:开启 PostgreSQL 的日志功能,监控数据库的连接、查询、错误日志;同时监控数据库的磁盘空间、内存使用、CPU 负载,及时发现性能问题;
- 版本升级:定期关注 PostgreSQL 的官方版本,及时升级到稳定版本,修复安全漏洞和性能问题,升级前需做好全量备份,避免升级失败导致的数据丢失。
5.2 后续学习方向
掌握本文的基础运维技能后,可进一步学习 PostgreSQL 的高级特性,提升运维能力:
- 性能调优:学习 PostgreSQL 的内存配置(shared_buffers、work_mem)、索引优化、查询优化,提升数据库的读写性能;
- 高可用架构:学习 PostgreSQL 的主从复制、流复制、PGPool-II、Patroni 等高可用方案,实现数据库的故障自动切换;
- 分区表:学习 PostgreSQL 的分区表功能,适用于海量数据的存储和查询,提升大数据量下的数据库性能;
- 事务与锁:深入理解 PostgreSQL 的事务隔离级别、锁机制,避免并发操作中的死锁和数据不一致问题;
- 扩展插件:学习 PostgreSQL 的常用扩展插件,如 pg_stat_statements(查询统计)、pg_buffercache(缓存监控)、postgis(空间数据)等,丰富数据库的功能。