PostgreSQL云服务器安装配置指南

 更新时间:2026年05月07日 10:08:41   作者:日取其半万世不竭  
这篇文章主要介绍了PostgreSQL的相关配置,包括安装、基本配置、安全加固等,重点介绍了配置文件调整、远程访问配置、访问控制配置等内容,并强调了连接池和索引优化的重要性,需要的朋友可以参考下

MySQL 是 PHP 项目的默认选择,但越来越多的框架(Django、Ruby on Rails、Laravel 等)在认真的项目上推荐用 PostgreSQL——对 JSON、全文搜索、窗口函数、复杂查询的支持更完善,加上严格的数据类型和约束执行,写起代码来更放心。这篇文章从安装开始,覆盖生产环境需要的基本配置和安全加固。

服务器配置建议

PostgreSQL 的内存需求取决于连接数和数据量:

场景CPU内存硬盘
个人项目 / 小型应用1 核1G20GB
中型业务应用2–4 核4–8G100GB
大数据量 / 高并发8 核+16G+SSD 500GB+

我在雨云的服务器上跑 PostgreSQL,2 核 4G 的配置跑几个中小型应用完全没问题。新用户注册填优惠码 2026off 能领 5 折优惠券。

安装 PostgreSQL

# 添加官方源(获取最新版本,Ubuntu 22.04 自带的版本较旧)
sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail \
  https://www.postgresql.org/media/keys/ACCC4CF8.asc
sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
  https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \
  /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt install -y postgresql-16    # 安装 PostgreSQL 16
# 检查状态
sudo systemctl status postgresql

基本配置

安装完成后用 postgres 系统用户登录:

sudo -u postgres psql

创建数据库用户和数据库

-- 创建应用用户(不要直接用 postgres 超级用户)
CREATE USER myapp WITH PASSWORD '强密码在这里';

-- 创建数据库
CREATE DATABASE myapp_db OWNER myapp;

-- 如果需要超级用户权限(不推荐)
-- CREATE USER admin WITH SUPERUSER PASSWORD '密码';

-- 退出
\q

创建只读用户(适合查询分析)

CREATE USER readonly WITH PASSWORD '只读用户密码';
GRANT CONNECT ON DATABASE myapp_db TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

配置文件调整

主配置文件在 /etc/postgresql/16/main/postgresql.conf

sudo nano /etc/postgresql/16/main/postgresql.conf

重要参数调整:

# 连接设置
listen_addresses = 'localhost'   # 只监听本地(如需远程访问改为 '*')
max_connections = 100            # 最大连接数(根据内存调整)

# 内存设置(根据服务器内存调整)
shared_buffers = 256MB           # 建议内存的 25%
effective_cache_size = 768MB     # 建议内存的 75%
work_mem = 4MB                   # 每个排序操作的内存
maintenance_work_mem = 64MB      # VACUUM、CREATE INDEX 的内存

# 日志
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 1000  # 记录超过 1 秒的慢查询

# 检查点
checkpoint_completion_target = 0.9
wal_buffers = 16MB

远程访问配置

如果应用程序在另一台服务器上,需要开启远程访问:

# 修改 listen_addresses
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" \
  /etc/postgresql/16/main/postgresql.conf

配置访问控制(pg_hba.conf):

sudo nano /etc/postgresql/16/main/pg_hba.conf

在文件末尾添加(只允许特定 IP 访问特定数据库):

# 格式:类型 数据库 用户 地址 认证方式
host    myapp_db    myapp    应用服务器IP/32    scram-sha-256

重启 PostgreSQL:

sudo systemctl restart postgresql

在云控制台安全组放行 TCP 5432(只允许应用服务器 IP,不要对公网全开)。

连接测试

# 从应用服务器测试连接
psql -h 数据库服务器IP -U myapp -d myapp_db
# 或者用 Python
python3 -c "import psycopg2; conn = psycopg2.connect('host=数据库IP dbname=myapp_db user=myapp password=密码'); print('连接成功')"

常用管理命令

-- 列出所有数据库
\l
-- 切换数据库
\c myapp_db
-- 列出所有表
\dt
-- 查看表结构
\d 表名
-- 查看当前连接
SELECT * FROM pg_stat_activity;
-- 查看表大小
SELECT pg_size_pretty(pg_total_relation_size('表名'));
-- 查看数据库大小
SELECT pg_size_pretty(pg_database_size('myapp_db'));

备份与恢复

