目录
[一、PostgreSQL 核心概述](#一、PostgreSQL 核心概述)
[二、PostgreSQL 安装实战(基于 OpenEuler 24)](#二、PostgreSQL 安装实战(基于 OpenEuler 24))
[(一)编译安装(以 16.3 版本为例)](#(一)编译安装(以 16.3 版本为例))
[1. 环境准备](#1. 环境准备)
[2. 下载与解压源码](#2. 下载与解压源码)
[3. 配置编译参数](#3. 配置编译参数)
[4. 编译与安装](#4. 编译与安装)
[5. 创建用户与数据目录](#5. 创建用户与数据目录)
[6. 配置环境变量](#6. 配置环境变量)
[7. 初始化数据库集群](#7. 初始化数据库集群)
[8. 启动与停止服务](#8. 启动与停止服务)
[9. 登录数据库](#9. 登录数据库)
[(二)DNF 安装(快速部署 15.12 版本)](#(二)DNF 安装(快速部署 15.12 版本))
[三、PostgreSQL 逻辑与物理架构解析](#三、PostgreSQL 逻辑与物理架构解析)
[1. 层级结构](#1. 层级结构)
[2. 核心概念](#2. 核心概念)
[3. 对象标识符(OID)](#3. 对象标识符(OID))
[1. 目录结构](#1. 目录结构)
[2. 关键文件解析](#2. 关键文件解析)
[四、PostgreSQL 核心功能与操作](#四、PostgreSQL 核心功能与操作)
[1. 创建用户与角色](#1. 创建用户与角色)
[2. 权限控制](#2. 权限控制)
[3. 角色继承](#3. 角色继承)
[1. 常用数据类型](#1. 常用数据类型)
[2. 创建表](#2. 创建表)
[3. 索引优化](#3. 索引优化)
[1. 显式事务控制](#1. 显式事务控制)
[2. 保存点(Savepoint)](#2. 保存点(Savepoint))
[3. 事务隔离级别](#3. 事务隔离级别)
[五、PostgreSQL 高级特性与扩展](#五、PostgreSQL 高级特性与扩展)
[1. 范围分区(按时间范围分区)](#1. 范围分区(按时间范围分区))
[2. 列表分区(按地区列表分区)](#2. 列表分区(按地区列表分区))
[3. 哈希分区(按用户 ID 哈希分区)](#3. 哈希分区(按用户 ID 哈希分区))
[1. PostGIS(地理信息处理)](#1. PostGIS(地理信息处理))
[2. TimescaleDB(时间序列数据)](#2. TimescaleDB(时间序列数据))
[3. Citus(分布式查询)](#3. Citus(分布式查询))
[1. 逻辑备份(pg_dump)](#1. 逻辑备份(pg_dump))
[2. 物理备份(pg_basebackup)](#2. 物理备份(pg_basebackup))
[3. 恢复备份](#3. 恢复备份)
[1. 配置参数调优](#1. 配置参数调优)
[2. 查询优化](#2. 查询优化)
[3. 自动真空(VACUUM)调优](#3. 自动真空(VACUUM)调优)
[1. 主库配置(postgresql.conf)](#1. 主库配置(postgresql.conf))
[2. 从库初始化(pg_basebackup)](#2. 从库初始化(pg_basebackup))
[3. 从库配置(postgresql.conf)](#3. 从库配置(postgresql.conf))
[4. 启动从库](#4. 启动从库)
一、PostgreSQL 核心概述
(一)定义与定位
PostgreSQL 是一款开源的对象关系型数据库管理系统(ORDBMS),起源于加州大学伯克利分校,继承了 Ingres 项目的技术精髓。它不仅支持传统的关系型数据模型,还引入了对象特性(如自定义数据类型、函数、操作符等),成为现代数据库领域中功能最全面的开源解决方案之一。
(二)核心特性与优势
特性分类 | 具体内容 |
---|---|
开源与自由 | 遵循 PostgreSQL 许可证,允许用户自由使用、修改和分发,吸引全球开发者贡献插件与解决方案(如 PostGIS 地理扩展、TimescaleDB 时间序列扩展)。 |
标准符合性 | 高度兼容 SQL 标准,支持窗口函数、公共表表达式(CTE)、子查询等高级语法,提升 SQL 代码的可读性与执行效率。 |
数据类型丰富 | 内置类型包括: - 基础类型:整数、浮点数、字符串 - 复杂类型:数组、枚举、范围类型、JSON、地理空间类型(依赖 PostGIS) - 时间类型:精确到纳秒的时间戳 |
事务与并发控制 | 采用 ** 多版本并发控制(MVCC)** 机制,确保高并发下的数据一致性;支持嵌套事务、保存点(Savepoint),满足复杂业务逻辑的事务管理需求。 |
扩展性 | 支持通过插件(Extension)扩展功能,例如: - 自定义数据类型(如网络地址类型) - 索引方法(如 GIN 索引用于全文搜索) - 过程语言(PL/pgSQL、PL/Python 等) |
安全性 | 提供细粒度权限控制(基于角色的访问控制,RBAC)、SSL 加密传输、审计日志(log_statement),符合 GDPR 等数据合规要求。 |
高性能 | 优化手段包括: - 智能查询优化器(基于成本的优化,CBO) - 并行查询(Parallel Query) - 分区表(Range/List/Hash 分区) - 索引优化(B-tree、Hash、GIST 等索引类型) |
高可用性 | 支持主从复制(流复制、逻辑复制)、自动故障转移(需配合 Patroni 等工具),通过 PGDG 生态实现企业级容灾方案。 |
成本效益 | 开源免费,无需支付授权费用;社区提供丰富的文档、教程与技术支持,降低企业技术选型门槛。 |
(三)应用场景
- 企业级应用:ERP、CRM 系统,如海尔集团使用 PostgreSQL 支撑供应链管理系统,处理高并发事务与复杂业务逻辑。
- 数据分析与数据仓库:结合 Citus 扩展实现分布式查询,支持 TB 级数据实时分析,典型案例包括 Airbnb 的实时数据看板。
- 地理信息系统(GIS):通过 PostGIS 扩展存储与分析地理空间数据,被 OpenStreetMap 等项目用于地图数据管理。
- 物联网(IoT):利用 TimescaleDB 扩展存储时间序列数据,适配传感器数据高频写入场景,如智能电网监控系统。
- 金融与交易系统:满足 ACID 事务特性与高可用性要求,被印度 ICICI 银行用于核心交易系统。
二、PostgreSQL 安装实战(基于 OpenEuler 24)
(一)编译安装(以 16.3 版本为例)
1. 环境准备
# 安装编译依赖(GCC、ICU 库、Readline 库等)
[root@localhost ~]# yum -y install gcc gcc-* make libicu libicu-devel readline-devel zlib zlib-devel
2. 下载与解压源码
# 下载 PostgreSQL 16.3 源码包(需提前安装 wget/curl)
[root@localhost ~]# wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz
# 解压源码
[root@localhost ~]# tar zxvf postgresql-16.3.tar.gz
[root@localhost ~]# cd postgresql-16.3
3. 配置编译参数
# --prefix 指定安装目录,--with-openssl 启用 SSL 支持
[root@localhost postgresql-16.3]# ./configure --prefix=/usr/local/pgsql --with-openssl --with-libxml --with-libxslt
4. 编译与安装
# 编译(建议多核环境使用 -j 参数加速,如 -j4)
[root@localhost postgresql-16.3]# make && make install
5. 创建用户与数据目录
# 创建数据库专用用户(避免使用 root 运行服务)
[root@localhost ~]# adduser postgres
# 创建数据存储目录
[root@localhost ~]# mkdir -p /usr/local/pgsql/data
# 赋予用户权限
[root@localhost ~]# chown -R postgres:postgres /usr/local/pgsql/data
6. 配置环境变量
# 编辑系统环境变量文件
[root@localhost ~]# vi /etc/profile
# 添加以下内容
export PGHOME=/usr/local/pgsql
export PATH=$PGHOME/bin:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
# 使配置生效
[root@localhost ~]# source /etc/profile
7. 初始化数据库集群
# 切换至 postgres 用户
[root@localhost ~]# su - postgres
# 初始化集群(-D 指定数据目录,-W 启用密码认证)
[postgres@localhost ~]$ initdb -D /usr/local/pgsql/data -U postgres -W
8. 启动与停止服务
# 启动服务(-l 指定日志文件)
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data -l postgresql.log start
# 停止服务(-m 参数指定停止模式:smart/fast/immediate)
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data -m fast stop
# 查看服务状态
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data status
9. 登录数据库
# 使用 psql 客户端登录(默认连接 postgres 数据库)
[postgres@localhost ~]$ psql
psql (16.3)
Type "help" for help.
postgres=# -- 查看数据库列表
postgres=# \l
# 退出客户端
postgres=# \q
(二)DNF 安装(快速部署 15.12 版本)
# 安装官方 YUM 源(可选,若系统自带源版本较低)
[root@localhost ~]# rpm -Uvh https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -q --queryformat "%{VERSION}" centos-release)-$(arch)/pgdg-redhat-repo-latest.noarch.rpm
# 安装 PostgreSQL 服务器与客户端
[root@localhost ~]# dnf install -y postgresql15-server postgresql15
# 初始化数据库
[root@localhost ~]# /usr/pgsql-15/bin/postgresql-15-setup initdb
# 启动服务并设置开机自启
[root@localhost ~]# systemctl start postgresql-15
[root@localhost ~]# systemctl enable postgresql-15
三、PostgreSQL 逻辑与物理架构解析
(一)逻辑架构
1. 层级结构
PostgreSQL 实例(Instance)
├─ 数据库集群(Database Cluster)
│ ├─ 数据库(Database): postgres(默认管理库)、template0(纯净模板库)、template1(默认模板库)
│ │ ├─ 模式(Schema): public(默认模式)、自定义模式(如 sales_schema)
│ │ │ ├─ 数据库对象(表、视图、索引、函数、序列等)
│ │ ├─ 表空间(Tablespace): pg_default(默认表空间)、pg_global(系统表空间)
│ ├─ 用户(User): postgres(超级用户)、普通角色(如 app_user)
2. 核心概念
-
数据库集群(Cluster):一个 PostgreSQL 服务实例管理的所有数据库的集合,共享系统级配置(如连接池参数)。
-
数据库(Database):逻辑隔离的存储单元,每个数据库包含独立的模式与对象,物理上对应数据目录中的一个子目录。
-
模式(Schema) :用于隔离同一数据库内的对象(如不同用户的表),默认模式为
public
,可通过SET search_path TO schema_name;
指定搜索路径。 -
表空间(Tablespace) :逻辑存储位置,物理对应文件系统目录,用于分散数据存储路径(如将大表存储在独立磁盘)。
-- 创建自定义表空间 CREATE TABLESPACE my_tablespace OWNER postgres LOCATION '/data/pgsql/tablespace'; -- 创建表时指定表空间 CREATE TABLE large_data (id INT) TABLESPACE my_tablespace;
3. 对象标识符(OID)
-
每个数据库对象(表、索引、用户等)都有唯一的 OID(32 位无符号整数)。
-
通过系统表查询 OID:
-- 查询表的 OID SELECT oid FROM pg_class WHERE relname = 'users'; -- 通过 OID 查询表名 SELECT relname FROM pg_class WHERE oid = 16384;
(二)物理架构
1. 目录结构
/usr/local/pgsql/ # 安装目录(默认由 --prefix 指定)
├─ bin/ # 可执行文件(psql、pg_ctl、initdb 等)
├─ lib/ # 动态库文件(PostgreSQL 核心库、插件库)
├─ share/ # 文档、配置模板、SQL 脚本(如扩展插件的 SQL 文件)
└─ data/ # 数据目录(由 initdb 初始化,需单独备份)
├─ base/ # 存储各数据库的数据文件(每个数据库对应一个子目录,如 base/16384 对应 template1 数据库)
├─ global/ # 存储集群级系统表(如 pg_database、pg_control)
├─ pg_commit_ts/ # 事务提交时间戳(9.5+ 版本)
├─ pg_dynshmem/ # 动态共享内存文件(9.4+ 版本)
├─ pg_logical/ # 逻辑复制状态数据(9.4+ 版本)
├─ pg_multixact/ # 多事务状态数据(处理行级共享锁)
├─ pg_wal/ # 预写日志(WAL)文件(10+ 版本,旧版本为 pg_xlog)
├─ pg_xact/ # 事务提交状态数据(10+ 版本,旧版本为 pg_clog)
├─ postgresql.conf # 主配置文件(参数配置核心文件)
└─ pg_hba.conf # 客户端认证文件(控制用户连接权限)
2. 关键文件解析
-
postgresql.conf :
核心配置参数,常用配置项:
listen_addresses = '*' # 监听地址(默认 localhost,生产环境需改为 0.0.0.0) port = 5432 # 端口号 max_connections = 100 # 最大连接数 shared_buffers = 128MB # 共享缓冲区(建议设置为物理内存的 25%) work_mem = 4MB # 单个查询使用的工作内存 wal_level = replica # WAL 日志级别(minimal/replica/full)
-
pg_hba.conf :
定义客户端连接认证规则,格式:
# TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 scram-sha-256 # 本地连接使用 SCRAM-SHA-256 认证 host all all ::1/128 scram-sha-256 # IPv6 本地连接 host replication replicator 192.168.1.0/24 md5 # 主从复制使用 MD5 认证
-
WAL 文件(pg_wal/) :
预写日志用于保障数据持久化与故障恢复,每个 WAL 段文件固定为 16MB,命名格式为
000000010000000000000001
(时间线 + 日志序列号)。
四、PostgreSQL 核心功能与操作
(一)用户与权限管理
1. 创建用户与角色
-- 创建普通用户(密码加密存储)
CREATE USER app_user WITH PASSWORD 'secure_password';
-- 创建超级用户(需谨慎)
CREATE ROLE super_user WITH SUPERUSER LOGIN PASSWORD 'super_secret';
2. 权限控制
-- 授予表查询权限
GRANT SELECT ON TABLE users TO app_user;
-- 授予模式创建权限
GRANT CREATE ON SCHEMA sales TO app_user;
-- 回收权限
REVOKE INSERT ON TABLE orders FROM app_user;
3. 角色继承
-- 创建角色组
CREATE ROLE analysts;
-- 将用户加入角色组
GRANT analysts TO app_user;
-- 授予角色组权限
GRANT SELECT ON ALL TABLES IN SCHEMA analytics TO analysts;
(二)数据类型与表操作
1. 常用数据类型
分类 | 数据类型 | 说明 |
---|---|---|
数值类型 | int4, int8, numeric(p,s) | numeric 用于高精度计算(如金融数据) |
字符串类型 | varchar(n), text | text 无长度限制,varchar (n) 限制最大长度 |
时间类型 | timestamp, interval | timestamp 包含日期时间,interval 表示时间间隔(如 '1 day 2 hours') |
数组类型 | int[], varchar(10)[] | 一维 / 多维数组,如 {1,2,3} 或 ARRAY[1,2,3] |
JSON 类型 | json, jsonb | jsonb 支持索引与查询优化,推荐用于存储半结构化数据 |
地理空间类型 | geography, geometry | 需安装 PostGIS 扩展,支持点、线、面等空间对象 |
2. 创建表
-- 创建用户表(含数组与 JSONB 字段)
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
emails TEXT[], -- 邮箱数组
metadata JSONB, -- 扩展元数据
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. 索引优化
-- 创建 B-tree 索引(默认类型,适用于等值查询)
CREATE INDEX idx_users_name ON users(name);
-- 创建 GIN 索引(适用于数组或 JSONB 全文搜索)
CREATE INDEX idx_users_emails ON users USING GIN(emails);
-- 创建部分索引(仅对符合条件的数据建索引)
CREATE INDEX idx_users_active ON users(id) WHERE status = 'active';
(三)事务与并发控制
1. 显式事务控制
BEGIN; -- 开启事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交事务(若中间出错则自动回滚)
2. 保存点(Savepoint)
BEGIN;
INSERT INTO orders (order_date) VALUES ('2023-10-01');
SAVEPOINT sp1; -- 设置保存点
INSERT INTO order_items (order_id, product_id) VALUES (1, 101);
-- 回滚到保存点,保留之前的插入操作
ROLLBACK TO sp1;
COMMIT;
3. 事务隔离级别
-- 设置事务隔离级别为可重复读(默认级别)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 查看当前会话隔离级别
SELECT current_setting('transaction_isolation');
五、PostgreSQL 高级特性与扩展
(一)分区表(Partitioning)
分区表用于将大型表的数据分散到多个物理子表中,提升查询性能与管理效率。PostgreSQL 支持范围分区(Range) 、列表分区(List)、** 哈希分区(Hash)** 三种方式。
1. 范围分区(按时间范围分区)
-- 创建主表(声明为分区表)
CREATE TABLE sales (
order_id INT,
order_date DATE,
amount NUMERIC
) PARTITION BY RANGE (order_date);
-- 创建分区函数(定义分区范围)
CREATE OR REPLACE FUNCTION sales_partition_func() RETURNS TRIGGER AS $$
BEGIN
IF NEW.order_date < '2023-01-01' THEN
INSERT INTO sales_2022 VALUES (NEW.*);
ELSIF NEW.order_date < '2024-01-01' THEN
INSERT INTO sales_2023 VALUES (NEW.*);
ELSE
INSERT INTO sales_future VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- 创建分区表
CREATE TABLE sales_2022 PARTITION OF sales FOR VALUES FROM ('-infinity') TO ('2023-01-01');
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_future PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('infinity');
-- 绑定触发器(自动路由数据到对应分区)
CREATE TRIGGER sales_partition_trigger BEFORE INSERT ON sales
FOR EACH ROW EXECUTE FUNCTION sales_partition_func();
2. 列表分区(按地区列表分区)
CREATE TABLE users (
user_id INT,
region TEXT,
email TEXT
) PARTITION BY LIST (region);
CREATE TABLE users_north PARTITION OF users FOR VALUES IN ('north', 'northeast');
CREATE TABLE users_south PARTITION OF users FOR VALUES IN ('south', 'southeast');
CREATE TABLE users_other PARTITION OF users FOR VALUES IN (DEFAULT);
3. 哈希分区(按用户 ID 哈希分区)
CREATE TABLE orders (
order_id INT,
user_id INT,
order_time TIMESTAMP
) PARTITION BY HASH (user_id) PARTITIONS 4; -- 自动创建4个哈希分区
(二)扩展应用(Extensions)
PostgreSQL 通过 CREATE EXTENSION
命令加载扩展,以下是常用扩展示例:
1. PostGIS(地理信息处理)
-- 安装 PostGIS 扩展(需先安装系统包 postgis)
CREATE EXTENSION postgis;
-- 创建地理空间表(存储点坐标)
CREATE TABLE restaurants (
id SERIAL,
name TEXT,
location GEOGRAPHY(POINT) -- 使用地理坐标系(WGS84)
);
-- 插入数据(WKT 格式:POINT(longitude latitude))
INSERT INTO restaurants (name, location) VALUES (
'Pizza Hut',
ST_GeogFromText('POINT(-73.9654 40.7821)')
);
-- 查询半径5公里内的餐厅
SELECT name FROM restaurants
WHERE ST_DWithin(location, ST_GeogFromText('POINT(-73.9847 40.7589)'), 5000);
2. TimescaleDB(时间序列数据)
-- 安装 TimescaleDB 扩展
CREATE EXTENSION timescaledb;
-- 创建时间序列表(自动转换为超表)
CREATE TABLE sensor_data (
time TIMESTAMP NOT NULL,
device_id INT NOT NULL,
temperature FLOAT,
humidity FLOAT
);
SELECT create_hypertable('sensor_data', 'time'); -- 转换为超表
-- 插入数据
INSERT INTO sensor_data (time, device_id, temperature, humidity)
VALUES (NOW(), 1, 25.5, 60.0);
-- 聚合查询(按小时统计平均温度)
SELECT time_bucket('1 hour', time) AS hour, AVG(temperature)
FROM sensor_data
GROUP BY hour
ORDER BY hour;
3. Citus(分布式查询)
# 安装 Citus 扩展(需编译安装或通过包管理器获取)
[root@localhost ~]# dnf install -y postgresql-citus
-- 启用 Citus 扩展
CREATE EXTENSION citus;
-- 创建分布式表(指定分布列)
CREATE TABLE orders (
order_id BIGINT,
customer_id INT,
order_total NUMERIC
);
SELECT create_distributed_table('orders', 'customer_id'); -- 按 customer_id 分布
-- 创建参考表(小表,全节点复制)
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name TEXT
);
SELECT create_reference_table('customers');
(三)备份与恢复
1. 逻辑备份(pg_dump)
# 备份单个数据库(压缩为 SQL 文件)
pg_dump -U postgres -d mydb -f mydb_backup.sql -Z 9
# 备份指定表
pg_dump -U postgres -d mydb -t users -t orders > tables_backup.sql
# 备份整个集群(包含所有数据库,需使用 pg_dumpall)
pg_dumpall -U postgres -f cluster_backup.sql
2. 物理备份(pg_basebackup)
# 全量备份(流复制模式,需开启 wal_level=replica)
pg_basebackup -U postgres -h localhost -D /backup/pg_basebackup \
--wal-method=stream --backup-mode=full --compress=zstd
3. 恢复备份
# 恢复逻辑备份
psql -U postgres -d mydb < mydb_backup.sql
# 恢复物理备份(需停止数据库服务)
systemctl stop postgresql
rm -rf /usr/local/pgsql/data/*
cp -R /backup/pg_basebackup/* /usr/local/pgsql/data/
chown -R postgres:postgres /usr/local/pgsql/data
pg_ctl -D /usr/local/pgsql/data -l logfile start
(四)性能优化实战
1. 配置参数调优
# postgresql.conf 关键参数优化(适用于 16GB 内存服务器)
max_connections = 200 # 根据应用连接数调整
shared_buffers = 4GB # 内存的 25%
work_mem = 32MB # 复杂查询(排序/哈希连接)的工作内存
maintenance_work_mem = 1GB # VACUUM/REINDEX 等维护操作内存
effective_cache_size = 12GB # 内核缓存+共享缓冲区,建议内存的 75%
wal_buffers = 128MB # WAL 缓冲区(默认 128MB,大事务可增大)
random_page_cost = 1.1 # SSD 存储设为 1.1,HDD 设为 4.0
2. 查询优化
-- 分析查询计划(查看执行成本与索引使用情况)
EXPLAIN ANALYZE SELECT * FROM users WHERE email = '[email protected]';
-- 强制使用索引(避免全表扫描)
SET enable_seqscan = OFF;
SELECT * FROM large_table WHERE id = 1234;
RESET enable_seqscan;
3. 自动真空(VACUUM)调优
# 调整真空参数(减少长事务阻塞)
autovacuum_vacuum_scale_factor = 0.02 # 当脏页比例超过 2% 时触发真空
autovacuum_vacuum_threshold = 50 # 最小脏页数
vacuum_cost_delay = 20ms # 真空操作延迟(降低 I/O 冲击)
vacuum_cost_limit = 2000 # 真空操作最大成本
六、高可用性与复制
(一)主从复制(流复制)
1. 主库配置(postgresql.conf)
wal_level = replica # 启用复制功能
max_wal_senders = 5 # 最大发送进程数
wal_keep_segments = 32 # 保留 WAL 段数(单位:16MB,用于故障恢复)
listen_addresses = '*' # 监听所有 IP
2. 从库初始化(pg_basebackup)
# 在从库节点执行
pg_basebackup -U postgres -h master_ip -D /usr/local/pgsql/data \
--wal-method=stream --create-slot=slave_slot
3. 从库配置(postgresql.conf)
hot_standby = on # 启用只读模式
primary_conninfo = 'host=master_ip port=5432 user=replica password=replica_password'
4. 启动从库
pg_ctl -D /usr/local/pgsql/data start
# 验证复制状态
psql -c "SELECT * FROM pg_stat_replication;"
(二)逻辑复制
-- 主库创建发布(Publication)
CREATE PUBLICATION my_publication FOR TABLE users, orders;
-- 从库创建订阅(Subscription)
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=master_ip port=5432 user=replica password=replica_password dbname=mydb'
PUBLICATION my_publication;
七、安全最佳实践
(一)认证与加密
-
使用 SCRAM-SHA-256 认证 (pg_hba.conf):
host all all 0.0.0.0/0 scram-sha-256
-
启用 SSL 加密 (postgresql.conf):
ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key' ssl_ca_file = 'root.crt' # 可选,客户端证书验证
(二)权限最小化原则
-
避免使用超级用户执行日常操作,为应用创建专用角色。
-
限制
PUBLIC
模式的权限:REVOKE ALL ON SCHEMA public FROM PUBLIC; GRANT USAGE ON SCHEMA public TO app_user;
八、日常管理命令速查表
操作类型 | 命令示例 |
---|---|
查看数据库列表 | \l |
查看表结构 | \d users |
查看当前用户 | SELECT current_user; |
查看参数配置 | SHOW all; |
清理无效对象 | VACUUM FULL ANALYZE; |
查看慢查询日志 | tail -f /usr/local/pgsql/data/pg_log/postgresql-SLOW-*.log |
监控数据库状态 | pg_stat_statements 扩展(需安装)或 pg_top 工具 |