PostgreSQL 安装部署及配置使用教程

 更新时间:2025年11月07日 14:54:49   作者:猩火燎猿  
PostgreSQL是一个功能强大的开源对象关系型数据库系统,支持 SQL 标准和扩展,适合各种规模应用,本文给大家介绍PostgreSQL 安装部署及配置使用,感兴趣的朋友跟随小编一起看看吧

一、PostgreSQL 简介

PostgreSQL 是一个功能强大的开源对象关系型数据库系统,支持 SQL 标准和扩展,适合各种规模应用。

二、安装 PostgreSQL

1. Linux(以 Ubuntu 为例)

1.1 更新系统包列表

sudo apt update

1.2 安装 PostgreSQL

sudo apt install postgresql postgresql-contrib

1.3 查看 PostgreSQL 服务状态

sudo systemctl status postgresql

2. CentOS/RHEL

sudo yum install -y postgresql-server postgresql-contrib
sudo postgresql-setup initdb
sudo systemctl enable postgresql
sudo systemctl start postgresql

3. Windows

  1. 访问 PostgreSQL 官网 下载安装包。
  2. 运行安装程序,按提示选择安装路径、端口、超级用户密码等。
  3. 安装完成后,可通过 pgAdmin 或命令行管理数据库。

三、基本配置

1. 配置文件位置

  • postgresql.conf:主配置文件,通常在 /etc/postgresql/<版本>/main/ 或 /var/lib/pgsql/data/
  • pg_hba.conf:客户端连接认证配置文件

2. 修改监听地址(允许远程连接)

编辑 postgresql.conf

listen_addresses = '*'

编辑 pg_hba.conf,添加如下一行允许所有 IP 通过密码方式访问:

host    all             all             0.0.0.0/0               md5

修改后重启服务:

sudo systemctl restart postgresql

3. 设置端口号

在 postgresql.conf 中修改:

port = 5432

四、数据库管理

1. 切换到 PostgreSQL 用户(Linux)

sudo -i -u postgres

2. 进入数据库命令行

psql

3. 创建数据库和用户

-- 创建用户
CREATE USER myuser WITH PASSWORD 'mypassword';
-- 创建数据库
CREATE DATABASE mydb OWNER myuser;
-- 授权
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

4. 修改用户权限

ALTER USER myuser WITH SUPERUSER;

五、基本使用

1. 连接数据库

命令行连接

psql -U myuser -h localhost -d mydb

使用 pgAdmin(图形化工具)

  • 打开 pgAdmin,添加服务器,填写连接信息。

2. 常用 SQL 操作

-- 创建表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
-- 查询数据
SELECT * FROM users;
-- 更新数据
UPDATE users SET name = 'Bob' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;

六、备份与恢复

1. 备份数据库

pg_dump -U myuser -h localhost mydb > mydb_backup.sql

2. 恢复数据库

psql -U myuser -h localhost -d mydb < mydb_backup.sql

七、常用维护命令

  • 查看数据库列表:\l
  • 切换数据库:\c dbname
  • 查看表列表:\dt
  • 查看用户列表:\du
  • 退出:\q

八、附加说明

  • 推荐使用 pgAdmin 进行图形化管理。
  • 可以使用 Docker 快速部署:
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres

九、进阶配置

1. 连接数与内存参数

在 postgresql.conf 中调整:

max_connections = 100          # 最大连接数
shared_buffers = 128MB         # 数据库缓存区大小,建议为物理内存的 1/4
work_mem = 4MB                 # 每个查询操作分配的内存
maintenance_work_mem = 64MB    # 维护操作(如 VACUUM)的内存
effective_cache_size = 512MB   # 操作系统可用于缓存的内存估算

修改后需重启 PostgreSQL 服务。

2. 日志设置

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'   # 建议生产环境设置为 'none' 或 'mod'

3. 自动清理(VACUUM)

PostgreSQL 自动进行垃圾回收,但可手动执行:

VACUUM;
VACUUM FULL;      -- 更彻底,可能会锁表

十、性能优化建议

