一、前言
基本的Ubuntu如何安装PostgreSQL此处不再赘述,如果需要安装PostgreSQL,可以自己看下官方的安装文档,写的已经比较全面了。地址我这里贴在下方。根据自己的操作系统选择,然后执行命令即可。
二、设置初始密码
我这里安装的版本为18版本的PostgreSQL,不同版本的命令可能有略微的不同。
sudo -u postgres psql -c "ALTER USER postgres PASSWORD '你的强密码';"三、基本配置
1.开启防火墙端口
我这里需要将PostgreSQL放到外网链接,因此,需要开启防火墙的5432端口,系统是Ubuntu 26
sudo ufw allow 5432/tcp && ufw reload2.修改监听地址
在系统中,监听的地址默认是被注释掉的,因此需要删除注释,能够让服务监听V4和V6地址。
#备份配置文件,避免中途修改错导致服务异常,注意:不同版本,命令有区别
sudo cp /etc/postgresql/18/main/postgresql.conf /etc/postgresql/18/main/postgresql.conf.bak然后直接编辑文件
#编辑文件
vim /etc/postgresql/18/main/postgresql.conf然后找到第60行,将前面;删除,并localhost改*
listen_addresses = '*'然后ESC退出编辑,输:wq保退出
3.配置客户端认证
注意:不建议各位将管理员postgre权限设置为所有IP均可登录,我此处仅将其他用户设置为允许所有IP登录。
#首先还是备份客户端配置文件,避免因为修改错误导致服务异常,注意:不同版本,命令略有区别
sudo cp /etc/postgresql/18/main/pg_hba.conf /etc/postgresql/18/main/pg_hba.conf.bak然后进行编辑
vim /etc/postgresql/18/main/pg_hba.conf将配置中IPv4 local connections和IPv6 local connections修改为下方的配置
# 允许所有用户通过密码从任意 IP 访问
host all all 0.0.0.0/0 scram-sha-256
host all all ::0/0 scram-sha-256注意:保留配置中的第一项,即可保留管理员账户只能本地登录。如果客户端较旧不支持 SCRAM,可将 scram-sha-256 改为 md5。
然后ESC退出编辑,输:wq保退出
四、根据服务器配置,调整参数
我这里使用的服务器配置是4核8G服务器,因此,我对配置进行了调整,这样也让PostgreSQL的性能有一定的提升。
还是操作修postgresql.conf 建议操作前还是提前备份,如果你不需要备份,跳过下方命令即可。
#备份配置文件,避免中途修改错导致服务异常,注意:不同版本,命令有区别
sudo cp /etc/postgresql/18/main/postgresql.conf /etc/postgresql/18/main/postgresql.conf.bak然后进行编辑
#编辑文件
vim /etc/postgresql/18/main/postgresql.conf1.修改shared_buffers
在第132行,这是 PostgreSQL 专用的共享内存缓存。一般建议设置为内存的25%,我这里设置为2G,可以提高热数据缓存在内存中的概率,减少磁盘随机读,提升查询响应速度。
shared_buffers = 2GB2.修改effective_cache_size
在第477行,告诉查询规划器“操作系统文件缓存大概有多大”。通常设为总内存的 50%~75%,8GB 的 75% 是 6GB。规划器会更准确地判断索引扫描是否比顺序扫描更划算,倾向于使用索引,从而生成更优的查询计划。
effective_cache_size = 6GB3.修改work_mem
在第143行,每个排序、哈希操作可以使用的内存。默认 4MB 极小,稍微复杂一点的查询就会用磁盘临时文件,严重拖慢速度。这个值是 每个操作 可用的内存,一个复杂查询可能使用多个 work_mem。如果链接上限比较大,建议设置为16MB之类的,否则可能造成内存被大量占用。我这里设置的32MB,上限限定了100个链接。
work_mem = 32MB4.修改maintenance_work_mem
在第145行,用于 VACUUM、CREATE INDEX、ALTER TABLE 等维护操作的内存。我这里的8G服务器,我设置的512MB。能够提升索引创建速度,自动清理(autovacuum)时扫描表更快,减少维护操作对正常业务的影响。
maintenance_work_mem = 512MB5.修改max_wal_size 和min_wal_size
在第271行和172行,max_wal_size 控制检查点之前最多产生多少 WAL 日志。默认 1GB 较小,写入频繁时会导致频繁检查点,引发 IO 尖峰。增大到 2GB 可以降低检查点频率。min_wal_size 适当调大,避免 WAL 文件被过早回收后又要立即分配。
max_wal_size = 2GB
min_wal_size = 160MB6.修改random_page_cost
在第439行,默认 4.0 是基于传统机械硬盘的假设。现在绝大多数云服务器使用 SSD,随机读延迟极低,应设置为 1.0~1.1。
random_page_cost = 1.17.修改effective_io_concurrency
在第205行,对于 SSD,操作系统可以并发处理多个 I/O 请求。设为 200 能让 PostgreSQL 更积极地发出并发预读请求,加速顺序扫描和位图扫描。机械硬盘则设为 2。可以提升全表扫描和位图索引扫描的速度。
effective_io_concurrency = 2008.修改max_parallel_workers 和max_parallel_workers_per_gather
在第224行,我的服务器只有 4 个 CPU 核心,默认 max_parallel_workers 为 8 会超配,过多并行进程反而互相争抢 CPU,得不偿失。限制为 4 更合理。per_gather 保持 2 即可。
max_parallel_workers = 4
max_parallel_workers_per_gather = 29.修改autovacuum_max_workers
在第689行,多核心服务器可以启动更多 autovacuum 工作进程,加速表的清理和分析,防止事务 ID 回卷。4 核设置为 4 能并行处理多张表。数据库垃圾回收更及时,表膨胀更小,查询性能更稳定。
autovacuum_max_workers = 410.修改autovacuum_work_mem
在第146行,如果不单独设置,autovacuum 会使用 maintenance_work_mem 的值(我们设的 512MB)。但 autovacuum 同时在多个表上工作,若每个 worker 都占用 512MB 可能浪费内存。单独限制为 256MB 更稳妥。避免 autovacuum 占用过多内存,同时维持其清理效率。
autovacuum_work_mem = 256MB11.修改huge_pages
在第134行,PostgreSQL 18 默认就是 try,但配置中注释掉了。建议显式开启 try,让系统在支持大页时自动使用。可以降低内存管理开销,减少页表条目,提高大内存场景下的性能。
huge_pages = try12.日志与监log_min_duration_statement 和shared_preload_libraries
在第561行和818行,log_min_duration_statement:帮助找出低效 SQL 进行优化,生产环境非常有价值。pg_stat_statements:收集所有查询的执行统计,需要通过 CREATE EXTENSION 启用,是性能分析的利器。
五、修改后重启PostgreSQL
systemctl restart postgresql@18-main
评论区