文章目录
1、postgresql配置文件概览
2、postgresql.conf详解
3、pg_hba.conf详解
4、pg_ident.conf详解
5、线上需要调整的参数
6、总结
PostgreSQL 配置文件概览
PostgreSQL 使用三个主要的配置文件来控制服务器的行为、网络访问和用户映射。下面是对这三个文件的详细介绍:
1. postgresql.conf
这是 PostgreSQL 的主配置文件,包含了服务器运行的各种参数,包括性能调整、资源限制、日志设置、网络设置等。这些参数可以分为几个大类:
General: 通用设置,如数据目录的位置、监听的端口等。
Connection and Authentication: 连接和认证相关的设置,如最大连接数、超时设置等。
Performance: 性能相关设置,如缓存大小、工作内存等。
Logging and Replication: 日志记录和复制相关的设置,如日志级别、归档模式等。
Security: 安全相关的设置,如密码复杂度要求、SSL 设置等。
注意事项:
修改 postgresql.conf 后,需要重启 PostgreSQL 服务器或使用 pg_ctl reload 命令使更改生效。
保持文件权限安全,通常只允许 PostgreSQL 服务器进程读取。
定期审查和优化参数以适应服务器负载的变化。
2. pg_hba.conf
pg_hba.conf 文件控制着 PostgreSQL 的访问策略,定义了哪些客户端可以连接到服务器以及使用哪种认证方法。每一行代表一个访问规则,包括连接类型、目标数据库、用户、地址、认证方法等。
注意事项:
确保规则的顺序正确,因为第一个匹配的规则将应用于连接。
使用安全的认证方法,如 scram-sha-256 或 gss。
对于敏感的网络环境,避免使用 trust 方法。
定期审查和更新规则,确保只有授权的客户端能够访问。
3. pg_ident.conf
pg_ident.conf 文件用于映射操作系统用户到数据库用户,当使用 ident 或 peer 认证方法时尤其重要。每一行定义了一个映射规则,包含映射名称、系统用户名和数据库用户名。
注意事项:
确保映射规则正确,以避免未经授权的用户访问数据库。
使用正则表达式时要小心,确保它们正确匹配预期的用户名。
如果不需要复杂的映射,可以省略 pg_ident.conf 文件,使用默认行为。
postgresql.conf 详解
文件位置
data_directory 指定用于数据存储的目录。此参数只能在服务器启动时设置。
config_file 指定主服务器配置文件
hba_file 指定基于主机的身份验证的配置文件
ident_file 指定用户名映射的配置文件
external_pid_file 指定服务器应创建的以供服务器管理程序使用的其他进程 ID (PID) 文件的名称
连接设置
listen_addresses = '*' # 监听的 IP 地址;
# 使用逗号分隔的地址列表;
# 默认为 'localhost';使用 '*' 表示所有地址
# (修改后需要重新启动)
port = 5432 # 端口号(修改后需要重新启动)
max_connections = 2000 # 确定与数据库服务器的最大并发连接数。默认值通常为 100 个连接(修改后需要重新启动)
#reserved_connections = 0 # 保留连接数(修改后需要重新启动)
#superuser_reserved_connections = 3 # 超级用户保留连接数(修改后需要重新启动)
#unix_socket_directories = '/run/postgresql' # 逗号分隔的目录列表(修改后需要重新启动)
#unix_socket_group = '' # Unix socket 的群组(修改后需要重新启动)
#unix_socket_permissions = 0777 # 使用八进制表示的权限(修改后需要重新启动)
#bonjour = off # 通过 Bonjour 发布服务器信息(修改后需要重新启动)
#bonjour_name = '' # 默认为计算机名称(修改后需要重新启动)
TCP 设置
#tcp_keepalives_idle = 0 # 指定没有网络活动的时间,在此之后,操作系统应向客户端发送 TCP keepalive 消息,单位为秒;0 选择系统默认值
#tcp_keepalives_interval = 0 # 指定应重新传输客户端未确认的 TCP keepalive 消息的时间量,单位为秒;0 选择系统默认值
#tcp_keepalives_count = 0 # 指定在服务器与客户端的连接被视为失效之前可能丢失的 TCP keepalive 消息数;0 选择系统默认值
#tcp_user_timeout = 0 # 指定在强制关闭 TCP 连接之前,传输的数据可能保持未确认状态的时间量,单位为毫秒;0 选择系统默认值
#client_connection_check_interval = 0 # 在运行查询时检查客户端断开连接的时间间隔;0 表示从不检查
认证设置
#authentication_timeout = 1min # 认证超时时间,范围为 1 秒至 600 秒
#password_encryption = scram-sha-256 # 密码加密方式,可以是 scram-sha-256 或 md5
#scram_iterations = 4096 # SCRAM 加密迭代次数
#db_user_namespace = off # 是否启用数据库用户命名空间
# 使用 Kerberos 的 GSSAPI 认证
#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab' # Kerberos 服务端密钥文件路径
#krb_caseins_users = off # 是否区分大小写的用户名称
#gss_accept_delegation = off # 是否接受委派
SSL设置
#ssl = off # 是否启用 SSL
#ssl_ca_file = '' # CA 证书文件路径
#ssl_cert_file = 'server.crt' # 服务器证书文件路径
#ssl_crl_file = '' # 撤销列表文件路径
#ssl_crl_dir = '' # 撤销列表目录路径
#ssl_key_file = 'server.key' # 服务器私钥文件路径
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # 允许的 SSL 加密算法
#ssl_prefer_server_ciphers = on # 是否优先使用服务器端加密算法
#ssl_ecdh_curve = 'prime256v1' # ECDH 曲线
#ssl_min_protocol_version = 'TLSv1.2' # 最小的 SSL 协议版本
#ssl_max_protocol_version = '' # 最大的 SSL 协议版本
#ssl_dh_params_file = '' # DH 参数文件路径
#ssl_passphrase_command = '' # SSL 密码短语命令
#ssl_passphrase_command_supports_reload = off # SSL 密码短语命令是否支持重新加载
内存设置
shared_buffers = 128MB # 共享缓冲区大小,默认为 128kB(修改后需要重新启动)
#huge_pages = try # 使用巨大页面的设置,可以是 on、off 或 try(修改后需要重新启动)
#huge_page_size = 0 # 巨大页面的大小,0 表示使用系统默认值(修改后需要重新启动)
#temp_buffers = 8MB # 临时缓冲区大小,最小为 800kB
#max_prepared_transactions = 0 # 最大预处理事务数,0 表示禁用该功能 (修改后需要重新启动)
# 注意:不建议将 max_prepared_transactions 设置为非零,除非你确实打算使用预处理事务。
#work_mem = 4MB # 每个工作进程可用的内存大小,最小为 64kB
#hash_mem_multiplier = 2.0 # 哈希表工作内存的倍数,范围为 1 到 1000.0
#maintenance_work_mem = 64MB # 维护操作使用的内存大小,最小为 1MB
#autovacuum_work_mem = -1 # 自动清理操作使用的内存大小,最小为 1MB,-1 表示使用 maintenance_work_mem
#logical_decoding_work_mem = 64MB # 逻辑解码操作使用的内存大小,最小为 64kB
#max_stack_depth = 2MB # 栈深度的最大值,最小为 100kB
#shared_memory_type = mmap # 共享内存的类型,默认为操作系统支持的第一个选项:(修改后需要重新启动)
# mmap
# sysv
# windows
dynamic_shared_memory_type = posix # 动态共享内存的类型,默认为操作系统支持的第一个选项:(修改后需要重新启动)
# posix
# sysv
# windows
# mmap
#min_dynamic_shared_memory = 0MB # 最小动态共享内存大小
#vacuum_buffer_usage_limit = 256kB # 清理和分析缓冲区访问策略环的大小;
# 0 表示禁用清理缓冲区访问策略;
磁盘
#temp_file_limit = -1 # 每个进程临时文件空间限制,单位为千字节,-1 表示无限制
基于成本的清理延迟
#vacuum_cost_delay = 0 # 超过成本限制时进程将休眠的时间量,单位为毫秒(0 表示禁用)
#vacuum_cost_page_hit = 1 # 在共享缓冲区缓存中找到的缓冲区进行清空的估计成本
#vacuum_cost_page_miss = 2 # 清理必须从磁盘读取的缓冲区的估计成本
#vacuum_cost_page_dirty = 20 # 页面脏数据时的成本
#vacuum_cost_limit = 200 # 当吸尘操作累计的成本达到多少时,吸尘进程将进入休眠状态
后台写入进程
#bgwriter_delay = 200ms # 每轮之间的延迟时间,单位为毫秒
#bgwriter_lru_maxpages = 100 # 每轮最多写入的缓冲区数,0 表示禁用
#bgwriter_lru_multiplier = 2.0 # 每轮中写入的脏缓冲区数基于服务器进程在最近几轮中所需的新缓冲区数
#bgwriter_flush_after = 512kB # 每当后台编写器写入的数据量超过此量时,请尝试强制操作系统向底层存储发出这些写入,0 表示禁用
异步行为
#backend_flush_after = 0 # 每当单个后端写入的数据量超过此量时,请尝试强制操作系统将这些写入事件发到底层存储,以页为单位,0 表示禁用
#effective_io_concurrency = 1 # 可以同时执行的并发磁盘 I/O 操作数,范围为 1 到 1000;0 表示禁用预取
#maintenance_io_concurrency = 10 # 用于指定在执行维护操作(如 VACUUM、REINDEX 等)时,允许并发 IO 操作的数量,范围为 1 到 1000;0 表示禁用预取
#max_worker_processes = 8 # 最大工作进程数(修改后需要重新启动)
#max_parallel_workers_per_gather = 2 # 每次并行操作的最大并行工作进程数,受 max_parallel_workers 限制
#max_parallel_maintenance_workers = 2 # 并行维护工作进程的最大数,受 max_parallel_workers 限制
#max_parallel_workers = 8 # 可以在并行操作中使用的最大工作进程数,默认值为 8
#parallel_leader_participation = on # 并行操作中是否允许主进程参与
#old_snapshot_threshold = -1 # 设置使用查询快照时可以使用查询快照的最短时间,而不会出现“快照太旧”错误的风险。,单位为分钟到天数;-1 表示禁用;0 表示立即
# (修改后需要重新启动)
预写日志
wal_level = replica # WAL 日志级别,可以是 minimal(最小)、replica(复制)、logical(逻辑)
# (修改后需要重启)
fsync = on # 是否将数据刷新到磁盘以确保崩溃安全性(关闭此选项可能导致不可恢复的数据损坏)
synchronous_commit = on # 同步提交级别(指定在数据库服务器向客户端返回“成功”指示之前必须完成的 WAL 处理);
# off、local、remote_write、remote_apply 或 on
wal_sync_method = fsync # WAL 同步方法,默认为操作系统支持的第一个选项:
# open_datasync(使用选项写入 WAL 文件open()O_DSYNC)
# fdatasync(每次提交时调用)(Linux 和 FreeBSD 上的默认选项)
# fsync(每次提交时调用)
# fsync_writethrough(每次提交时调用,强制写入任何磁盘写入缓存)
# open_sync(使用选项写入 WAL 文件)
full_page_writes = on # 从部分页面写入中恢复
wal_log_hints = off # 是否对非关键更新也执行全页写入
# (修改后需要重启)
wal_compression = off # 启用全页写入的压缩;
# off、pglz、lz4、zstd 或 on
wal_init_zero = on # 新的 WAL 文件是否进行零填充
wal_recycle = on # 回收 WAL 文件
wal_buffers = -1 # WAL 缓冲区大小,最小为 32kB,-1 根据 shared_buffers 设置
# (修改后需要重启)
wal_writer_delay = 200ms # 指定 WAL 编写器刷新 WAL 的频率,以时间为单位,毫秒
wal_writer_flush_after = 1MB # 指定 WAL 编写器刷新 WAL 的频率,以页面计量,0 禁用
wal_skip_threshold = 2MB # 跳过 WAL 的阈值(当 is 和 事务在创建或重写永久关系后提交时,此设置确定如何保留新数据)
commit_delay = 0 # 提交延迟,范围 0-100000,单位为微秒
commit_siblings = 5 # 同时进行提交的事务数,范围 1-1000
检查点设置
#checkpoint_timeout = 5min # 自动 WAL 检查点之间的最长时间,范围 30秒-1天
#checkpoint_completion_target = 0.9 # 检查点完成目标时长,范围 0.0 - 1.0
#checkpoint_flush_after = 256kB # 每多少页刷新检查点,0 表示禁用
#checkpoint_warning = 30s # 检查点警告时间,0 表示禁用
max_wal_size = 1GB # WAL 日志文件最大大小
min_wal_size = 80MB # WAL 日志文件最小大小
# - 恢复过程中的预取设置 -
#recovery_prefetch = try # 是否预取WAL中引用的页面?
#wal_decode_buffer_size = 512kB # 预取时的前瞻窗口大小 (需要重启生效)
归档
# - 归档设置 -
#archive_mode = off # 启用归档; off, on, or always(更改需重启)
#archive_library = '' # 用于归档WAL文件的库
# (空字符串表示使用archive_command)
#archive_command = '' # 用于归档WAL文件的命令
# 占位符: %p = 要归档的文件路径
# %f = 仅文件名
# 例如: 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # 在多少秒后强制切换到下一个WAL文件; 0 表示禁用
# - 归档恢复 -
# 以下仅在恢复模式中使用。
#restore_command = '' # 用于恢复已归档WAL文件的命令
# 占位符: %p = 要恢复的文件路径
# %f = 仅文件名
# 例如: 'cp /mnt/server/archivedir/%f %p'
#archive_cleanup_command = '' # 每次重启点执行的清理归档命令
#recovery_end_command = '' # 恢复完成时执行的命令
恢复目标设置
# 仅在执行有针对性的恢复时设置这些选项。
#recovery_target = '' # 设置为 'immediate' 可以在达到一致状态后立即结束恢复(更改需重启)
#recovery_target_name = '' # 恢复到指定的命名恢复点 (更改需重启)
#recovery_target_time = '' # 恢复到指定的时间戳 (更改需重启)
#recovery_target_xid = '' # 恢复到指定的事务ID(更改需重启)
#recovery_target_lsn = '' # 恢复到指定的WAL LSN (更改需重启)
#recovery_target_inclusive = on # 指定停止的方式:
# 在指定恢复目标之后(on)
# 在指定恢复目标之前(off) (更改需重启)
#recovery_target_timeline = 'latest' # 恢复到特定的时间线: 'current', 'latest' 或时间线ID (更改需重启)
#recovery_target_action = 'pause' # 恢复目标后应执行的操作: 'pause', 'promote', 'shutdown' (更改需重启)
复制
# - 发送服务器设置 -
# 在主服务器和任何将发送复制数据的备用服务器上设置这些选项。
#max_wal_senders = 10 # walsender 进程的最大数量(更改需重启)
#max_replication_slots = 10 # 复制插槽的最大数量(更改需重启)
#wal_keep_size = 0 # 保留的WAL文件大小,单位为MB;0 表示禁用
#max_slot_wal_keep_size = -1 # 每个插槽保留的WAL文件大小,单位为MB;-1 表示禁用
#wal_sender_timeout = 60s # walsender 的超时时间,单位为毫秒;0 表示禁用
#track_commit_timestamp = off # 是否收集事务提交的时间戳
# (更改需重启)
# - 主服务器设置
# 这些设置在备用服务器上会被忽略。
#synchronous_standby_names = '' # 提供同步复制的备用服务器
# 可以选择同步备用服务器、同步备用服务器的数量,
# 以及以逗号分隔的应用程序名称列表
# '*' 表示所有备用服务器
# - 备用服务器设置 -
# 这些设置在主服务器上会被忽略。
#primary_conninfo = '' # 发送服务器的连接字符串
#primary_slot_name = '' # 发送服务器上的复制插槽名称
#hot_standby = on # "off" 在恢复期间禁止查询(更改需重启)
#max_standby_archive_delay = 30s # 从归档中读取WAL时取消查询的最大延迟时间 -1 表示无限延迟
#max_standby_streaming_delay = 30s # 从流式WAL中读取取消查询的最大延迟时间 -1 表示无限延迟
#wal_receiver_create_temp_slot = off # 如果未设置primary_slot_name,则创建临时插槽
#wal_receiver_status_interval = 10s # 至少每隔此时间发送一次响应 0 禁用
#hot_standby_feedback = off # 从备用服务器发送信息以防止查询冲突
#wal_receiver_timeout = 60s # 接收者等待主服务器通信的时间 单位为毫秒;0 禁用
#wal_retrieve_retry_interval = 5s # 在失败尝试后重新尝试检索WAL之前等待的时间
#recovery_min_apply_delay = 0 # 恢复期间应用更改的最小延迟时间
# - 订阅者设置 -
# 这些设置在发布者上会被忽略。
#max_logical_replication_workers = 4 # 指定逻辑复制工作线程的最大数量,从max_worker_processes中获取(更改需重启)
#max_sync_workers_per_subscription = 2 # 每个订阅的最大同步工作线程数,从max_logical_replication_workers中获取
#max_parallel_apply_workers_per_subscription = 2 # 每个订阅的最大并行应用工作线程数,从max_logical_replication_workers中获取
查询优化
# - 查询计划方法配置 -
#enable_async_append = on 启用或禁用查询计划器对异步感知追加计划类型的使用
#enable_bitmapscan = on 启用或禁用查询计划器对位图扫描计划类型的使用
#enable_gathermerge = on 启用或禁用查询计划器对收集合并计划类型的使用
#enable_hashagg = on 启用或禁用查询计划器对哈希聚合计划类型的使用
#enable_hashjoin = on 启用或禁用查询计划器对哈希联接计划类型的使用
#enable_incremental_sort = on 启用或禁用查询计划器对增量排序步骤的使用
#enable_indexscan = on 启用或禁用查询计划器对索引扫描计划类型的使用
#enable_indexonlyscan = on 启用或禁用查询计划器对仅索引扫描计划类型的使用
#enable_material = on 启用或禁用查询计划器对具体化的使用
#enable_memoize = on 启用或禁用查询计划器使用记忆计划来缓存嵌套循环联接中参数化扫描的结果
#enable_mergejoin = on 启用或禁用查询计划器对合并-联接计划类型的使用
#enable_nestloop = on 启用或禁用查询计划器对嵌套循环联接计划的使用
#enable_parallel_append = on 启用或禁用查询计划器对并行感知追加计划类型的使用
#enable_parallel_hash = on 启用或禁用查询计划器使用具有并行哈希的哈希联接计划类型
#enable_partition_pruning = on 启用或禁用查询计划器从查询计划中消除分区表分区的功能
#enable_partitionwise_join = off 启用或禁用查询规划器对分区联接的使用,这允许通过联接匹配的分区来执行分区表之间的联接
#enable_partitionwise_aggregate = off 启用或禁用查询规划器对分区分组或聚合的使用,这允许对分区表分别对每个分区执行分组或聚合
#enable_presorted_aggregate = on 控制查询计划器是否将生成一个计划,该计划将提供按查询/聚合函数所需的顺序进行预排序的行
#enable_seqscan = on 启用或禁用查询计划器对顺序扫描计划类型的使用
#enable_sort = on 启用或禁用查询计划器对显式排序步骤的使用
#enable_tidscan = on 启用或禁用查询计划器对 TID 扫描计划类型的使用
# - 查询计划成本常量 -
#seq_page_cost = 1.0 # 设置计划员对磁盘页读取成本的估计值,该读取是一系列顺序读取的一部分
#random_page_cost = 4.0 # 设置计划员对非顺序提取的磁盘页的成本的估计值
#cpu_tuple_cost = 0.01 # 设置计划员对查询期间处理每一行的成本的估计值
#cpu_index_tuple_cost = 0.005 # 设置计划员对索引扫描期间处理每个索引条目的成本的估计值
#cpu_operator_cost = 0.0025 # 设置计划员对处理查询期间执行的每个运算符或函数的成本的估计值
#parallel_setup_cost = 1000.0 # 设置计划员对启动并行工作进程的成本的估计
#parallel_tuple_cost = 0.1 # 设置计划员对将一个元组从一个并行工作进程转移到另一个进程的成本的估计值
#min_parallel_table_scan_size = 8MB 设置必须扫描的最小表数据量,以便考虑并行扫描
#min_parallel_index_scan_size = 512kB 设置必须扫描的索引数据的最小量,以便考虑并行扫描
#effective_cache_size = 4GB 设置计划器对可用于单个查询的磁盘缓存的有效大小的假设
#jit_above_cost = 100000 # 如果查询比这个成本昂贵,则执行JIT编译;-1 禁用
#jit_inline_above_cost = 500000 # 如果查询比这个成本昂贵,则内联小函数;-1 禁用
#jit_optimize_above_cost = 500000 # 如果查询比这个成本昂贵,则使用昂贵的JIT优化;-1 禁用
# - 遗传查询优化器 -
#geqo = on 启用或禁用遗传查询优化
#geqo_threshold = 12 使用遗传查询优化来规划至少涉及这么多项的查询
#geqo_effort = 5 # 范围 1-10
#geqo_pool_size = 0 # 根据工作量选择默认值
#geqo_generations = 0 # 根据工作量选择默认值
#geqo_selection_bias = 2.0 # 范围 1.5-2.0
#geqo_seed = 0.0 # 范围 0.0-1.0
# - 其他查询计划选项 -
#default_statistics_target = 100 # 范围 1-10000
#constraint_exclusion = partition # 控制查询计划器对表约束的使用,以优化查询。on、off 或 partition
#cursor_tuple_fraction = 0.1 # 设置计划器对将要检索的游标行的比例的估计值 范围 0.0-1.0
#from_collapse_limit = 8
#jit = on # 允许 JIT 编译
#join_collapse_limit = 8 # 1 禁用显式 JOIN 子句的折叠
#plan_cache_mode = auto # auto、force_generic_plan 或 force_custom_plan
#recursive_worktable_factor = 10.0 # 范围 0.001-1000000
报告和日志记录
# - 日志位置 -
log_destination = 'stderr' # 有效值是 stderr、csvlog、jsonlog、syslog 和 eventlog,取决于平台
logging_collector = on # 启用捕获 stderr、jsonlog 和 csvlog 到日志文件。需要启用此项才能使用 csvlog 和 jsonlog。(更改需要重启)
# 只有在 logging_collector 启用时才会使用以下选项:
log_directory = 'log' # 日志文件写入的目录,可以是绝对路径或相对于 PGDATA 的路径
log_filename = 'postgresql-%a.log' # 日志文件名模式,可以包含 strftime() 转义字符
#log_file_mode = 0600 # 日志文件的创建模式,以 0 开始使用八进制表示
log_rotation_age = 1d # 自动轮换日志文件的时间间隔。0 禁用。
log_rotation_size = 0 # 自动轮换日志文件的输出大小。0 禁用。
log_truncate_on_rotation = on # 如果启用,同名的旧日志文件会被截断而不是追加。但此种截断仅在基于时间的轮换时发生,不包括重启或基于大小的轮换。默认为关闭,即在所有情况下追加到现有文件。
# - 何时记录日志 -
#log_min_messages = warning # 记录消息的最低级别: debug5 debug4 debug3 debug2 debug1 info notice warning error log fatal panic
#log_min_error_statement = error # 记录错误语句的最低级别: debug5 debug4 debug3 debug2 debug1 info notice warning error log fatal
# panic (实际上是禁用的)
#log_min_duration_statement = -1 # -1 表示禁用,0 记录所有语句及其持续时间,> 0 仅记录运行时间至少为指定毫秒数的语句
#log_min_duration_sample = -1 # -1 表示禁用,0 记录样本语句及其持续时间,> 0 仅记录运行时间至少为指定毫秒数的样本语句;
# 样本比例由 log_statement_sample_rate 决定
#log_statement_sample_rate = 1.0 # 超过 log_min_duration_sample 的语句的记录比例;
# 1.0 记录所有这样的语句,0.0 从不记录
#log_transaction_sample_rate = 0.0 # 不考虑其持续时间,记录语句的事务比例;
# 1.0 记录所有事务的语句,0.0 从不记录
#log_startup_progress_interval = 10s # 长时间运行的启动操作之间的进度更新时间。
# 0 禁用此功能,> 0 表示以毫秒为间隔
# - 记录内容 -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_autovacuum_min_duration = 10min # 记录自动清理活动;
# -1 禁用,0 记录所有操作及其持续时间,> 0 仅记录运行时间至少为指定毫秒数的操作
#log_checkpoints = on 导致在服务器日志中记录检查点和重新启动点
#log_connections = off 导致记录与服务器的每次尝试连接,以及成功完成客户端身份验证(如有必要)和授权
#log_disconnections = off 导致记录会话终止
#log_duration = off 导致记录每个已完成的语句的持续时间
#log_error_verbosity = default # 简洁、默认或详细消息
#log_hostname = off 连接日志消息仅显示连接主机的 IP 地址
log_line_prefix = '%m [%p] ' # 特殊值:
# %a = 应用程序名称
# %u = 用户名
# %d = 数据库名称
# %r = 远程主机和端口
# %h = 远程主机
# %b = 后端类型
# %p = 进程 ID
# %P = 并行组的进程 ID
# %t = 没有毫秒的时间戳
# %m = 带毫秒的时间戳
# %n = 带毫秒的时间戳(Unix epoch格式)
# %Q = 查询 ID(如果没有或未计算为 0)
# %i = 命令标签
# %e = SQL 状态
# %c = 会话 ID
# %l = 会话行号
# %s = 会话启动时间戳
# %v = 虚拟事务 ID
# %x = 事务 ID(如果没有为 0)
# %q = 非会话进程中止
# %% = '%'
# 例如 '<%u%%%d> '
#log_lock_waits = off # 记录锁等待 >= 死锁超时的锁
#log_recovery_conflict_waits = off # 记录备用恢复冲突等待 >= 死锁超时
#log_parameter_max_length = -1 # 记录语句时,将绑定参数值限制为 N 字节;-1 表示完整打印,0 禁用
#log_parameter_max_length_on_error = 0 # 记录错误时,将绑定参数值限制为 N 字节;-1 表示完整打印,0 禁用
#log_statement = 'none' # none、ddl、mod、all
#log_replication_commands = off
#log_temp_files = -1 # 记录临时文件等于或大于指定大小的文件(以 KB 为单位);-1 禁用,0 记录所有临时文件
log_timezone = 'Asia/Shanghai'
# - 进程标题 -
#cluster_name = '' # 如果非空,添加到进程标题中(更改需要重新启动)
#update_process_title = on
统计信息
# - 累积查询和索引统计 -
#track_activities = on
#track_activity_query_size = 1024 # (修改后需要重新启动)
#track_counts = on
#track_io_timing = off
#track_wal_io_timing = off
#track_functions = none # none, pl, all
#stats_fetch_consistency = cache # cache, none, snapshot
监控
#compute_query_id = auto 启用查询标识符的核心计算
#log_statement_stats = off
#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
自动清理
#autovacuum = on # 启用自动清理子进程?'on' 需要同时启用 track_counts。
#autovacuum_max_workers = 3 # 最大自动清理子进程数 (修改后需要重新启动)
#autovacuum_naptime = 1min # 自动清理运行之间的时间间隔
#autovacuum_vacuum_threshold = 50 # 执行 VACUUM 前更新的最小行数
#autovacuum_vacuum_insert_threshold = 1000 # 执行 VACUUM 前插入的最小行数;-1 禁用插入 VACUUM
#autovacuum_analyze_threshold = 50 # 执行 ANALYZE 前更新的最小行数
#autovacuum_vacuum_scale_factor = 0.2 # VACUUM 执行前表大小的分数
#autovacuum_vacuum_insert_scale_factor = 0.2 # 插入 VACUUM 执行前插入数量与表大小的分数
#autovacuum_analyze_scale_factor = 0.1 # ANALYZE 执行前表大小的分数
#autovacuum_freeze_max_age = 200000000 # 强制执行 VACUUM 前的最大 XID 年龄 (修改后需要重新启动)
#autovacuum_multixact_freeze_max_age = 400000000 # 强制执行 VACUUM 前的最大 multixact 年龄 (修改后需要重新启动)
#autovacuum_vacuum_cost_delay = 2ms # 自动 VACUUM 的默认 VACUUM 成本延迟,以毫秒为单位;-1 表示使用 vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1 # 自动 VACUUM 的默认 VACUUM 成本限制;-1 表示使用 vacuum_cost_limit
客户端连接默认值
# - 语句行为 -
#client_min_messages = notice # 消息的最低级别:debug5 debug4 debug3 debug2 debug1 log notice warning error
#search_path = '"$user", public' # 模式名称
#row_security = on
#default_table_access_method = 'heap'
#default_tablespace = '' # 表空间名称,'' 使用默认
#default_toast_compression = 'pglz' # 'pglz' 或 'lz4'
#temp_tablespaces = '' # 表空间名称列表,'' 只使用默认表空间
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
#statement_timeout = 0 # 毫秒为单位,0 表示禁用
#lock_timeout = 0 # 毫秒为单位,0 表示禁用
#idle_in_transaction_session_timeout = 0 # 毫秒为单位,0 表示禁用
#idle_session_timeout = 0 # 毫秒为单位,0 表示禁用
#vacuum_freeze_table_age = 150000000 #参数决定了在 VACUUM 进行冻结操作前,一个表的事务年龄(从上次 VACUUM 到现在的事务数)应该达到多少
#vacuum_freeze_min_age = 50000000 #这个参数控制了行版本在被标记为冻结前需要有多“老”
#vacuum_failsafe_age = 1600000000 #参数设置了一个绝对的界限,当事务 ID 的年龄接近这个值时,系统将开始发出警告,提醒管理员采取行动
#vacuum_multixact_freeze_table_age = 150000000 #与 vacuum_freeze_table_age 类似,但针对多事务 ID。当一个多事务的年龄超过这个设置时,将触发冻结操作
#vacuum_multixact_freeze_min_age = 5000000 # 控制多事务 ID 在被冻结前需要有多“老”
#vacuum_multixact_failsafe_age = 1600000000 #与 vacuum_failsafe_age 相似,但用于多事务 ID,设置了一个绝对的界限,以避免多事务 ID 环绕问题
#bytea_output = 'hex' # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_pending_list_limit = 4MB
#createrole_self_grant = '' # 设置和/或继承
区域设置和格式化
datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
timezone = 'Asia/Shanghai'
#timezone_abbreviations = 'Default' # 选择可用时区缩写集。
# 目前有
# Default
# Australia (historical usage)
# India
# 您可以在 share/timezonesets/ 中创建自己的文件。
#extra_float_digits = 1 # 最小 -15,最大 3;>0 实际上选择精确输出模式
#client_encoding = sql_ascii # 实际上,默认为数据库编码
# 这些设置由 initdb 初始化,但它们可以更改。
lc_messages = 'en_US.UTF-8' # 系统错误消息字符串的区域设置
lc_monetary = 'en_US.UTF-8' # 货币格式的区域设置
lc_numeric = 'en_US.UTF-8' # 数字格式的区域设置
lc_time = 'en_US.UTF-8' # 时间格式的区域设置
#icu_validation_level = warning # 报告 ICU 区域设置验证错误的级别
错误处理
#exit_on_error = off # 在任何错误时终止会话?
#restart_after_crash = on # 后端崩溃后重新初始化?
#data_sync_retry = off # 数据 fsync 失败时重试或紧急情况?
# (修改后需要重新启动)
#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
配置文件包含设置
# 这些选项允许从除了默认 postgresql.conf 之外的文件中加载设置。
# 注意,这些是指令,而不是变量赋值,因此可以有多个有效设置。
#include_dir = '...' # 包含以 '.conf' 结尾的文件的目录,例如 'conf.d'
#include_if_exists = '...' # 仅在文件存在时包含文件
#include = '...' # 包含文件
其他
# 文本搜索的默认配置
default_text_search_config = 'pg_catalog.english'
# - 共享库预加载 -
#local_preload_libraries = ''
#session_preload_libraries = ''
#shared_preload_libraries = '' # (修改后需要重新启动)
#jit_provider = 'llvmjit' # 要使用的 JIT 库
# - 其他默认值 -
#dynamic_library_path = '$libdir'
#gin_fuzzy_search_limit = 0
#------------------------------------------------------------------------------
# 锁管理
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
#max_locks_per_transaction = 64 # 最小为 10
# (修改后需要重新启动)
#max_pred_locks_per_transaction = 64 # 最小为 10
# (修改后需要重新启动)
#max_pred_locks_per_relation = -2 # 负值意味着
# (max_pred_locks_per_transaction
# / -max_pred_locks_per_relation) - 1
#max_pred_locks_per_page = 2 # 最小为 0
#------------------------------------------------------------------------------
# 版本和平台兼容性
#------------------------------------------------------------------------------
# - 以前的 PostgreSQL 版本 -
#array_nulls = on
#backslash_quote = safe_encoding # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#quote_all_identifiers = off
#standard_conforming_strings = on
#synchronize_seqscans = on
# - 其他平台和客户端 -
#transform_null_equals = off
pg_hba.conf详解
解释各字段
1、TYPE: 指定连接的类型。可能的值包括:
local: 适用于 Unix 域套接字连接(即本地系统上的连接)。
host: 适用于非加密的 TCP/IP 连接。
hostssl: 适用于 SSL/TLS 加密的 TCP/IP 连接。
hostnossl: 适用于非 SSL/TLS 的 TCP/IP 连接。
hostgssenc: 适用于 GSSAPI 加密的 TCP/IP 连接。
hostnogssenc: 适用于非 GSSAPI 加密的 TCP/IP 连接。
2、DATABASE: 指定规则适用的数据库。可以是具体数据库的名字,如 mydb;all 表示所有数据库;replication 表示专门用于流复制的连接。
3、USER: 指定规则适用的用户。可以是具体用户的名字,如 johndoe;all 表示所有用户。
4、ADDRESS: 指定连接的来源。可以是具体的 IP 地址,如 192.168.1.100;all 或 0.0.0.0 表示任何 IP 地址;::1 表示 IPv6 的本地环回地址;localhost 表示通过主机名解析的本地连接;% 表示通配符,匹配任何地址;.example.com 表示以 .example.com 结尾的任何主机名。
5、METHOD: 指定用于身份验证的方法。可能的值包括:
trust: 不需要任何身份验证,自动接受连接。
reject: 自动拒绝连接。
md5: 使用 MD5 加密的密码验证。
scram-sha-256: 使用 SCRAM-SHA-256 加密的密码验证。
ident: 使用远程主机上的 identd 服务进行身份验证。
peer: 使用操作系统身份验证(如 SELinux 或 AppArmor)。
pam: 使用 PAM(Pluggable Authentication Modules)进行身份验证。
gss: 使用 GSSAPI 进行 Kerberos 身份验证。
radius: 使用 RADIUS 服务进行身份验证。
6、OPTIONS: 这些是可选的,用于特定的身份验证方法或扩展的功能。
示例
TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
本地 Unix 域套接字连接:
local all all trust
允许任何本地系统用户无需密码通过 Unix 域套接字连接到任何数据库。
本地环回 TCP/IP 连接:
host all all 127.0.0.1/32 trust
允许任何用户从本地环回地址 (127.0.0.1) 连接到任何数据库,无需密码。
IPv4 掩码指定的本地环回连接:
host all all 127.0.0.1 255.255.255.255 trust
这与上一条相同,但明确指定了 IP 掩码。
IPv6 本地环回连接:
host all all ::1/128 trust
允许任何用户从 IPv6 本地环回地址 (::1) 连接到任何数据库,无需密码。
主机名指定的本地连接:
host all all localhost trust
这条规则允许任何用户从主机名 localhost 连接到任何数据库,无需密码。
正则表达式匹配的数据库:
local db1,"/^db\d{2,4}$",db2 all localhost trust
允许任何用户无需密码从 localhost 连接到名为 db1 或以 "db" 开头并以 2 到 4 位数字结尾的任何数据库,例如 db1234 或 db12。
特定 IP 地址范围内的信任连接:
host postgres all 192.168.93.0/24 ident
允许 192.168.93.0/24 子网中的任何用户连接到 postgres 数据库,身份验证通过 ident 方法完成。
单个 IP 地址的密码验证:
host postgres all 192.168.12.10/32 scram-sha-256
允许 192.168.12.10 的任何用户连接到 postgres 数据库,要求使用 SCRAM-SHA-256 密码验证。
域名范围的连接:
host all mike .example.com md5
host all all .example.com scram-sha-256
允许来自 example.com 域的所有用户连接到任何数据库,Mike 使用 MD5 身份验证,其他所有用户使用 SCRAM-SHA-256。
10.拒绝和例外规则:
host all all 192.168.54.1/32 reject 拒绝来自 192.168.54.1 的所有连接。
hostgssenc all all 0.0.0.0/0 gss 允许任何地方的 GSSAPI 加密连接。
host all all 192.168.12.10/32 gss 允许 192.168.12.10 的 GSSAPI 非加密连接。
11.子网范围的身份验证:
host all all 192.168.0.0/16 ident map=omicron
允许 192.168.0.0/16 子网中的任何用户连接到任何数据库,身份验证通过 ident 方法和 pg_ident.conf 中的 omicron 映射完成。
12.本地连接的密码策略:
local sameuser all md5
local all /^.*helpdesk$/ md5
local all @admins md5
local all +support md5
允许本地用户连接到与他们用户名同名的数据库,并对 helpdesk 用户、管理员和 support 角色成员连接到任何数据库时要求密码。
pg_ident.conf 详解
文件结构与语法
映射记录(Mapping Records)
每个记录由三部分组成:MAPNAME, SYSTEM-USERNAME, PG-USERNAME。
MAPNAME 是在 pg_hba.conf 文件中定义的映射名称,用于识别特定的映射规则。
SYSTEM-USERNAME 是从客户端检测到的操作系统用户名。
PG-USERNAME 是客户端请求的 PostgreSQL 用户名,也是映射后的用户名。
正则表达式支持
如果 SYSTEM-USERNAME 开头是斜杠 /,则会被视为正则表达式。
正则表达式中可以包含捕获组(括号内的子表达式),匹配的子串可以用 \1(或其他反向引用)在 PG-USERNAME 中替换。
PG-USERNAME 的特殊值
all:表示任何数据库用户。
用户名前加 + 表示一个组名,允许组内的所有用户使用此映射。
以斜杠 / 开始表示 PG-USERNAME 也是一个正则表达式,此时 \1 的值不会影响匹配。
包含其他文件或目录
包含记录(Include Records)
include: 直接包含指定的文件。
include_if_exists: 如果文件存在,则包含;否则忽略。
include_dir: 包含指定目录下的所有 .conf 后缀的文件,按文件名排序。
文件处理
pg_ident.conf 文件在 PostgreSQL 服务器启动时读取,或在 postmaster 进程收到 SIGHUP 信号时重新读取。
编辑文件后,需要通过 pg_ctl reload 命令或发送 SIGHUP 信号给 postmaster 进程,以便让更改生效。
实际配置位置
在文件的最后,你可以添加实际的映射规则,格式为:MAPNAME SYSTEM-USERNAME PG-USERNAME。
示例
假设有以下 pg_ident.conf 配置:
> sysadmin root postgres
> developers /dev\1/ developer+\1+
这意味着:
名称为 sysadmin 的映射,将系统用户 root 映射为数据库用户 postgres。
名称为 developers 的映射,使用正则表达式 /dev\1/ 来匹配以 dev 开头的系统用户,然后将其映射为数据库用户,其中系统用户名中匹配的部分(即 \1)将被追加到 developer 之后形成数据库用户名。
这种配置使得 PostgreSQL 可以更加灵活地控制不同操作系统的用户如何访问数据库资源,同时简化了用户管理和权限分配。
线上调整参数
下面是一些常见的、通常需要在生产环境中调整的参数,以及它们的作用:
listen_addresses:
设置 PostgreSQL 监听的网络地址。在生产环境中,你可能需要监听所有接口或特定的 IP 地址。
port:
PostgreSQL 默认监听的端口是 5432。在生产环境中,如果需要,可以更改此端口号。
max_connections:
设定数据库服务器可以同时接受的最大连接数。根据服务器的内存和 CPU 资源,以及预期的并发用户数进行调整。
shared_buffers:
设置用于缓冲数据库块的共享内存大小。在生产环境中,通常将其设置为服务器总内存的 25% 至 40%。
effective_cache_size:
设置 PostgreSQL 应假设的缓存大小。通常设置为服务器总内存的 75%。
maintenance_work_mem:
设定在执行如 VACUUM FULL, CREATE INDEX, REINDEX 等维护操作时可以使用的内存。根据可用内存调整。
checkpoint_completion_target:
设定在检查点期间,PostgreSQL 努力完成的 I/O 操作百分比。通常设置为 0.9(90%)。
wal_level:
设置写入 WAL(Write-Ahead Log)的日志级别。在生产环境中,通常设置为 replica 或 logical,以支持流复制或逻辑解码。
wal_log_hints:
如果设置为 on,WAL 将包含额外的信息,有助于分析和调试。
log_destination:
设定日志的输出目的地。在生产环境中,通常设置为 stderr 和 syslog。
log_min_duration_statement:
设置记录慢查询的最小执行时间。根据性能监控需求调整。
log_min_error_statement:
设置记录错误的最低级别。通常设置为 error 或更高。
log_line_prefix:
设置日志记录行的前缀,通常包含数据库名和用户信息。
log_checkpoints, log_connections, log_disconnections, log_lock_waits, log_statement, log_temp_files:
控制各种事件的记录。根据监控和审计需求进行调整。
work_mem:
设置每个后台工作进程可以使用的内存。根据查询复杂性和服务器资源调整。
max_wal_senders:
设定可以同时发送 WAL 数据的最大流复制连接数。
max_replication_slots:
设定可以同时保持的最大逻辑解码复制槽数。
max_worker_processes:
设定可以同时运行的后台工作进程的最大数目。
max_parallel_workers_per_gather 和 max_parallel_workers:
控制并行查询可以使用的最大工作进程数。
ssl:
如果需要加密客户端连接,设置 SSL 相关参数。
autovacuum 相关参数:
调整 autovacuum_max_workers, autovacuum_naptime, autovacuum_vacuum_threshold, autovacuum_analyze_threshold 等参数,以适应数据库的工作负载。
archive_mode 和 archive_command:
如果使用归档模式,需要设置这些参数。
这些只是在生产环境中可能需要调整的一部分参数。具体调整应基于你的硬件规格、工作负载特性、安全需求和业务要求。
总结
这三个配置文件共同控制着 PostgreSQL 服务器的核心功能和安全性。正确配置这些文件对于确保数据库的稳定运行和数据安全至关重要。定期审查和更新这些配置文件,根据服务器的工作负载和安全需求进行调整,是数据库管理的重要组成部分。同时,保持对最新安全实践的关注,以防止潜在的安全漏洞。
公众号内直接回复加群也可以,扫码加群也可以,觉得帖子写的不错,点点关注,点点赞,多多转载。
加入数据库技术交流群:
进群福利:
1、知识共享与学习机会
2、问题求助与解决支持
3、技术沉淀和分享平台
4、及时了解行业动态