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
- 访问 PostgreSQL 官网 下载安装包。
- 运行安装程序,按提示选择安装路径、端口、超级用户密码等。
- 安装完成后,可通过 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的认证方式(如md5、scram-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:查看当前连接和执行的SQLpg_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工具(推荐大版本升级)
- 安装新版本 PostgreSQL
- 停止旧服务,备份数据
- 执行
pg_upgrade - 检查数据完整性,切换新服务
详细官方文档: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 COMMITTEDREPEATABLE READSERIALIZABLE
设置示例:
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 版本与生命周期
- 官方建议使用长期支持版本(LTS)
- 定期关注 PostgreSQL 官方发布页面 获取安全补丁和新版本信息
结语
PostgreSQL 功能强大,适合各种应用场景。掌握安装、配置、性能优化、扩展、集群与高可用、故障处理等技能,可以让你轻松应对生产环境中的各种需求。如果有具体业务场景、报错信息或者深入某一模块的需求,欢迎继续追问!
到此这篇关于PostgreSQL 安装部署及配置使用教程的文章就介绍到这了,更多相关PostgreSQL 安装使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