# 备份单个数据库(推荐格式:custom,支持并行恢复)
pg_dump -U postgres -Fc myapp_db > /backup/myapp-$(date +%Y%m%d).dump
# 备份所有数据库
pg_dumpall -U postgres | gzip > /backup/all-$(date +%Y%m%d).sql.gz
# 恢复
pg_restore -U postgres -d myapp_db /backup/myapp-20260427.dump
# 自动备份(加入 cron)
echo "0 2 * * * pg_dump -U postgres -Fc myapp_db | gzip > /backup/myapp-\$(date +\%Y\%m\%d).dump.gz" | sudo -u postgres crontab -

监控慢查询

-- 查看正在执行的慢查询
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
  AND now() - pg_stat_activity.query_start > interval '5 seconds'
ORDER BY duration DESC;

-- 找出需要添加索引的表
SELECT schemaname, tablename, seq_scan, idx_scan,
       n_live_tup, n_dead_tup
FROM pg_stat_user_tables
ORDER BY seq_scan DESC
LIMIT 10;

定期维护

# 手动执行 VACUUM(清理死元组,更新统计信息)
sudo -u postgres vacuumdb --all --analyze
# PostgreSQL 有 autovacuum 自动维护,通常不需要手动执行
# 查看 autovacuum 状态
sudo -u postgres psql -c "SELECT * FROM pg_stat_bgwriter;"

PostgreSQL 配置好之后,最值得花时间的是连接池(推荐 PgBouncer)和索引优化——连接数过多和缺少索引是绝大多数性能问题的根源。监控慢查询日志是找出优化点最直接的方式。

以上就是PostgreSQL云服务器安装配置指南的详细内容,更多关于PostgreSQL云服务器安装配置的资料请关注脚本之家其它相关文章!

相关文章

  • Postgresql ALTER语句常用操作小结

    Postgresql ALTER语句常用操作小结

    这篇文章主要介绍了Postgresql ALTER语句常用操作小结,本文讲解了增加一列、删除一列、更改列的数据类型、表的重命名、更改列的名字、字段的not null设置等常用操作的代码示例,需要的朋友可以参考下
    2015-06-06
  • Postgresql源码分析returns setof函数oracle管道pipelined

    Postgresql源码分析returns setof函数oracle管道pipelined

    这篇文章主要为大家介绍了Postgresql源码分析returns setof函数oracle管道pipelined,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • PostgreSQL分区表的实现示例

    PostgreSQL分区表的实现示例

    分区表是一种数据库优化技术,本文主要介绍了PostgreSQL分区表的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • PostgreSQL管理工具phpPgAdmin入门指南

    PostgreSQL管理工具phpPgAdmin入门指南

    phpPgAdmin是用PHP开发的一个基于web的PostgreSQL数据库管理工具。和MySql时代的PHPMyAdmin类似。本文介绍了phpPgAdmin安装和使用方法,需要的朋友可以参考下
    2014-03-03
  • PostgreSQL设置时区、时间/日期函数汇总大全

    PostgreSQL设置时区、时间/日期函数汇总大全

    PostgreSQL是一款简介而又性能强大的数据库应用程序,其在日期时间数据方面所支持的功能也都非常给力,这篇文章主要给大家介绍了关于PostgreSQL设置时区、时间/日期函数的相关资料,需要的朋友可以参考下
    2023-09-09
  • PostgreSQL创建新用户所遇见的权限问题以及解决办法

    PostgreSQL创建新用户所遇见的权限问题以及解决办法

    这篇文章主要给大家介绍了关于PostgreSQL创建新用户所遇见的权限问题以及解决办法, 在PostgreSQL中创建一个新用户非常简单,但可能会遇到权限问题,需要的朋友可以参考下
    2023-09-09
  • postgreSql分组统计数据的实现代码

    postgreSql分组统计数据的实现代码

    这篇文章给大家介绍postgreSql的监控记录表里多条不同时间的数据,只取最新的数据,并分组统计,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-12-12
  • PostgreSQL中使用dblink实现跨库查询的方法

    PostgreSQL中使用dblink实现跨库查询的方法

    这篇文章主要介绍了PostgreSQL中使用dblink实现跨库查询的方法,需要的朋友可以参考下
    2017-05-05
  • PgSQl临时表创建及应用实例解析

    PgSQl临时表创建及应用实例解析

    这篇文章主要介绍了PgSQl临时表创建及应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • PostgreSQL 删除check约束的实现

    PostgreSQL 删除check约束的实现

    这篇文章主要介绍了PostgreSQL 删除check约束的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论