【PostgreSQL安装教程】pg17.10版本从下载到生产部署图文详解,源码编译安装一篇就够了
前言
postgresql安装教程、postgresql编译安装、postgresql17.10安装、linux安装postgresql、postgresql源码安装、postgresql数据库部署、postgresql生产环境安装
PostgreSQL作为全球最先进的开源关系型数据库,凭借其卓越的稳定性、丰富的功能集和强大的扩展性,已成为无数企业和开发者的首选数据库系统。2026年5月14日,PostgreSQL官方发布了17.10版本,这是17系列的最新维护版本,包含多项重要修复和安全更新。然而,对于许多刚刚接触PostgreSQL的运维人员和开发者来说,如何正确、高效地完成PostgreSQL安装仍然是一个不小的挑战。尤其是在Linux生产环境中,源码编译安装能够带来更好的性能优化空间和更灵活的定制能力。本文将为你提供一份PostgreSQL安装教程,从环境准备到编译安装,从基础操作到参数调优,手把手带你完成PostgreSQL 17.10的企业级部署。无论你是数据库初学者还是经验丰富的DBA,这篇postgresql安装教程都将为你节省大量踩坑时间。
一、PostgreSQL是什么?
PostgreSQL是一款功能强大的开源对象关系型数据库管理系统(ORDBMS),自1986年诞生以来已历经超过35年的持续开发与迭代。它支持几乎所有SQL标准语法,包括复杂查询、事务、外键、视图、存储过程和用户自定义类型等高级功能。与MySQL等其他数据库相比,PostgreSQL在数据完整性、并发控制、扩展性和标准兼容性方面具有显著优势,广泛应用于金融、电商、物联网、地理信息系统等企业级场景。
PostgreSQL 17作为2024年9月发布的最新大版本,带来了诸多令人兴奋的新特性:全新的VACUUM内存管理系统显著降低了内存消耗并提升了清理性能;增强的SQL/JSON支持包括JSON_TABLE()、JSON_EXISTS()、JSON_QUERY()等函数;逻辑复制性能大幅提升;增量备份功能实现了高效率的核心级支持。而17.10作为17系列的最新补丁版本,集成了自17.9以来的所有修复和改进,是生产环境部署的推荐选择。
二、PostgreSQL安装包下载
在进行PostgreSQL安装之前,首先需要获取安装包。官方推荐从PostgreSQL官网下载页面获取源码包或二进制安装包。为了方便国内用户快速下载,本文提供百度网盘分享链接:
通过网盘分享的文件:postgresql-v17.10
链接: https://pan.baidu.com/s/1s4IP1hu399-QjJUqILd6-w?pwd=uinv 提取码: uinv
三、PostgreSQL安装环境要求
在开始PostgreSQL安装之前,请确保你的服务器满足以下最低配置要求:
硬件要求:
- CPU:至少2核,生产环境推荐4核及以上
- 内存:至少4GB,生产环境推荐8GB及以上
- 磁盘:至少50GB可用空间,生产环境建议SSD
- 网络:100Mbps以上
操作系统要求:
- 支持Linux(CentOS/RHEL 7/8、rocky linux等)
- 本文教程基于rocky linux9系统环境,安装rocky linux9参考文章:https://www.cnblogs.com/dbbull/p/20910634
软件依赖:
- GCC编译器及C++支持
- zlib、readline、libxml2、libxslt、openssl、perl、python等开发库
四、PostgreSQL安装步骤
本章节将详细讲解PostgreSQL源码编译安装的完整流程。
1. 创建目录
首先创建PostgreSQL安装所需的相关目录:
mkdir -p /data/postgres/pgdata
mkdir -p /data/server/tools
mkdir -p /opt/postgres
/data/postgres/pgdata:数据库数据存储目录/data/server/tools:存放安装包等工具文件/opt/postgres:PostgreSQL软件安装根目录

2. 安装依赖
使用yum包管理器安装PostgreSQL编译所需的依赖库:
yum install zlib-devel readline-devel libxml2-devel libxslt-devel openssl-devel perl-devel perl-ExtUtils-Embed python-devel gcc-c++ pkgconfig libicu-devel bison flex perl-core -y