索引优化
创建索引可加速查询:

CREATE INDEX idx_users_email ON users(email);

查询优化
使用 EXPLAIN 分析 SQL 性能:

EXPLAIN SELECT * FROM users WHERE email = 'xxx';

分区表
大表可分区提升性能:

CREATE TABLE measurement (
  city_id         int,
  logdate         date,
  peaktemp        int,
  unitsales       int
) PARTITION BY RANGE (logdate);

连接池
建议使用连接池(如 PgBouncer)减少资源消耗。

十一、扩展插件

PostGIS:地理空间数据库扩展

sudo apt install postgis
CREATE EXTENSION postgis;

uuid-ossp:生成 UUID

CREATE EXTENSION "uuid-ossp";
SELECT uuid_generate_v4();

pg_stat_statements:SQL 统计分析

CREATE EXTENSION pg_stat_statements;
SELECT * FROM pg_stat_statements;

十二、安全加固

密码策略
强密码,定期更换,禁用默认用户 postgres 的远程访问。

限制访问 IP
编辑 pg_hba.conf,只允许信任 IP 段访问。

SSL 加密
配置 SSL,保护数据传输安全。

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'

定期备份
使用 pg_dump 或 pg_basebackup 定期备份,保存到安全位置。

十三、常见问题及解决方法

  • 无法远程连接
    • 检查 listen_addresses 和 pg_hba.conf 配置。
    • 检查防火墙是否开放 5432 端口。
  • 密码认证失败
    • 确认用户名、密码正确。
    • 检查 pg_hba.conf 的认证方式(如 md5scram-sha-256)。
  • 数据库启动失败
    • 查看日志文件(pg_log 目录)。
    • 检查磁盘空间和配置文件语法。
  • 性能变慢
    • 检查慢查询日志。
    • 执行 VACUUM 和 REINDEX
    • 增加内存分配。

十四、高可用与主从复制

1. 主从流复制

主库配置

编辑 postgresql.conf

wal_level = replica
max_wal_senders = 10
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'

在 pg_hba.conf 添加从库 IP:

host replication all <slave_ip>/32 md5

从库初始化

使用 pg_basebackup

pg_basebackup -h <master_ip> -D /var/lib/postgresql/data -U replication -P --wal-method=stream

配置 recovery.conf(PostgreSQL 12 及以上为 standby.signal 文件)。

十五、常用工具推荐

  • pgAdmin:官方图形化管理工具
  • DBeaver:多数据库管理工具
  • Navicat:商业数据库管理工具
  • psql:命令行工具
  • PgBouncer:轻量级连接池

十六、自动备份与定时任务

1. 使用cron定时备份(Linux)

编辑 crontab,例如每天凌晨2点自动备份数据库:

crontab -e

添加如下内容:

0 2 * * * pg_dump -U myuser -h localhost mydb > /backup/mydb_$(date +\%F).sql

注意:确保 /backup/ 目录存在且有写权限,myuser 用户有备份权限。

2. 自动清理过期备份脚本示例

保留最近7天备份,其余自动删除:

find /backup/ -name "mydb_*.sql" -mtime +7 -exec rm {} \;

3. Windows 定时任务

可用“任务计划程序”调用批处理或 PowerShell 脚本实现定时备份。

十七、数据库监控

1. 内置视图

  • pg_stat_activity:查看当前连接和执行的SQL
  • pg_stat_database:数据库级统计信息

示例:

SELECT * FROM pg_stat_activity;
SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database;

2. 监控工具

  • pgAdmin:自带部分监控功能
  • Prometheus + Grafana:结合 postgres_exporter 进行可视化监控
  • Zabbix、Nagios 等企业级监控工具

十八、升级与迁移

1. 版本升级

1.1 使用pg_upgrade工具(推荐大版本升级)

  1. 安装新版本 PostgreSQL
  2. 停止旧服务,备份数据
  3. 执行 pg_upgrade
  4. 检查数据完整性,切换新服务

详细官方文档:pg_upgrade

