PostgreSQL 数据库环境搭建与基础管理完全指南

PostgreSQL 数据库环境搭建与基础管理完全指南

Someone Lv5

PostgreSQL 是全球功能最强大的开源关系型数据库之一,以其高度的 ACID 合规性、丰富的扩展生态和卓越的并发控制能力著称。本文将详细讲解在 Ubuntu 22.04 上部署 PostgreSQL 17 的完整流程,涵盖安装配置、用户权限、备份恢复、性能调优及生产环境安全加固。

一、PostgreSQL 核心特性概述

PostgreSQL 与其他主流数据库相比有以下突出优势:

特性PostgreSQLMySQL/MariaDB
ACID 合规性完全支持取决于存储引擎
扩展类型系统支持自定义类型、枚举、复合类型有限
并发控制MVCC(多版本并发控制)MVCC
索引类型B-tree、Hash、GiST、GIN、BRIN 等 7 种B-tree、Hash、Full-text
JSON 支持JSON/JSONB 二进制格式,可索引JSON 支持
全文搜索内置 tsvector/tsquery内置
窗口函数完全支持8.0+ 支持
并行查询支持(并行顺序扫描、并行聚合等)8.0+ 支持
扩展生态PostGIS、pg_stat_statements、pg_partman 等有限
许可证PostgreSQL License(类 MIT)GPL / 商业版

二、安装 PostgreSQL 17

2.1 添加官方 APT 源

Ubuntu 系统仓库中的 PostgreSQL 版本通常较旧,推荐使用 PostgreSQL Global Development Group(PGDG)维护的官方 APT 源安装最新版本。

1
2
3
4
5
6
7
8
9
# 导入 GPG 密钥
sudo apt install -y curl ca-certificates gnupg
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg

# 添加 PostgreSQL 官方源(以 Ubuntu 22.04 Jammy 为例)
echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

# 更新软件包列表
sudo apt update

2.2 安装 PostgreSQL 17

1
2
3
4
5
# 安装 PostgreSQL 17 服务器和客户端工具
sudo apt install -y postgresql-17 postgresql-client-17

# 可选:安装 contrib 扩展包(包含 pg_stat_statements 等常用扩展)
sudo apt install -y postgresql-contrib-17

2.3 验证安装

1
2
3
4
5
6
7
8
# 检查服务状态
sudo systemctl status postgresql

# 检查 PostgreSQL 版本
psql --version

# 以 postgres 用户登录测试
sudo -u postgres psql -c "SELECT version();"

安装完成后,PostgreSQL 服务会自动启动并设置为开机自启。

三、配置文件详解

PostgreSQL 的核心配置文件位于 /etc/postgresql/17/main/ 目录下:

配置文件 用途
postgresql.conf 主配置文件,控制运行时行为
pg_hba.conf 客户端认证配置文件(主机基本认证)
pg_ident.conf 用户名映射配置文件

3.1 postgresql.conf 核心参数

1
sudo -u postgres psql -c "SHOW config_file;"

以下是一组生产环境推荐配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# /etc/postgresql/17/main/postgresql.conf

# 连接配置
listen_addresses = '*' # 监听所有网络接口(生产环境建议指定 IP)
port = 5432 # 默认端口
max_connections = 200 # 最大连接数(根据内存调整)

# 内存配置(以 8GB 内存服务器为例)
shared_buffers = 2GB # 建议为物理内存的 25%
effective_cache_size = 6GB # 建议为物理内存的 75%
work_mem = 16MB # 每个排序操作的内存
maintenance_work_mem = 512MB # 维护操作(VACUUM、CREATE INDEX)的内存
wal_buffers = 64MB # WAL 缓冲区

# 写入配置
wal_level = replica # WAL 级别(复制需要 replica 或 logical)
max_wal_size = 4GB # 最大 WAL 大小
min_wal_size = 1GB # 最小 WAL 大小
checkpoint_completion_target = 0.9 # 检查点完成目标

