# 设置时区(PRC指:People's Republic of China)
log_timezone = 'PRC'
timezone = 'PRC'
# 如果参数DateStyle 被设置为 MDY,数据库将按“月-日-年”的格式来解释输入的数据
datestyle = 'iso, mdy'
# 全文检索
default_text_search_config = 'pg_catalog.english'
# 监听地址
listen_addresses = '*'
# 监听端口
port = 5432
# 控制wal存储的级别。默认值是minimal,表示只写入从崩溃或者立即关机中恢复需要的信息。如果设置为archive,会增加WAL归档所需的日志。当设置为hot_standby时,表示在备用服务器上增加运行只读查询所需的信息。如果我们想要完成归档和流复制,需要把wal_level设置为 “archive” 或者 “hot_standby”。
wal_level = hot_standby
# 开启热备用
hot_standby = on
# 开启流复制
archive_mode = on
archive_command = 'cp "%p" "/data/pgsql/archivedir/%f"'
# walsender进程的最大数目
max_wal_senders = 5
# 日志文件段
wal_keep_segments = 1280
wal_sender_timeout = 60s
# 允许客户端的最大并发连接数目,默认值是100。每个连接占用 400字节共享内存
max_connections = 2500
# 同时处于prepared状态的事务的最大数目,它的值通常应该和max_connections的值一样大。每个事务消耗600字节(b)共享内存
max_prepared_transactions = 2500
# 设置wal_log_hints这个参数使得能够记录特定提示位(hint-bit)的变化。这个参数只能在服务器启动的时候被设置。默认值为off。当这个参数设置为ON时,PostgreSQL数据库服务器在一个检查点之后第一次页面更改过程(即使是对提示位进行非关键性的修改)中,将每个磁盘页的全部内容写入到WAL中。
wal_log_hints = on
# 支持内建的过程使用并行的方式工作,例如建立索引,默认设置为2
max_parallel_maintenance_workers = 16
# 这部分内存被用于记录垃圾tupleid,vacuum进程在进行表扫描时,当扫描到的垃圾记录ID占满了整个内存(autovacuum_work_mem或maintenance_work_mem),那么会停止扫描表,开始INDEX的扫描。
maintenance_work_mem = 3GB
# 当前系统中支持的最大后台进程数,在slave库中这个设置还应该比主库的大一些,或一致。
max_worker_processes = 64
# 支持并行的查询使用的线程数
max_parallel_workers_per_gather = 24
其中的关系应该是:max_work_processes > max_parallel_workers > max_parallel_workers_per_gather >= max_parallel_maintenance_workers
# 在查询中可以使用的最大的并行线程的数量
max_parallel_workers = 36
# 优化器假设一个查询可以用的最大内存,和shared_buffers无关(推荐内存的1/2)
effective_cache_size = 64GB
# 尽量使用大页,需要操作系统的支持,配置vm.nr_hugepages*2MB大于 shared_buffers.
huge_pages = try
# 决定有多少内存可以被PostgreSQL用于缓存数据(推荐内存的1/4),在IO压力很大的情况下,提高该值可以减少IO
shared_buffers = 64GB
# 指定事务日志缓冲区中包含的数据块的个数,每个数据块的大小是8KB,所以默认的事务日志缓冲区的大小是8*8=64KB。
wal_buffers = 16MB
# 数据库在启动时要加载的操作系统共享库文件
shared_preload_libraries = 'pg_stat_statements'
# 该模块跟踪的语句的最大数目(即pg_stat_statements视图中行的最大数量)。如果观测到的可区分的语句超过这个数量,最少被执行的语句的信息将会被丢弃。默认值为 5000。这个参数只能在服务器启动时设置。
pg_stat_statements.max = 10000
# 指定all还可以跟踪嵌套的语句(例如在函数中调用的语句)
pg_stat_statements.track = all
# 单位是秒,默认值是300。它影响系统何时启动一个检查点操作。如果现在的时间减去上次检查点操作结束的时间超过了checkpoint_timeout的值,系统就会自动启动一个检查点操作。增大这个参数会增加数据库崩溃以后恢复操作需要的时间。即 最大多长时间发生一次checkpoint
checkpoint_timeout = 30min
# 每个订阅的同步工作者的最大数目
max_sync_workers_per_subscription = 32
# 在自动WAL检查点使得WAL增长到最大尺寸。
这是软限制;特殊情况下WAL大小可以超过 max_wal_size,如重负载下,错误archive_command,或者 较大wal_keep_segments的设置。缺省是1GB。 增加这个参数会延长崩溃恢复所需要的时间
max_wal_size = 64GB
# 只要WAL磁盘使用率低于这个设置,旧的WAL文件总数被回收,以供将来检查点使用。而不是删除。 这可以用来确保预留足够的WAL空间处理WAL使用中的峰值,比如当运行大批量工作时。 缺省是80MB
min_wal_size = 4GB
# 当这个参数设置为ON时,如果在数据库恢复过程中打开full_page_writes,PostgreSQL服务器会压缩写入WAL的完整页面图像。压缩的页面图像会在WAL重放过程中被解压缩。
wal_compression = on
# 默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPIDLE属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。即 间歇性发送TCP心跳包,防止连接被网络设备中断。
tcp_keepalives_idle = 600
# 默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPINTVL属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。
tcp_keepalives_interval = 10
# 默认值是0,意思是使用操作系统的默认值。它设置TCP套接字的TCP_KEEPCNT属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。
tcp_keepalives_count = 6
# 控制是够打开数据库的自动垃圾收集功能。默认值是on。如果autovacuum被设为on,参数track_counts也要被设为on,自动垃圾收集才能正常工作。注意,即使这个参数被设为off,如果事务ID回绕即将发生,数据库会自动启动一个垃圾收集操作
autovacuum = on
# 设置能同时运行的最大的自动垃圾收集工作进程的数目。默认值是3
autovacuum_max_workers = 8
# 每个worker可使用的最大内存数
autovacuum_work_mem = 4GB
# 在规定时长内未完成的vacuum予以记录日志,单位ms,当vacuum动作超过此值时。 "-1"表示不记录。"0"表示每次都记录。
log_autovacuum_min_duration = 0
# 清理的缩放系数,默认值为0.2
autovacuum_vacuum_scale_factor = 0.02
# analyze的缩放系数,默认值为0.1
autovacuum_analyze_scale_factor = 0.01
# 设置需要强制对数据库进行清理的XID上限值
autovacuum_freeze_max_age = 1200000000
autovacuum_multixact_freeze_max_age = 1250000000
# 运行一次vacuum的时长,如果超过此值则休眠然后起来接着vacuum(vacuum很好I/O),如果为-1,取vacuum_cost_delay值。
autovacuum_vacuum_cost_delay = 0ms
# 如果pg_class.relfrozenxid的事务年龄大于该参数的值,那么PostgreSQL会在该表上自动vacuum执行全表扫描,默认是150亿个事务。 因为VACUUM通常会忽略没有任何死行版本页面,但这些页面可能仍然有旧XID值的行版本。为了确保所有旧的XID已被FrozenXID替换, 需要全表扫描。
vacuum_freeze_table_age = 200000000
# 如果表的pg_class.relminmxid域超过了这个设置指定的年龄,VACUUM会执行一次激进的扫描。激进的扫描与常规VACUUM的区别在于它会访问每一个可能包含未冻结 XID 或者 MXID 的页面,而不是只扫描那些可能包含死亡元组的页面
vacuum_multixact_freeze_table_age = 200000000
# 设置为了考虑并行扫描而必须扫描的最小表数据量。对于并行顺序扫描,扫描的表数据量总是等于表的大小,但是当使用索引时,扫描的表数据量通常会少一些。默认值是8兆(8MB)。
min_parallel_table_scan_size = 0
# 设置为了考虑并行扫描而必须扫描的最小索引数据量。注意,并行索引扫描通常不会涉及整个索引;规划师认为扫描实际上会接触到的页数才是相关的。缺省值为512kB。
min_parallel_index_scan_size = 0
# 设置规划器对将一个元组从并行工作进程转移到另一个进程的成本的估计。默认值是0.1。
parallel_tuple_cost = 0
# 设置计划者对启动并行工作进程成本的估计。默认值为1000。
parallel_setup_cost = 0
# 日志配置
# 是否开启日志收集开关,默认off,开启要重启DB
logging_collector = on
# 日志记录类型,默认是stderr,只记录错误输出
log_destination = 'csvlog'
# 默认为off,设置为on的话,如果新建了一个同名的日志文件,则会清空原来的文件,再写入日志,而不是在后面附加。
log_truncate_on_rotation = on
# 用户session登陆时是否写入日志,默认off
log_connections = on
# 用户session退出时是否写入日志,默认off
log_disconnections = on
# 默认为default,verbose表示冗长的
log_error_verbosity = verbose
# 日志路径,默认是$PGDATA/pg_log, 这个目录最好不要和数据文件的目录放在一起, 目录需要给启动postgres的操作系统用户写权限.
log_directory = /var/log/postgresql
# 记录级别,记录用户登陆数据库后的各种操作,postgres日志里分成了3类,通过参数pg_statement来控制,默认的pg_statement参数值是none,即不记录,可以设置ddl(记录create,drop和alter)、mod(记录ddl+insert,delete,update和truncate)和all(mod+select)。
# log_statement = ddl
# 定位慢查询SQL ,可以设置一定时长的参数(log_min_duration_statement),来记录超过该时长的所有SQL,对找出当前数据库的慢查询很有效。 比如log_min_duration_statement = 2s,记录超过2秒的SQL,改完需要reload
# log_min_duration_statement = 60s