PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > PostgreSQL 安装使用

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

作者:猩火燎猿

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. 配置文件位置

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(图形化工具)

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

七、常用维护命令

八、附加说明

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 定期备份,保存到安全位置。

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

十四、高可用与主从复制

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 文件)。

十五、常用工具推荐

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

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. 内置视图

示例:

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

2. 监控工具

十八、升级与迁移

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. 数据迁移

十九、常用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. 适用场景

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. 隔离级别

设置示例:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

3. 并发与锁

查看锁信息:

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. 数据库无法启动

2. 数据丢失恢复

3. 锁表导致阻塞

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

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

见前文说明。

2. 读写分离

3. 分布式扩展

4. 高可用

三十、PostgreSQL 版本与生命周期

结语

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

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

您可能感兴趣的文章:
阅读全文