# 查询优化配置
default_statistics_target = 100 # 统计信息目标
random_page_cost = 1.1 # 随机页成本(SSD 建议 1.1,HDD 默认 4.0)
effective_io_concurrency = 200 # 并发 I/O 数(SSD 建议 200)

# 日志配置
log_destination = 'stderr' # 日志输出方式
logging_collector = on # 开启日志收集
log_directory = 'log' # 日志目录
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'ddl' # 记录 DDL 语句
log_min_duration_statement = 1000 # 记录超过 1 秒的慢查询

3.2 pg_hba.conf 认证配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/postgresql/17/main/pg_hba.conf

# 本地连接(使用 Unix 套接字)
local all all peer

# IPv4 本地回环
host all all 127.0.0.1/32 scram-sha-256

# IPv6 本地回环
host all all ::1/128 scram-sha-256

# 远程连接(生产环境应限制具体 IP 段)
host all all 0.0.0.0/0 scram-sha-256

修改配置后必须重启服务:

1
sudo systemctl restart postgresql

四、用户与数据库管理

4.1 默认用户说明

PostgreSQL 安装后默认创建一个名为 postgres 的系统用户和数据库超级用户。

4.2 创建新用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 方法一:使用 createuser 命令行工具
sudo -u postgres createuser --interactive
# 按提示输入:用户名、是否超级用户、是否允许创建数据库、是否允许创建角色

# 方法二:使用 psql
sudo -u postgres psql

-- 创建登录用户
CREATE USER myuser WITH PASSWORD 'StrongPass123!';

-- 创建超级用户
CREATE USER adminuser WITH SUPERUSER PASSWORD 'AdminPass456!';

-- 创建只读用户
CREATE USER readonly WITH PASSWORD 'ReadOnly789!';
GRANT CONNECT ON DATABASE mydb TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

4.3 创建数据库

1
2
3
4
5
-- 创建数据库并指定所有者
CREATE DATABASE mydb OWNER myuser;

-- 设置数据库参数
ALTER DATABASE mydb SET timezone TO 'Asia/Shanghai';

4.4 权限管理常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 授予指定用户对某数据库的所有权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

-- 授予指定用户对公共 schema 的使用权限
GRANT ALL ON SCHEMA public TO myuser;

-- 授予指定用户对某数据库的所有表权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

-- 回收权限
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM readonly;

-- 查看用户与权限
\du -- 列出所有角色
\l -- 列出所有数据库
\dt+ -- 列出所有表及大小
\dp mytable -- 查看表权限
SELECT * FROM information_schema.role_table_grants WHERE grantee='myuser';

五、数据导入导出与备份恢复

5.1 pg_dump 逻辑备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 备份单个数据库
pg_dump -U myuser -h localhost -d mydb -F c -f /backup/mydb_20260612.dump

# 备份为 SQL 纯文本格式
pg_dump -U myuser -h localhost -d mydb -f /backup/mydb_20260612.sql

# 备份指定表
pg_dump -U myuser -h localhost -d mydb -t mytable -f /backup/mytable.sql

# 压缩备份
pg_dump -U myuser -h localhost -d mydb -F c -Z 9 -f /backup/mydb_20260612.dump

# 并行备份(PostgreSQL 17 支持)
pg_dump -U myuser -h localhost -d mydb -j 4 -F d -f /backup/mydb_parallel/

5.2 pg_restore 恢复

1
2
3
4
5
6
# 恢复自定义格式备份
pg_restore -U myuser -h localhost -d mydb -v /backup/mydb_20260612.dump

# 若数据库不存在,先创建空数据库
createdb -U myuser -h localhost mydb_new
pg_restore -U myuser -h localhost -d mydb_new /backup/mydb_20260612.dump

5.3 pg_dumpall 全库备份

1
2
3
4
# 备份所有数据库(包含用户信息和表空间)
sudo -u postgres pg_dumpall -f /backup/full_backup_20260612.sql

# 注意:pg_dumpall 只能输出 SQL 文本格式

5.4 定时自动备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# /usr/local/bin/pg_backup.sh

