第一章 PostgreSQL 基础与安装配置

第二节 初始化集群与基本配置(pg_hba.conf, postgresql.conf)

目标:掌握 PostgreSQL 集群的初始化流程,理解关键配置文件的作用,并能够根据实际需求修改 postgresql.confpg_hba.conf 文件以完成数据库的基本配置。

在成功安装 PostgreSQL 后,下一步通常是初始化一个“数据库集群”(Database Cluster),它是 PostgreSQL 用来组织一组数据库实例的逻辑单位。每个集群包含多个数据库和共享的全局对象(如角色、表空间等)。本节将介绍如何手动初始化集群,并深入讲解两个核心配置文件:

  • postgresql.conf:主配置文件,用于设置数据库引擎的核心参数。
  • pg_hba.conf:客户端认证配置文件,用于控制谁可以从哪里连接到数据库。

🧱 一、初始化数据库集群

在大多数 Linux 发行版中,安装 PostgreSQL 时会自动初始化默认集群。但在某些场景下(例如自定义路径部署或从源码编译),我们需要手动初始化集群。

手动初始化命令如下:

1
2
sudo -i -u postgres
initdb -D /usr/local/pgsql/data
  • -D 指定数据目录(Data Directory),你也可以使用其他路径,如 /var/lib/postgresql/17/main
  • initdb 会创建必要的系统表、模板数据库(template0template1)以及初始用户 postgres

启动数据库服务:

1
pg_ctl -D /usr/local/pgsql/data -l logfile start

你可以通过以下命令验证是否启动成功:

1
psql -c "SELECT version();"

⚙️ 二、postgresql.conf:主配置文件详解

postgresql.conf 是 PostgreSQL 的核心配置文件,位于数据目录中(如 /etc/postgresql/17/main/postgresql.conf/usr/local/pgsql/data/postgresql.conf)。

常见配置项说明:

配置项默认值描述
listen_addresseslocalhost监听的 IP 地址,设为 * 表示监听所有接口
port5432数据库监听端口
max_connections100最大并发连接数
shared_buffers128MB共享内存缓冲区大小,建议为物理内存的 25%
work_mem4MB排序和哈希操作使用的内存量
maintenance_work_mem64MB维护操作(如 VACUUM、CREATE INDEX)使用的内存
checkpoint_segments3检查点之间写入的 WAL 段数量(v17 中已被废弃)
checkpoint_timeout5min检查点之间的最大时间间隔
logging_collectoroff是否启用日志收集器
log_directorypg_log日志文件存储目录
log_filenamepostgresql-%Y-%m-%d_%H%M%S.log日志文件命名格式

示例:优化生产环境配置(假设服务器有 16GB 内存)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
listen_addresses = '*'
port = 5432
max_connections = 200
shared_buffers = 4GB
work_mem = 64MB
maintenance_work_mem = 1GB
checkpoint_segments = 16
checkpoint_timeout = 15min
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d

修改后重启服务生效:

1
sudo systemctl restart postgresql

🔐 三、pg_hba.conf:客户端认证配置文件详解

pg_hba.conf 控制客户端访问权限,决定哪些用户可以从哪些主机连接到哪些数据库,以及使用什么方式进行认证。

该文件也位于数据目录中(如 /etc/postgresql/17/main/pg_hba.conf)。

文件结构说明:

每一行为一条规则,格式如下:

1
<type> <database> <user> <address> <auth-method>
字段说明
type连接类型:local(本地)、host(TCP/IP)
database要连接的数据库名,可为 all
user用户名,可为 all
address客户端 IP 地址或 CIDR 范围(仅 TCP/IP 类型)
auth-method认证方式:trust, peer, ident, password, md5, scram-sha-256

示例配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 允许本地用户无密码登录所有数据库
local   all             all                                     peer

# 允许远程 IP 192.168.1.0/24 使用 md5 密码登录所有数据库
host    all             all             192.168.1.0/24        md5

# 允许特定用户 admin 登录 mydb 数据库,使用 SCRAM 认证
host    mydb            admin           192.168.10.0/24       scram-sha-256

# 限制只读用户只读访问
host    readonly_db     reader          10.0.0.0/16           md5

常用认证方式对比:

方法安全性说明
trust⚠️低不进行认证,任何尝试都允许连接
peer/ident✅中依赖操作系统用户名匹配
password/md5✅中明文或加密密码认证
scram-sha-256✅高推荐使用,支持更强的密码哈希机制

应用配置变更:

修改完 pg_hba.conf 后,需重新加载配置使更改生效:

1
sudo pg_ctl reload -D /usr/local/pgsql/data

或使用服务管理命令:

1
sudo systemctl reload postgresql

📝 四、实用工具推荐

1. 查看当前配置信息

1
2
3
4
5
6
7
8
-- 查看 listen_addresses
SHOW listen_addresses;

-- 查看 max_connections
SHOW max_connections;

-- 查看所有配置项
SELECT name, setting FROM pg_settings;

2. 使用 pg_config 工具查看安装路径

1
2
3
pg_config --bindir      # 可执行文件路径
pg_config --datadir     # 默认数据目录
pg_config --docdir      # 文档路径

🧪 五、实战演练:配置远程访问并创建测试用户

步骤 1:修改 pg_hba.conf

添加一行允许远程访问:

1
host    all             all             0.0.0.0/0               md5

⚠️ 生产环境请不要使用 0.0.0.0/0,应限制具体 IP 段。

步骤 2:修改 postgresql.conf

确保监听地址已开启:

1
listen_addresses = '*'

步骤 3:创建测试用户和数据库

1
2
3
sudo -i -u postgres
createuser testuser
createdb testdb

然后编辑 .pgpass 文件设置密码:

1
2
echo "localhost:5432:testdb:testuser:yourpassword" >> ~/.pgpass
chmod 600 ~/.pgpass

步骤 4:远程连接测试

使用 psql 或图形工具(如 DBeaver、pgAdmin)连接 PostgreSQL:

1
psql -h your_postgres_server_ip -U testuser -d testdb

📌 小结

文件作用关键配置项
postgresql.conf控制数据库引擎运行参数listen_addresses, max_connections, shared_buffers, work_mem
pg_hba.conf控制客户端访问权限host, local, auth-method

通过本节的学习,你应该已经掌握了 PostgreSQL 集群的初始化流程,以及如何通过 postgresql.confpg_hba.conf 文件进行基础配置。下一节我们将介绍 PostgreSQL 的核心工具 psql 与图形化客户端(如 pgAdmin)的使用。