【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以上

操作系统要求:

软件依赖:

  • 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软件安装根目录

1_shuiyin

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

2_shuiyin

这些依赖包分别对应:

  • 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

3a_shuiyin

3b_shuiyin

(使用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

4a_shuiyin

5. 编译安装

进入解压后的源码目录,执行配置、编译和安装:

cd postgresql-17.10

编译环境配置检查:

./configure --prefix=/opt/postgres/pgsql17 --with-perl --with-python --with-libxml --with-libxslt --with-openssl

5_shuiyin

配置参数说明:

  • --prefix=/opt/postgres/pgsql17:指定安装目录
  • --with-perl:启用Perl存储过程支持
  • --with-python:启用Python存储过程支持
  • --with-libxml:启用XML数据支持
  • --with-libxslt:启用XSLT转换支持
  • --with-openssl:启用SSL加密支持

编译二进制文件:,大约需要5-15分钟

make

5b_shuiyin

编译过程根据服务器性能不同。

安装到指定目录:

make install

5c_shuiyin

6. 创建软链接:

ln -s /opt/postgres/pgsql17/ /usr/local/pgsql

6_shuiyin

创建软链接方便后续路径引用和版本切换。

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:自动创建用户家目录

7_shuiyin

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

8_shuiyin

9. 数据库初始化

执行数据库初始化,创建初始数据目录和系统表:

initdb -D /data/postgres/pgdata -E UTF8 --locale="C" -W

参数说明:

  • -D:指定数据目录
  • -E UTF8:设置数据库编码为UTF-8
  • --locale="C":设置区域为C(提高性能)
  • -W:提示设置超级用户密码

9_shuiyin

10. 启动PostgreSQL服务:

pg_ctl -D /data/postgres/pgdata -l logfile start

10_shuiyin

11. 验证服务端口:

ss -ltn

默认PostgreSQL监听5432端口,看到端口处于LISTEN状态即表示启动成功。

11_shuiyin


五、验证PostgreSQL安装

完成上述PostgreSQL安装步骤后,需要进行验证以确保安装成功。

方法一:检查进程和端口

ps -ef | grep postgres
ss -ltn | grep 5432

方法二:连接测试

psql -U postgres -d postgres

成功连接后会看到类似以下提示:

psql (17.10)
Type "help" for help.
postgres=#

12_shuiyin

方法三:查看版本信息

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;

安装中文分词扩展(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学习与应用的第一步!

posted @ 2026-07-21 18:12  DB哥  阅读(52)  评论(0)    收藏  举报