BACKUP_DIR="/backup/postgresql"
DB_NAME="mydb"
DB_USER="myuser"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/pg_backup.log"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
echo "[$(date)] 开始备份 $DB_NAME" >> $LOG_FILE
pg_dump -U $DB_USER -h localhost -d $DB_NAME -F c -Z 6 -f $BACKUP_DIR/${DB_NAME}_${DATE}.dump 2>> $LOG_FILE

# 校验备份文件
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功: ${DB_NAME}_${DATE}.dump (大小: $(du -h $BACKUP_DIR/${DB_NAME}_${DATE}.dump | cut -f1))" >> $LOG_FILE
else
echo "[$(date)] 备份失败!" >> $LOG_FILE
exit 1
fi

# 删除过期备份
find $BACKUP_DIR -name "${DB_NAME}_*.dump" -mtime +$RETENTION_DAYS -delete
echo "[$(date)] 清理完毕" >> $LOG_FILE

添加到 crontab 实现每日定时备份:

1
2
3
4
# 每天凌晨 3 点执行备份
sudo crontab -e
# 添加以下行:
0 3 * * * /usr/local/bin/pg_backup.sh

六、常用扩展安装与使用

PostgreSQL 的扩展生态是其重要优势,以下是一些常用扩展:

6.1 pg_stat_statements(查询性能统计)

1
2
3
4
5
6
7
8
9
-- 启用扩展
CREATE EXTENSION pg_stat_statements;

-- 查看最耗时的查询
SELECT query, calls, total_exec_time, rows,
round(total_exec_time / calls, 2) AS avg_time_ms
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

6.2 PostGIS(地理空间扩展)

1
sudo apt install -y postgresql-17-postgis-3
1
2
3
4
5
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;

-- 验证安装
SELECT PostGIS_Full_Version();

6.3 uuid-ossp(UUID 生成)

1
2
CREATE EXTENSION "uuid-ossp";
SELECT uuid_generate_v4(); -- 生成随机 UUID

6.4 pg_partman(分区管理)

1
2
3
4
5
6
7
8
9
10
CREATE EXTENSION pg_partman;

-- 创建按时间分区的表
SELECT partman.create_parent(
p_parent_table := 'public.metrics',
p_control := 'created_at',
p_type := 'native',
p_interval := '1 day',
p_premake := 7
);

七、性能监控与调优

7.1 实时监控数据库活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 查看当前连接
SELECT pid, usename, application_name, client_addr,
state, query_start, wait_event_type, wait_event
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start;

-- 查看表大小和膨胀率
SELECT
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
n_live_tup AS live_rows,
n_dead_tup AS dead_rows,
round(n_dead_tup::numeric / nullif(n_live_tup, 0), 2) AS dead_ratio
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

7.2 VACUUM 与 ANALYZE

1
2
3
4
5
6
7
-- 手动 VACUUM(回收存储空间)
VACUUM (VERBOSE, ANALYZE) mytable;

-- 查看自动清理配置
SHOW autovacuum;
SHOW autovacuum_vacuum_threshold;
SHOW autovacuum_vacuum_scale_factor;

7.3 慢查询日志分析

1
2
3
4
5
6
# 查看慢查询日志
sudo tail -f /var/log/postgresql/postgresql-17-main.log | grep "duration:"

# 使用 pgBadger 生成可视化报告
sudo apt install -y pgbadger
sudo pgbadger /var/log/postgresql/postgresql-17-main.log -o /tmp/report.html

八、安全加固最佳实践

8.1 网络层安全

1
2
3
# 配置 UFW 防火墙,仅允许可信 IP 访问
sudo ufw allow from 192.168.1.0/24 to any port 5432
# 不建议直接对外网暴露 5432 端口

8.2 认证强化

1
2
3
4
5
-- 修改默认 postgres 用户密码
ALTER USER postgres WITH PASSWORD 'StrongPassword123!';

-- 建议在 pg_hba.conf 中使用 scram-sha-256(默认)而不是 md5
-- PostgreSQL 17 已弃用 md5

8.3 SSL/TLS 加密连接