这些依赖包分别对应:
zlib-devel:数据压缩支持readline-devel:命令行历史记录和编辑支持libxml2-devel/libxslt-devel:XML数据处理支持openssl-devel:SSL/TLS加密连接支持perl-devel/perl-ExtUtils-Embed:Perl存储过程支持python-devel:Python存储过程支持gcc-c++:C++编译器
3. 上传安装包
将下载好的PostgreSQL源码包上传到服务器指定目录:
cd /data/server/tools
# 安装rz命令
yum install lrzsz -y
rz


(使用rz命令通过sz/rz工具上传文件,也可使用scp或wget等方式)
4. 解压
解压源码包:
# 如果没有tar命令先安装
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
dnf install -y tar
tar xvf postgresql-17.10.tar.gz

5. 编译安装
进入解压后的源码目录,执行配置、编译和安装:
cd postgresql-17.10
编译环境配置检查:
./configure --prefix=/opt/postgres/pgsql17 --with-perl --with-python --with-libxml --with-libxslt --with-openssl

配置参数说明:
--prefix=/opt/postgres/pgsql17:指定安装目录--with-perl:启用Perl存储过程支持--with-python:启用Python存储过程支持--with-libxml:启用XML数据支持--with-libxslt:启用XSLT转换支持--with-openssl:启用SSL加密支持
编译二进制文件:,大约需要5-15分钟
make

编译过程根据服务器性能不同。
安装到指定目录:
make install

6. 创建软链接:
ln -s /opt/postgres/pgsql17/ /usr/local/pgsql

