| 项目 | 要求 |
|---|---|
| OS | Rocky Linux 9 |
| PostgreSQL | 16.x(PGDG 官方仓库) |
| 架构 | 单机(无主从) |
| CPU | 2 Core |
| 内存 | 4 GB |
| 网络 | 内网访问 |
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
dnf install -y postgresql16 postgresql16-server postgresql16-contrib
/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable --now postgresql-16
sudo -iu postgres
psql
ALTER USER postgres WITH PASSWORD '强密码';
路径:/var/lib/pgsql/16/data/pg_hba.conf
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.0.0/24 scram-sha-256
修改后:
systemctl reload postgresql-16
路径:/var/lib/pgsql/16/data/postgresql.conf
listen_addresses = 'localhost'
port = 5432
password_encryption = scram-sha-256
本章节参数 未经批准禁止随意修改
shared_buffers = 1GB
effective_cache_size = 3GB
work_mem = 8MB
maintenance_work_mem = 256MB
max_connections = 100
wal_buffers = 16MB
checkpoint_completion_target = 0.9
max_worker_processes = 4
max_parallel_workers = 2
max_parallel_workers_per_gather = 1
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 1000
log_checkpoints = on
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION pg_stat_statements;
CREATE ROLE appX_user
LOGIN
PASSWORD '强密码'
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
NOREPLICATION;
CREATE DATABASE appX_db
OWNER appX_user
ENCODING 'UTF8'
TEMPLATE template0;
\c appX_db
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE, CREATE ON SCHEMA public TO appX_user;
ALTER DEFAULT PRIVILEGES
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO appX_user;
ALTER DEFAULT PRIVILEGES
GRANT USAGE, SELECT ON SEQUENCES TO appX_user;
ALTER ROLE appX_user CONNECTION LIMIT 20;
ALTER ROLE appX_user SET statement_timeout = '30s';
host appX_db appX_user 192.168.1.10/32 scram-sha-256
pg_dump -Fc appX_db > appX_db_final.dump
REVOKE CONNECT ON DATABASE appX_db FROM appX_user;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity WHERE datname='appX_db';
DROP DATABASE appX_db;
DROP ROLE appX_user;
pg_dump -Fc appX_db > appX_db_$(date +%F).dump
pg_restore -d appX_db appX_db.dump
VACUUM (ANALYZE);
REINDEX DATABASE appX_db;
适用场景:
- 多应用共用 PostgreSQL 单机实例
- 应用存在短连接 / 连接数不可控风险
- 2C4G 内存环境必须使用
dnf install -y pgbouncer
| 项目 | 路径 |
|---|---|
| 配置文件 | /etc/pgbouncer/pgbouncer.ini |
| 用户文件 | /etc/pgbouncer/userlist.txt |
| 日志 | /var/log/pgbouncer/pgbouncer.log |
"appX_user" "SCRAM-SHA-256$..."
生成方式(在 PostgreSQL 中):
SELECT rolname, rolpassword FROM pg_authid WHERE rolname='appX_user';
PgBouncer 与 PostgreSQL 使用相同数据库用户
[databases]
app1_db = host=127.0.0.1 port=5432 dbname=app1_db
app2_db = host=127.0.0.1 port=5432 dbname=app2_db
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 500
default_pool_size = 20
reserve_pool_size = 5
server_idle_timeout = 60
server_lifetime = 3600
log_connections = 1
log_disconnections = 1
ALTER SYSTEM SET max_connections = 100;
应用连接数只打到 PgBouncer,不直接消耗 PostgreSQL 连接
systemctl enable --now pgbouncer
systemctl status pgbouncer
| 项目 | 要求 |
|---|---|
| 连接地址 | PgBouncer IP |
| 端口 | 6432 |
| 数据库 | appX_db |
| 用户 | appX_user |
| SSL | 与 PostgreSQL 保持一致 |
❌ 禁止应用直连 5432
SHOW POOLS;
SHOW CLIENTS;
SHOW SERVERS;
PgBouncer 是 2C4G PostgreSQL 的生命线
本文由 best 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。