1
2
3
4
5
6
7
8
9
10
11
12
# 生成自签名证书
sudo -u postgres mkdir -p /etc/postgresql/17/main/certs
sudo -u postgres openssl req -new -text -subj "/CN=server" \
-out /etc/postgresql/17/main/certs/server.req
openssl rsa -in /etc/postgresql/17/main/certs/privkey.pem \
-out /etc/postgresql/17/main/certs/server.key
rm -f /etc/postgresql/17/main/certs/privkey.pem
openssl req -x509 -in /etc/postgresql/17/main/certs/server.req \
-text -key /etc/postgresql/17/main/certs/server.key \
-out /etc/postgresql/17/main/certs/server.crt
chmod 600 /etc/postgresql/17/main/certs/server.key
chown postgres:postgres /etc/postgresql/17/main/certs/server.key

然后在 postgresql.conf 中启用 SSL:

1
2
3
ssl = on
ssl_cert_file = 'certs/server.crt'
ssl_key_file = 'certs/server.key'

8.4 安全审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 启用审计日志(通过配置 log_statement = 'all')
ALTER SYSTEM SET log_statement = 'all';
SELECT pg_reload_conf();

-- 创建事件触发器记录 DDL 变更
CREATE OR REPLACE FUNCTION audit_ddl()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE 'DDL command executed: %', current_query();
END;
$$ LANGUAGE plpgsql;

CREATE EVENT TRIGGER audit_ddl_trigger
ON ddl_command_start
EXECUTE FUNCTION audit_ddl();

九、常见问题排查

问题原因解决方案
服务无法启动端口冲突或数据目录权限错误sudo systemctl status postgresql 查看日志,检查 /var/log/postgresql/
连接被拒绝pg_hba.conf 配置错误或未监听正确地址检查 listen_addresses,确认 pg_hba.conf 规则顺序
密码认证失败认证方式或密码加密不匹配确认 PostgreSQL 17 默认使用 scram-sha-256,检查 pg_hba.conf
查询速度慢索引缺失或统计信息过时运行 ANALYZE,使用 EXPLAIN ANALYZE 分析查询计划
磁盘空间满WAL 文件未归档或日志过大检查 max_wal_size,清理过期 WAL,配置日志轮转
连接数耗尽max_connections 过低或连接未释放增加 max_connections,配置连接池(PgBouncer)
主从复制延迟网络延迟或备库性能不足检查 wal_keep_size,确认备库硬件配置,监控 replication slot
备份恢复失败备份文件损坏或版本不匹配确保 pg_dump/pg_restore 版本与服务器一致,定期测试恢复

十、生产环境部署 Checklist

  • 修改默认 postgres 用户密码
  • 配置 pg_hba.conf 使用 scram-sha-256 认证
  • 设置 listen_addresses 为具体 IP 而非 *
  • 配置 UFW 防火墙,限制 5432 端口访问来源
  • 调整 shared_bufferseffective_cache_size 为物理内存的合理比例
  • 启用日志收集并设置慢查询阈值
  • 配置自动清理参数(autovacuum)
  • 安装 pg_stat_statements 扩展监控查询性能
  • 配置 SSL/TLS 加密连接
  • 编写定时备份脚本并测试恢复流程
  • 配置系统监控(Prometheus + postgres_exporter)
  • 设置内核参数优化:vm.dirty_background_ratiokernel.sem

总结

PostgreSQL 17 在 Ubuntu 22.04 上的部署流程清晰且成熟。通过本文的完整指南,你已经掌握了从安装配置到用户管理、备份恢复、性能监控以及安全加固的全链路操作。在实际生产环境中,建议严格按照部署 Checklist 逐项确认,并定期执行恢复演练以验证备份的可用性。PostgreSQL 强大的扩展生态和持续的功能迭代,使其成为企业级应用的首选数据库之一。

本文由AI辅助生成,内容仅供参考

  • 标题: PostgreSQL 数据库环境搭建与基础管理完全指南
  • 作者: Someone
  • 创建于 : 2026-06-12 08:24:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-12-postgresql-setup-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。