创建软链接方便后续路径引用和版本切换。
7. 创建用户
为安全起见,PostgreSQL应使用专用系统用户运行,而非root:
groupadd -g 1001 postgres
useradd -g 1001 -u 1001 -m postgres
chown -R postgres: /data/*
passwd postgres
-g 1001:指定组ID-u 1001:指定用户ID-m:自动创建用户家目录

8. 设置环境变量
切换到postgres用户并配置环境变量:
su - postgres
vi .bash_profile
在.bash_profile文件中添加以下内容:
export PATH=/usr/local/pgsql/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pgsql/lib
export PGDATA=/data/postgres/pgdata
使环境变量生效:
source .bash_profile

9. 数据库初始化
执行数据库初始化,创建初始数据目录和系统表:
initdb -D /data/postgres/pgdata -E UTF8 --locale="C" -W
参数说明:
-D:指定数据目录-E UTF8:设置数据库编码为UTF-8--locale="C":设置区域为C(提高性能)-W:提示设置超级用户密码

10. 启动PostgreSQL服务:
pg_ctl -D /data/postgres/pgdata -l logfile start

11. 验证服务端口:
ss -ltn
默认PostgreSQL监听5432端口,看到端口处于LISTEN状态即表示启动成功。

五、验证PostgreSQL安装
完成上述PostgreSQL安装步骤后,需要进行验证以确保安装成功。
方法一:检查进程和端口
ps -ef | grep postgres
ss -ltn | grep 5432
方法二:连接测试
psql -U postgres -d postgres
成功连接后会看到类似以下提示:
psql (17.10)
Type "help" for help.
postgres=#

方法三:查看版本信息
psql --version
输出示例:
psql (PostgreSQL) 17.10
六、PostgreSQL 基础操作(详细实战)
6.1 连接与数据库管理
1. 连接数据库
使用psql命令行工具连接数据库:
# 本地连接
psql -U postgres -d postgres
# 远程连接
psql -h 主机IP -p 5432 -U 用户名 -d 数据库名
2. 数据库的创建、修改与删除
-- 创建数据库
CREATE DATABASE mydb ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
-- 查看所有数据库
\l
-- 切换数据库
\c mydb
-- 重命名数据库
ALTER DATABASE mydb RENAME TO mydb_new;
-- 删除数据库(需先断开所有连接)
DROP DATABASE mydb;
若遇到“数据库正被其他会话使用”的报错,可强制终止连接后再删除:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='mydb' AND pid <> pg_backend_pid();
DROP DATABASE mydb;
6.2 用户与权限管理
-- 创建用户(角色)
CREATE USER app_user WITH PASSWORD 'SecurePass123' LOGIN;
CREATE USER readonly_user WITH PASSWORD 'ReadOnly456' LOGIN;
-- 修改用户密码
ALTER USER app_user WITH PASSWORD 'NewPass789';
-- 授予数据库连接权限
GRANT CONNECT ON DATABASE mydb TO app_user;
-- 授予模式(Schema)使用权限
GRANT USAGE ON SCHEMA public TO app_user;
-- 授予表级权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
-- 授予序列使用权限(用于自增列)
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;
-- 仅授予只读权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
-- 查看用户权限
\du
-- 查看某表的权限
\z employees
6.3 表操作
1. 创建表
CREATE TABLE employees (
id SERIAL PRIMARY KEY, -- 自增主键
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
hire_date DATE DEFAULT CURRENT_DATE,
salary NUMERIC(10,2) CHECK (salary > 0),
department_id INTEGER,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 为表和字段添加注释
COMMENT ON TABLE employees IS '员工信息表';
COMMENT ON COLUMN employees.salary IS '月薪(单位:元)';
2. 修改表结构
-- 添加字段
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);
-- 修改字段类型
ALTER TABLE employees ALTER COLUMN phone TYPE VARCHAR(30);
-- 重命名字段
ALTER TABLE employees RENAME COLUMN phone TO mobile;
-- 删除字段
ALTER TABLE employees DROP COLUMN mobile CASCADE;
-- 添加外键约束
ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (department_id) REFERENCES departments(id);
3. 删除表
DROP TABLE IF EXISTS employees CASCADE;
6.4 数据操作(CRUD)
1. 插入数据(INSERT)
-- 单行插入
INSERT INTO employees (name, email, salary, department_id)
VALUES ('张三', 'zhangsan@example.com', 8500.00, 1);
-- 多行插入
INSERT INTO employees (name, email, salary, department_id) VALUES
('李四', 'lisi@example.com', 9200.00, 2),
('王五', 'wangwu@example.com', 7800.00, 1);
-- 插入时若冲突则忽略
INSERT INTO employees (name, email) VALUES ('赵六', 'zhaoliu@example.com')
ON CONFLICT (email) DO NOTHING;
-- 插入时若冲突则更新
INSERT INTO employees (name, email, salary) VALUES ('赵六', 'zhaoliu@example.com', 9000)
ON CONFLICT (email) DO UPDATE SET salary = EXCLUDED.salary, updated_at = CURRENT_TIMESTAMP;
2. 查询数据(SELECT)
-- 基础查询
SELECT name, salary AS 月薪 FROM employees WHERE is_active = TRUE;
-- 条件过滤
SELECT * FROM employees
WHERE salary BETWEEN 8000 AND 12000
AND name LIKE '张%'
AND email IS NOT NULL;
-- 排序与分页
SELECT * FROM employees ORDER BY salary DESC LIMIT 10 OFFSET 20;
-- 聚合查询
SELECT
department_id,
COUNT(*) AS 人数,
ROUND(AVG(salary), 2) AS 平均工资
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;
-- 多表关联
SELECT e.name, d.dept_name, e.salary
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- 子查询
SELECT name, salary FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- 窗口函数
SELECT
name,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS 部门内排名
FROM employees;
3. 更新数据(UPDATE)
-- 更新数据(务必加WHERE)
UPDATE employees SET salary = salary * 1.1, updated_at = CURRENT_TIMESTAMP
WHERE department_id = 2 AND hire_date < '2024-01-01';
-- 使用子查询更新
UPDATE employees SET salary = salary * 1.05
WHERE department_id IN (SELECT id FROM departments WHERE dept_name = '研发部');
4. 删除数据(DELETE)
-- 删除数据(同样需要WHERE)
DELETE FROM employees WHERE is_active = FALSE AND hire_date < '2020-01-01';
-- 清空全表(比DELETE更快,且重置自增序列)
TRUNCATE TABLE employees_archive RESTART IDENTITY;
6.5 事务控制
-- 显式开启事务
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 检查业务逻辑
SELECT * FROM accounts WHERE id IN (1,2);
COMMIT; -- 提交(或 ROLLBACK 回滚)
-- 使用保存点实现部分回滚
BEGIN;
INSERT INTO logs VALUES ('操作开始');
SAVEPOINT sp1;
UPDATE employees SET salary = salary * 2 WHERE department_id = 10;
ROLLBACK TO SAVEPOINT sp1;
INSERT INTO logs VALUES ('操作结束');
COMMIT;
6.6 系统信息与监控
-- 查看当前连接数
SELECT count(*) FROM pg_stat_activity;
-- 查看当前所有会话及执行状态
SELECT pid, usename, application_name, client_addr, state, query, query_start
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start;
-- 查看数据库大小
SELECT pg_size_pretty(pg_database_size('mydb')) AS 数据库大小;
-- 查看表大小(含索引)
SELECT
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS 总大小
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- 查看当前运行的慢查询(执行超过5秒)
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 seconds'
AND state = 'active';
七、PostgreSQL 进阶操作(生产级必备)
7.1 索引的深入应用
索引类型选择:
| 索引类型 | 适用场景 |
|---|---|
| B-tree(默认) | 等值查询、范围查询、排序 |
| Hash | 等值查询(不支持范围) |
| GIN | 全文检索、JSONB键值、数组包含查询 |
| GiST | 几何数据、模糊字符串 |
| BRIN | 超大表(时序数据),按物理顺序存储的列 |
创建与管理索引:
-- 创建B-tree索引
CREATE INDEX idx_employees_name ON employees(name);
-- 创建复合索引
CREATE INDEX idx_employees_dept_salary ON employees(department_id, salary DESC);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_employees_email ON employees(email);
-- 创建表达式索引(函数索引)
CREATE INDEX idx_employees_lower_name ON employees(LOWER(name));
-- 创建部分索引(仅索引满足条件的行)
CREATE INDEX idx_active_employees ON employees(salary) WHERE is_active = TRUE;
-- 创建GIN索引用于JSONB
CREATE INDEX idx_employees_metadata ON employees USING GIN(metadata);
-- 查看索引使用情况
SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
WHERE schemaname = 'public'
ORDER BY idx_scan;
-- 重建索引(收缩碎片)
REINDEX INDEX idx_employees_name;
REINDEX TABLE employees;
7.2 视图与物化视图
普通视图:
CREATE VIEW v_employee_dept AS
SELECT e.id, e.name, e.salary, d.dept_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
SELECT * FROM v_employee_dept WHERE salary > 10000;
物化视图(存储数据,可刷新):
CREATE MATERIALIZED VIEW mv_salary_stats AS
SELECT department_id, AVG(salary) AS avg_salary, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
-- 刷新物化视图
REFRESH MATERIALIZED VIEW mv_salary_stats;
-- 并发刷新(不锁表)
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_salary_stats;
-- 创建索引
CREATE UNIQUE INDEX mv_salary_stats_dept_id ON mv_salary_stats(department_id);
7.3 存储过程与函数(PL/pgSQL)
创建函数:
CREATE FUNCTION get_annual_salary(emp_id INTEGER) RETURNS NUMERIC AS $$
DECLARE
monthly NUMERIC;
BEGIN
SELECT salary INTO monthly FROM employees WHERE id = emp_id;
RETURN monthly * 12;
END;
$$ LANGUAGE plpgsql;
SELECT get_annual_salary(1);
创建存储过程:
CREATE PROCEDURE transfer_money(from_id INT, to_id INT, amount NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE accounts SET balance = balance - amount WHERE id = from_id;
UPDATE accounts SET balance = balance + amount WHERE id = to_id;
COMMIT;
END;
$$;
CALL transfer_money(1, 2, 500.00);
创建触发器:
-- 触发器函数
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 绑定触发器
CREATE TRIGGER trigger_employees_update
BEFORE UPDATE ON employees
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
7.4 流复制(物理复制)
主库配置(postgresql.conf):
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1024MB
synchronous_commit = off
主库 pg_hba.conf:
host replication replicator 192.168.1.0/24 md5
创建复制用户:
CREATE USER replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'replpass';
从库初始化:
# 停止从库服务,清空数据目录
pg_ctl -D /data/postgres/pgdata stop
rm -rf /data/postgres/pgdata/*
# 从主库拉取基础备份
pg_basebackup -h 主库IP -U replicator -D /data/postgres/pgdata -X stream -P -R
# -R 自动生成 standby.signal 和 primary_conninfo
# 启动从库
pg_ctl -D /data/postgres/pgdata start
监控复制状态:
-- 主库查看备库连接
SELECT * FROM pg_stat_replication;
-- 从库查看复制延迟
SELECT pg_is_in_recovery();
SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn());
7.5 逻辑复制(发布/订阅)
发布端:
-- 创建发布
CREATE PUBLICATION pub_employees FOR TABLE employees;
-- 发布所有表
CREATE PUBLICATION pub_all FOR ALL TABLES;
-- 添加/删除表
ALTER PUBLICATION pub_employees ADD TABLE departments;
ALTER PUBLICATION pub_employees DROP TABLE departments;
订阅端:
-- 创建订阅(需提前创建相同表结构)
CREATE SUBSCRIPTION sub_employees
CONNECTION 'host=主库IP port=5432 dbname=mydb user=replicator password=replpass'
PUBLICATION pub_employees;
-- 暂停/恢复订阅
ALTER SUBSCRIPTION sub_employees DISABLE;
ALTER SUBSCRIPTION sub_employees ENABLE;
-- 删除订阅
DROP SUBSCRIPTION sub_employees;
查看状态:
SELECT * FROM pg_stat_subscription;
SELECT * FROM pg_replication_slots;
7.6 分区表(声明式分区)
范围分区(按日期):
-- 主表
CREATE TABLE orders (
id SERIAL,
order_date DATE NOT NULL,
customer_id INTEGER,
amount NUMERIC
) PARTITION BY RANGE (order_date);
-- 创建分区
CREATE TABLE orders_202601 PARTITION OF orders
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
CREATE TABLE orders_202602 PARTITION OF orders
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
-- 插入数据时自动路由
INSERT INTO orders (order_date, customer_id, amount) VALUES ('2026-01-15', 123, 99.50);
列表分区(按区域):
CREATE TABLE users (
id SERIAL,
name TEXT,
region TEXT
) PARTITION BY LIST (region);
CREATE TABLE users_north PARTITION OF users FOR VALUES IN ('北京', '天津', '河北');
CREATE TABLE users_south PARTITION OF users FOR VALUES IN ('广东', '广西', '海南');
分区维护:
-- 将旧分区转换为普通表
ALTER TABLE orders_202501 NO INHERIT orders;
-- 或直接删除
DROP TABLE orders_202501;
7.7 全文检索(Full-Text Search)
安装中文分词扩展(zhparser):
CREATE EXTENSION IF NOT EXISTS zhparser;
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
创建全文索引:
-- 为文章表添加tsvector列
ALTER TABLE articles ADD COLUMN tsv tsvector;
UPDATE articles SET tsv = to_tsvector('chinese', title || ' ' || content);
CREATE INDEX idx_articles_tsv ON articles USING GIN(tsv);
全文检索查询:
-- 查询包含“数据库”和“优化”的文章
SELECT * FROM articles
WHERE tsv @@ to_tsquery('chinese', '数据库 & 优化');
-- 按相关性排序
SELECT *, ts_rank(tsv, query) AS rank
FROM articles, to_tsquery('chinese', '数据库 | 性能') query
WHERE tsv @@ query
ORDER BY rank DESC;
7.8 JSON/JSONB 高效操作
-- 创建JSONB字段
ALTER TABLE employees ADD COLUMN metadata JSONB;
-- 插入JSON数据
UPDATE employees SET metadata = '{"skills": ["Python", "SQL"], "age": 30, "address": {"city": "北京"}}' WHERE id=1;
-- 查询JSON字段
SELECT name, metadata->>'age' AS age, metadata->'address'->>'city' AS city FROM employees;
-- 按JSON条件过滤
SELECT * FROM employees WHERE metadata @> '{"skills": ["Python"]}';
-- 创建GIN索引
CREATE INDEX idx_employees_metadata_gin ON employees USING GIN(metadata);
-- 更新JSONB中的某个键值
UPDATE employees SET metadata = jsonb_set(metadata, '{age}', '31'::jsonb) WHERE id=1;
7.9 性能监控与慢查询日志
开启慢查询日志(postgresql.conf):
log_min_duration_statement = 1000 # 记录执行超过1秒的SQL
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
使用pg_stat_statements:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- 查看最耗时的SQL
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
SELECT pg_stat_statements_reset();
使用EXPLAIN分析执行计划:
EXPLAIN (ANALYZE, BUFFERS, COSTS, VERBOSE)
SELECT * FROM employees WHERE name LIKE '张%';
7.10 VACUUM与ANALYZE维护
手动执行:
VACUUM (VERBOSE, ANALYZE) employees;
VACUUM ANALYZE;
自动VACUUM配置(postgresql.conf):
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_threshold = 50
autovacuum_naptime = 1min
监控表膨胀率:
SELECT
schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS total_size,
pg_size_pretty(pg_relation_size(schemaname||'.'||tablename)) AS table_size,
(pg_total_relation_size(schemaname||'.'||tablename) - pg_relation_size(schemaname||'.'||tablename)) / pg_relation_size(schemaname||'.'||tablename) * 100 AS bloat_pct
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY bloat_pct DESC;
7.11 备份与恢复
逻辑备份(pg_dump):
# 备份整个数据库(自定义格式)
pg_dump -U postgres -F c -b -v -f mydb_backup.dump mydb
# 恢复自定义格式
pg_restore -U postgres -d mydb -v mydb_backup.dump
# 备份为SQL脚本
pg_dump -U postgres -f mydb.sql mydb
# 仅备份表结构
pg_dump -U postgres -s -f mydb_schema.sql mydb
物理备份(pg_basebackup):
pg_basebackup -U postgres -D /backup/pg_base -F tar -z -P -X stream
7.12 连接池(PgBouncer)
PgBouncer配置(/etc/pgbouncer/pgbouncer.ini):
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_port = 6432
listen_addr = *
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = session
max_client_conn = 1000
default_pool_size = 20
userlist.txt:
"postgres" "postgres密码"
"app_user" "应用密码"
八、PostgreSQL参数详解
以下是PostgreSQL生产环境中常用的核心参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
shared_buffers |
系统内存的25% | 共享缓冲区大小,影响数据库缓存性能 |
work_mem |
4MB-64MB | 每个查询操作可用的内存 |
maintenance_work_mem |
64MB-1GB | 维护操作(如VACUUM)可用内存 |
effective_cache_size |
系统内存的50% | 操作系统缓存大小的估算值 |
max_connections |
根据业务需求 | 最大并发连接数 |
wal_buffers |
16MB | WAL日志缓冲区大小 |
checkpoint_completion_target |
0.7-0.9 | 检查点完成目标 |
max_wal_size |
1GB-4GB | WAL日志最大大小 |
修改参数后重启服务生效:
pg_ctl -D /data/postgres/pgdata restart
总结
至此,一份完整的PostgreSQL安装教程就全部结束了。我们从PostgreSQL的基本概念讲起,详细介绍了PostgreSQL 17.10的源码编译安装全流程,涵盖了目录创建、依赖安装、编译配置、用户创建、环境变量设置、数据库初始化等核心步骤,并进一步讲解了基础操作、进阶配置和核心参数调优。通过这篇postgresql安装教程,你应该已经能够独立完成从零到生产的PostgreSQL数据库部署。
需要特别提醒的是,生产环境中的PostgreSQL安装还需要根据实际业务负载进行针对性的参数调优和安全加固,建议定期关注PostgreSQL官方发布的安全更新。如果在安装过程中遇到任何问题,欢迎在评论区留言交流。希望这篇postgresql安装教程能帮助你顺利迈出PostgreSQL学习与应用的第一步!

浙公网安备 33010602011771号