1.2 逻辑备份还原(跨平台、跨版本)

pg_dumpall -U postgres > all.sql
# 在新环境还原
psql -U postgres -f all.sql

2. 数据迁移

  • 跨服务器迁移:使用 pg_dump + psql,或 pg_basebackup(物理迁移)
  • 跨数据库类型:可用 DBConvert 等工具

十九、常用SQL脚本示例

1. 批量插入数据

INSERT INTO users (name, email)
VALUES
  ('Tom', 'tom@example.com'),
  ('Jerry', 'jerry@example.com'),
  ('Spike', 'spike@example.com');

2. 批量更新

UPDATE users SET status = 'active' WHERE id IN (1,2,3);

3. 查询表结构

\d+ users

4. 查询某表空间大小

SELECT pg_size_pretty(pg_total_relation_size('users'));

5. 查询数据库当前连接数

SELECT count(*) FROM pg_stat_activity;

6. 查看锁等待

SELECT * FROM pg_locks WHERE NOT granted;

二十、PostgreSQL 优秀学习资源

二十一、FAQ 补充

如何重置用户密码?

ALTER USER myuser WITH PASSWORD 'newpassword';

如何查看数据库版本?

SELECT version();

如何导出/导入表结构而不带数据?

pg_dump -U myuser -h localhost -s mydb > mydb_schema.sql

如何只导出/导入部分表?

pg_dump -U myuser -h localhost -t users mydb > users.sql
psql -U myuser -d mydb < users.sql

二十三、表分区(Partition)

1. 适用场景

  • 大数据量表,按时间、ID等字段分区,提高查询与维护效率。

2. 分区创建示例(按日期分区)

CREATE TABLE sales (
    id serial PRIMARY KEY,
    sale_date date NOT NULL,
    amount numeric
) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

3. 查看分区信息

SELECT
    inhrelid::regclass AS child,
    inhparent::regclass AS parent
FROM
    pg_inherits;

二十四、事务与并发控制

1. 事务基础

BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
COMMIT;

用于保证操作的原子性,一致性,隔离性,持久性(ACID)。

2. 隔离级别

  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

设置示例:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

3. 并发与锁

  • 行级锁:SELECT ... FOR UPDATE
  • 表级锁:LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;

查看锁信息:

SELECT * FROM pg_locks WHERE NOT granted;

二十五、触发器与存储过程

1. 触发器示例

自动记录更新日志:

CREATE TABLE users_log (
    id serial PRIMARY KEY,
    user_id int,
    action varchar(20),
    log_time timestamp DEFAULT now()
);
CREATE OR REPLACE FUNCTION log_user_update()
RETURNS trigger AS $$
BEGIN
    INSERT INTO users_log(user_id, action) VALUES (NEW.id, 'update');
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER user_update_trig
AFTER UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION log_user_update();

2. 存储过程(函数)示例

CREATE OR REPLACE FUNCTION add_user(name text, email text)
RETURNS void AS $$
BEGIN
    INSERT INTO users(name, email) VALUES (name, email);
END;
$$ LANGUAGE plpgsql;

调用:

SELECT add_user('Bob', 'bob@example.com');

二十六、JSON 与全文搜索

1. JSON 数据类型

CREATE TABLE orders (
    id serial PRIMARY KEY,
    info jsonb
);
INSERT INTO orders(info) VALUES ('{"customer": "Tom", "items": ["apple", "banana"]}');
SELECT info->>'customer' FROM orders;

2. 全文搜索

CREATE TABLE docs (id serial PRIMARY KEY, content text);
INSERT INTO docs(content) VALUES ('PostgreSQL is a powerful database system.');
SELECT * FROM docs WHERE to_tsvector('english', content) @@ to_tsquery('powerful & database');

二十七、常用运维脚本

1. 清理无用连接

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle' AND pid <> pg_backend_pid();

2. 自动重建索引

REINDEX TABLE users;

3. 检查表膨胀

SELECT relname, n_dead_tup
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000;

二十八、故障处理方法

