前言
最近在研究迁移Oracle的问题。同时公司也有数据分析(OLAP)、国产化等等需求,最后选型了postgres数据库。此文总结了个人这两天的探索。
docker-compose.yml
yml
services:
postgres17:
image: postgres:17.5
container_name: postgres17
restart: always
privileged: true
network_mode: host # 启用host网络模式
environment:
POSTGRES_USER: postgres # 默认用户名
POSTGRES_PASSWORD: passwd # 默认密码
POSTGRES_DB: postgres # 初始化默认创建的Schema,不配置则默认等于POSTGRES_USER
PGDATA: /var/lib/postgresql/data # 数据挂载目录
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
volumes:
- postgres17-data:/var/lib/postgresql/data
- ./pg_data/backups:/backups
- ./pg_data/config/postgresql.conf:/etc/postgresql.conf
command: ["postgres", "-c", "config_file=/etc/postgresql.conf"]
pgadmin4:
image: dpage/pgadmin4:9.4
container_name: pgadmin4
restart: unless-stopped
environment:
- PGADMIN_DEFAULT_EMAIL=pgadmin4@postgres.com
- PGADMIN_DEFAULT_PASSWORD=pgadmin4
- PGADMIN_DISABLE_POSTFIX=false
- PGADMIN_LISTEN_PORT=5431
ports:
- '5431:5431'
volumes:
- ./pgadmin_data:/var/lib/pgadmin
cloudbeaver:
image: dbeaver/cloudbeaver:25.1
container_name: cloudbeaver25
ports:
- "5430:8978"
environment:
- JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN
volumes:
- ./cb_data/workspace:/opt/cloudbeaver/workspace
# 驱动可以自定义,例如支持达梦等等,需要把容器内部驱动复制出来才能挂载目录
# - ./cb_data/drivers:/opt/cloudbeaver/drivers
volumes:
# 定义命名卷
postgres17-data:
postgresql.conf
conf
# -------------------------------
# PostgreSQL 17 配置文件
# 编码:UTF-8
# -------------------------------
#------------------------------------------------------------------------------
# 需要修改的配置
# 现在针对 64 核 CPU 和 96GB 内存的服务器优化,适用于生产环境。
#------------------------------------------------------------------------------
shared_buffers = 24GB # 共享内存缓冲区大小,缓存更多数据以减少磁盘 I/O,设为系统内存的 25%
effective_cache_size = 64GB # 预估系统可用缓存,优化查询规划,设为系统内存的 66%
max_parallel_workers_per_gather = 32 # 每个查询的并行工作进程数,以利用多核,设为系统核心的 50%
max_parallel_maintenance_workers = 16 # 维护操作的并行进程数,以加速索引创建等, 设为系统核心的 25%
max_worker_processes = 64 # 总并行工作进程数,以支持高并发,设为系统核心的 100%
#------------------------------------------------------------------------------
# 连接与认证
#------------------------------------------------------------------------------
# 控制客户端连接和认证相关的设置
listen_addresses = '*' # 监听所有 IP 地址,生产环境建议限制为特定 IP(如 'localhost' 或 '192.168.1.0/24')以提高安全性
port = 5432 # 数据库服务端口号,与 Docker Compose 端口映射一致
max_connections = 1000 # 最大客户端连接数
superuser_reserved_connections = 3 # 为超级用户保留的连接数,保持默认值以确保管理员访问
ssl = off # 禁用 SSL 加密,生产环境强烈建议启用(需配置证书,参考 https://www.postgresql.org/docs/17/ssl-tcp.html)
password_encryption = scram-sha-256 # 使用现代 SCRAM-SHA-256 密码加密协议,符合安全标准
#------------------------------------------------------------------------------
# 资源限制
#------------------------------------------------------------------------------
work_mem = 256MB # 单个查询操作的内存限制,以提升复杂查询性能,需监控总内存使用
maintenance_work_mem = 2GB # 维护性操作(如 VACUUM、CREATE INDEX)的内存限制,2GB 足够
huge_pages = try # 尝试使用大页内存,需操作系统支持(参考 https://www.postgresql.org/docs/17/kernel-resources.html#linux-huge-pages)
#------------------------------------------------------------------------------
# 预写式日志(WAL)
#------------------------------------------------------------------------------
# 控制事务日志行为,确保数据持久性和支持复制
wal_level = replica # 设置为 replica,支持流复制和 WAL 归档,适合生产环境
synchronous_commit = on # 确保事务持久化,优先安全性(关闭可提高性能但增加数据丢失风险)
wal_buffers = 16MB # WAL 缓冲区大小,16MB 通常足够(约为 shared_buffers 的 3%)
max_wal_size = 4GB # 自动触发检查点的 WAL 上限,4GB 适合高写入负载
min_wal_size = 1GB # 最小保留 WAL 大小
checkpoint_timeout = 15min # 检查点间隔,15 分钟平衡性能和恢复时间
checkpoint_completion_target = 0.9 # 平滑写入检查点,减少 I/O 冲击
fsync = on # 确保数据写入磁盘,禁用会提高性能但风险极高,保持开启
#------------------------------------------------------------------------------
# 日志记录
#------------------------------------------------------------------------------
# 配置日志以便监控和调试
logging_collector = on # 启用日志收集器,将日志写入文件
log_directory = 'log' # 日志存储目录,需确保容器内有写权限(映射到 /var/lib/postgresql/data/log)
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 日志文件名格式,按时间命名
log_rotation_age = 1d # 日志文件最长保留 1 天,自动轮换
log_rotation_size = 100MB # 单个日志文件最大尺寸,100MB 适合生产环境
log_min_duration_statement = 1000 # 记录执行超过 1000ms 的慢查询,便于性能优化
log_checkpoints = on # 记录检查点信息,监控 WAL 性能
log_connections = on # 记录所有客户端连接,便于审计
log_disconnections = on # 记录所有客户端断开连接,便于审计
log_lock_waits = on # 记录长锁等待(超过 deadlock_timeout),帮助诊断锁问题
log_temp_files = 0 # 记录所有临时文件使用,0 表示记录所有临时文件
#------------------------------------------------------------------------------
# 自动清理
#------------------------------------------------------------------------------
# 配置自动清理以管理死元组和优化性能
autovacuum = on # 启用自动清理死元组,防止表膨胀
autovacuum_max_workers = 5 # 同时运行的最大自动清理进程数,5 个足够中等负载
autovacuum_naptime = 1min # 自动清理进程唤醒间隔,1 分钟适合高写入环境
autovacuum_vacuum_threshold = 50 # 触发 VACUUM 操作的更新阈值,50 行适合频繁更新
autovacuum_analyze_threshold = 50 # 触发 ANALYZE 操作的更新阈值,50 行适合频繁更新
autovacuum_vacuum_cost_limit = 1000 # 提高自动清理效率,1000 平衡性能和资源
autovacuum_vacuum_scale_factor = 0.1 # 表大小 10% 的死元组触发清理,适合高更新表
log_autovacuum_min_duration = 0 # 记录所有自动清理操作,便于监控
track_io_timing = on # 监控 I/O 性能,需启用 pg_stat_statements 扩展
#------------------------------------------------------------------------------
# 本地化设置
#------------------------------------------------------------------------------
# 配置日期、时间和字符编码
datestyle = 'iso, ymd' # 日期格式为 ISO 标准(年-月-日),适合国际化应用
timezone = 'Asia/Shanghai' # 时区设置为中国上海,匹配本地需求
# lc_messages = 'zh_CN.utf8' # 系统消息语言为简体中文,需安装中文语言包
# lc_monetary = 'zh_CN.utf8' # 货币格式为中国标准,需安装中文语言包
# lc_numeric = 'zh_CN.utf8' # 数字格式为中国标准,需安装中文语言包
# lc_time = 'zh_CN.utf8' # 时间格式为中国标准,需安装中文语言包
default_text_search_config = 'pg_catalog.english' # 全文搜索配置,建议安装中文分词插件(如 zhparser)
#------------------------------------------------------------------------------
# 锁管理
#------------------------------------------------------------------------------
# 配置锁行为以避免死锁和性能瓶颈
deadlock_timeout = 1s # 死锁检测超时时间,1 秒为默认值
max_locks_per_transaction = 64 # 每个事务的最大锁数量,64 足够大多数场景
#------------------------------------------------------------------------------
# 字符编码
#------------------------------------------------------------------------------
# 设置客户端编码
client_encoding = utf8 # 客户端字符编码为 UTF-8,支持多语言
#------------------------------------------------------------------------------
# 统计信息
#------------------------------------------------------------------------------
# 启用统计信息以支持性能监控
track_activities = on # 启用会话活动监控,记录活跃会话
track_counts = on # 收集数据库统计信息,支持查询优化
track_io_timing = on # 记录 I/O 操作耗时,便于性能分析
#------------------------------------------------------------------------------
# 并行查询
#------------------------------------------------------------------------------
idle_in_transaction_session_timeout = 10min # 终止空闲事务会话,10 分钟防止资源浪费
lock_timeout = 30s # 锁等待超时时间,30 秒防止长时间阻塞
statement_timeout = 0 # 全局查询超时,默认不限制,可根据需求设置
此时进入docker-compose.yml所在目录执行
docker-compose up -d
即可运行数据库和两个web端管理工具了。至于如何下载镜像,大家自行探索。
进入容器配置插件
shell
$ docker exec -it postgres17 /bin/bash
> apt update
> apt install curl gpg
# 安装插件源,由pigsty提供,参考:https://pigsty.cc/ext/repo/apt/
> curl -fsSL https://repo.pigsty.cc/key | gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg
# 添加源
> tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/pgsql/bookworm bookworm main
EOF
> apt update
# 安装插件,插件列表参考:https://pigsty.cc/ext/list/deb/
> apt install postgresql-17-pg-analytics
> apt install postgresql-17-repack
# 启用插件,需要进入psql
> psql -U postgres -d postgres
- CREATE EXTENSION pg_analytics;
- CREATE EXTENSION pg_trgm ;
- CREATE EXTENSION pg_repack;
# 查看插件是否已启用
- \dx
# 退出psql
- exit;
# 退出容器
> exit;
# 将容器打包,以便之后备用
$ docker commit postgres my-postgres:17.5
# 保存容器,以便移植
$ docker save -o my-postgres17.5.tar my-postgres:17.5
当容器 down 后重新部署的话,则需要重新启用插件。启用插件不需要去psql中,在gui(pgadmin4,Dbeaver)等工具中执行
CREATE EXTENSION XXX
即可。