1. 数据库无法启动

  • 检查日志文件(默认在 pg_log 目录)
  • 检查磁盘空间、配置文件语法
  • 使用 pg_resetwal 修复 WAL 日志损坏

2. 数据丢失恢复

  • 立即停止服务,备份现有数据目录
  • 通过备份文件和 WAL 日志恢复

3. 锁表导致阻塞

  • 查询阻塞 SQL
  • 杀死阻塞进程(注意数据一致性)

二十九、集群与分布式方案

1. 主从复制(同步/异步)

见前文说明。

2. 读写分离

  • 主库写,从库读
  • 应用层或中间件(如 Pgpool-II)实现

3. 分布式扩展

  • Citus:PostgreSQL 分布式扩展插件,适合大数据分表分库
  • Greenplum:基于 PostgreSQL 的分布式数据仓库

4. 高可用

  • Patroni:自动化主从切换、故障恢复
  • Keepalived + VIP:实现数据库虚拟 IP 高可用

三十、PostgreSQL 版本与生命周期

结语

PostgreSQL 功能强大,适合各种应用场景。掌握安装、配置、性能优化、扩展、集群与高可用、故障处理等技能,可以让你轻松应对生产环境中的各种需求。如果有具体业务场景、报错信息或者深入某一模块的需求,欢迎继续追问!

到此这篇关于PostgreSQL 安装部署及配置使用教程的文章就介绍到这了,更多相关PostgreSQL 安装使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于PostgreSQL和mysql数据类型对比兼容

    基于PostgreSQL和mysql数据类型对比兼容

    这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL 自增语法的用法说明

    PostgreSQL 自增语法的用法说明

    这篇文章主要介绍了PostgreSQL 自增语法的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PgSQL条件语句与循环语句示例代码详解

    PgSQL条件语句与循环语句示例代码详解

    这篇文章主要介绍了PgSQL条件语句与循环语句,pgSQL中有两种条件语句分别为if与case语句,每种语句通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • PostgreSQL备份和还原命令整理大全

    PostgreSQL备份和还原命令整理大全

    这篇文章主要给大家介绍了关于PostgreSQL备份和还原命令整理的相关资料,PostgreSQL是一款非常强大的开源数据库系统,提供种类繁多的备份选项,包括完全备份、增量备份等,需要的朋友可以参考下
    2023-07-07
  • PostgreSQL中查看当前时间和日期的几种常用方法

    PostgreSQL中查看当前时间和日期的几种常用方法

    在 PostgreSQL 中,有多个函数可以用来查看当前时间和日期,这些函数在处理时间戳、日期和时间的计算时非常有用,以下是几种常用的查看当前时间和日期的函数及示例,需要的朋友可以参考下
    2024-10-10
  • PostgreSQL用户登录失败自动锁定的处理方案

    PostgreSQL用户登录失败自动锁定的处理方案

    这篇文章主要介绍了PostgreSQL用户登录失败自动锁定的解决办法,本文给大家分享解决方案,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • PostgreSQL的应用技巧和示例分享

    PostgreSQL的应用技巧和示例分享

    本文会总结一些Postgres中,从应用需求和场景出发,不太常见,但比较常用并且有用的SQL语句,文中的示例代码简洁易懂,需要的小伙伴可以收藏一下
    2023-06-06
  • postgresql 实现取出分组中最大的几条数据

    postgresql 实现取出分组中最大的几条数据

    这篇文章主要介绍了postgresql 实现取出分组中最大的几条数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 从原理到实战详解PostgreSQL如何进行性能优化

    从原理到实战详解PostgreSQL如何进行性能优化

    PostgreSQL作为成熟的开源关系型数据库,以其丰富的特性和高扩展性受到广泛青睐,但如果不对其内部原理与配置参数进行深入理解并合理调优,往往难以发挥其最佳性能,本文我们就来看看PostgreSQL性能优化的相关技巧吧
    2025-07-07
  • postgresql 性能参数配置方式

    postgresql 性能参数配置方式

    这篇文章主要介绍了postgresql 性能参数配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论