数据库参数
数据库参数
PostgreSQL数据库中有许多重要参数,这些参数可以根据硬件资源、工作负载和其他因素进行调整以优化性能。可通过视图pg_settings
得到所有的配置参数,也可以通过select * from pg_file_settings
查看系统视图得到当前数据库设置的系统参数,以下是一些关键参数及其描述和推荐设置(基于参考文章中的信息):
三种修改方式
除了set和修改postgresql.conf以外,还可以alter system命令来修改。三种修改方式的特点和适用场景如下。
-
SET命令修改:SET 命令用于在当前会话中临时设置配置参数的值,这些设置仅在当前数据库连接有效,数据库重启后会失效。示例语法:
SET parameter_name TO value; # 语法 SET work_mem TO '100MB'; # 示例
-
postgresql.cong文件修改:直接编辑
postgresql.conf
文件可以永久性地修改配置参数的值,这些设置会在 PostgreSQL 服务重启后仍然有效。修改配置文件后,需要重新加载配置才能使新的设置生效,可以通过发送SIGHUP
信号给 PostgreSQL 进程或者使用pg_ctl reload
命令来实现。 -
ALTER SYSTEM命令修改:ALTER SYSTEM 命令允许在不重启 PostgreSQL 服务的情况下修改配置参数,并且这些修改是永久性的。示例语法:
ALTER SYSTEM SET parameter_name TO value; #语法 ALTER SYSTEM SET maintenance_work_mem TO '100MB'; #示例
区别总结:
- SET 命令是临时的,只在当前会话中有效,适合快速调整和测试参数。
- 直接修改 postgresql.conf 文件是永久性的,但需要重启服务或重新加载配置才能生效。
- ALTER SYSTEM 命令也是永久性的,且无需重启即可生效,适合于不想中断服务的生产环境中进行配置调整。
数据库参数修改:
对于数据库参数,有些修改了之后需要重启数据库才能生效。如以下几类情况:
-
postgresql.conf 中的大多数参数:这些参数包括了数据库的核心设置,如共享内存大小、日志设置等。例如,修改
shared_buffers
、work_mem
、max_connections
等通常需要重启数据库才能使更改生效。 -
某些参数的运行时修改限制:尽管 PostgreSQL 允许通过
SET
命令在不重启数据库的情况下修改许多参数,但仍有一些参数的修改需要重启才能生效。例如,修改max_wal_size
或min_wal_size
等 WAL 相关的参数通常需要重启。 -
某些动态参数的设置:尽管 PostgreSQL 提供了一些动态参数,可以通过
SET
命令在运行时修改,但并非所有参数都支持动态修改。需要特别注意的是,即使参数可以通过SET
命令修改,但在某些情况下,修改可能会被延迟或需要在将来的某个时间点才能完全生效,这通常取决于具体的参数和数据库当前的工作状态。
有些参数的永久修改需要重启服务器才能生效,对此可以查看pg_settings视图。
postgres=# \d+ pg_settings
View "pg_catalog.pg_settings"
Column | Type | Collation | Nullable | Default | Storage | Description
-----------------+---------+-----------+----------+---------+----------+-------------
name | text | | | | extended |
setting | text | | | | extended |
unit | text | | | | extended |
category | text | | | | extended |
short_desc | text | | | | extended |
extra_desc | text | | | | extended |
context | text | | | | extended |
vartype | text | | | | extended |
source | text | | | | extended |
min_val | text | | | | extended |
max_val | text | | | | extended |
enumvals | text[] | | | | extended |
boot_val | text | | | | extended |
reset_val | text | | | | extended |
sourcefile | text | | | | extended |
sourceline | integer | | | | plain |
pending_restart | boolean | | | | plain |
查看pending_restart
字段的值,如果为true则是需要重启。
1.资源消耗参数
1.1. 内存相关参数
-
shared_buffers
(integer
)-
描述:PostgreSQL使用的共享内存缓冲区的大小,用于缓存数据。
-
默认值:通常为现代系统上设置为系统总内存的25%左右(但不要超过40%)。为了能把对写大量新的或改变的数据的处理分布在一个较长的时间段内,
shared_buffers
更大的设置通常要求对max_wal_size
也做相应增加。修改shared_buffers
后,需要重启数据库才能应用新的内存配置,以确保新的缓存设置生效。 -
示例值:
shared_buffers = 1GB
, 查询设置的值可以用 show shared_buffers 命令查看。 -
监控和调整:使用工具如
pg_stat_activity
、pg_stat_database
,以及操作系统的监控工具(如top
、htop
)来观察内存使用情况。
查看缓冲区命中率(cache hit ratio),理想情况下应该在 99% 以上。可以通过以下查询查看:SELECT sum(blks_hit) / (sum(blks_hit) + sum(blks_read)) AS cache_hit_ratio FROM pg_stat_database;
如果发现缓冲区命中率较低或系统内存使用率不均衡,考虑调整
shared_buffers
并再次测试。
-
-
work_mem
(integer
)- 描述:用于设置内部排序操作和 Hash 表在开始写入临时磁盘文件之前可以使用的内存大小。
- 默认值:4MB,但可以根据工作负载和可用内存进行调整。修改后需要重启数据库。修改
work_mem
后,新的内存设置会立即应用于接下来的查询,而无需重启数据库。 - 作用:
work_mem
参数决定了 PostgreSQL 在执行需要排序或哈希操作的查询时,为每个操作分配的内存量。所有多个并行时总内存会是work_mem
的数倍。- 合适的
work_mem
值可以确保这些操作在内存中完成,避免与磁盘进行频繁的交换(swap),从而提高查询性能。
- 取值建议:
- 对于串行无并发的复杂查询场景(平均每个查询有5-10个关联操作),建议将 work_mem 设置为系统总内存的 50% 除以 10。例如,如果系统有 8GB 内存,则 work_mem 可以设置为 400MB。
- 对于串行无并发的简单查询场景(平均每个查询有2-5个关联操作),建议将 work_mem 设置为系统总内存的 50% 除以 5。
- 对于并发场景,建议将
work_mem
设置为串行场景下的work_mem
值除以物理并发数。
- 示例值:
work_mem = 64MB
通常是一个相对较小的值,以避免过度使用内存
-
max_prepared_transactions
(integer
)- 描述:设置可以同时处于“准备”状态的最大事务数。将此参数设置为零(默认值)将禁用 prepared-transaction 功能。此参数只能在服务器启动时设置。
- 说明:如果您不打算使用已准备的事务,则应将此参数设置为零,以防止意外创建已准备的事务。如果您使用的是已准备好的事务,您可能希望max_prepared_transactions至少与max_connections一样大,以便每个会话都可以有一个准备好的事务挂起。
-
hash_mem_multiplier
(floating point
)- 描述:用于计算基于哈希的操作可以使用的最大内存量。 最终限制通过将
work_mem
乘以hash_mem_multiplier
来决定。 默认值为 1.0,这使得基于hash的操作与基于排序的操作一样,都取决于简单的work_mem
最大值。 - 推荐值:在查询操作经常发生溢出的环境中,请考虑增加内存压力,尤其是当简单地增加内存压力时(内存压力通常表现为间歇性内存不足错误)。默认设置 2.0 通常适用于混合工作负载。2.0 - 8.0 或更高范围内的更高设置在已增加到 40MB 或更大的环境中可能有效
- 描述:用于计算基于哈希的操作可以使用的最大内存量。 最终限制通过将
-
maintenance_work_mem
(integer
)- 描述:用于
VACUUM
、ANALYZE
、CREATE INDEX
等维护操作能使用的最大内存量。 - 默认值:64MB。
- 示例值:
maintenance_work_mem = 512MB
- 注意:对于死亡元组标识的集合,
VACUUM
最多只能使用1GB
的内存。当 autovacuum 运行时,最多可以分配autovacuum_max_workers
次此内存,因此请注意不要将默认值设置得太高。通过单独设置autovacuum_work_mem
来控制这一点可能很有用。
- 描述:用于
-
autovacuum_work_mem
(integer
)- 描述:指定每个自动清理工作者进程能使用的最大内存量。 如果指定值时没有单位,则以千字节为单位。
- 默认值:-1 表示转而使用
maintenance_work_mem
的值。 - 注意:对于死亡元组标识的集合,
autovacuum
最大只能使用1GB
内存,所以设置autovacuum_work_mem
到一个更高的值,对于autovacuum
在扫描表时所能收集的死亡元组数量是无效的。
-
huge_pages
(enum
)- 描述:控制是否为主共享内存区域请求巨型页。
- 默认值:try。如果
huge_pages
被设置为try
,则服务器将尝试请求巨型页,但是如果失败会退回到默认的方式。如果为on
,请求巨型页失败将使得服务器无法启动。如果为off
,则不会请求巨型页。 - 注意:目前,此设置仅在 Linux 和 Windows 上受支持。当设置为
try
时,该设置在其他系统上将被忽略。在 Linux 上,仅当shared_memory_type
设置为mmap
(默认值)时才受支持。巨型页面的使用会导致更小的页面表以及花费在内存管理上的 CPU 时间更少,从而提高性能
-
huge_page_size
(integer
)- 描述:控制巨型页的大小,当他们通过huge_pages启用大页面时。 默认为零 (
0
)。 当设置为0
时,将使用系统默认的巨型页大小。 这个参数只能在服务器启动时设置。 - 默认值:0。目前仅在 Linux 上支持非默认设置。
- 描述:控制巨型页的大小,当他们通过huge_pages启用大页面时。 默认为零 (
-
shared_memory_type
(enum
)- 描述:指定服务器应用于主共享内存区域的共享内存实现,包括 PostgreSQL 的共享缓冲区和其他共享数据。 可能的值为
mmap
(对使用mmap
分配的匿名共享内存),sysv
(通过shmget
分配的系统V 共享内存),和windows
(Windows共享内存)。 - 注意:
sysv
选项不是任何平台的默认选项,通常不建议使用,因为它通常需要非默认的内核设置来允许大量的地址分配
- 描述:指定服务器应用于主共享内存区域的共享内存实现,包括 PostgreSQL 的共享缓冲区和其他共享数据。 可能的值为
-
dynamic_shared_memory_type
(enum
)- 描述:用于指定PostgreSQL使用的动态共享内存(Dynamic Shared Memory, DSM)的实现类型。
- 默认值:
posix
(适用于大多数类Unix系统(如Linux和BSD)) - 可选值:
sysv、windows、mmap
-
min_dynamic_shared_memory
(integer
)- 描述:指定在服务器启动时将要分配给并行查询使用的内存容量。 当此内存区域不够用或被并发查询耗尽时,新的并行查询尝试使用
dynamic_shared_memory_type
配置的方法从操作系统临时分配额外的共享内存,由于内存管理开销该方法可能慢一些。 - 默认值: 默认值是
0
(无)。
- 描述:指定在服务器启动时将要分配给并行查询使用的内存容量。 当此内存区域不够用或被并发查询耗尽时,新的并行查询尝试使用
-
temp_buffers
(integer
)- 描述:为每个数据库会话设置用于临时缓冲区的最大内存.这些是仅用于访问临时表的会话本地缓冲。
- 默认值:8MB。通常是一个相对较小的值。更改
temp_buffers
后,新的缓冲区设置会立即应用于会话的临时操作,而无需重启数据库。 - 推荐设置
- 轻度使用:如果你的应用程序很少使用临时表,默认值可能已经足够。
- 频繁使用:如果你的应用程序经常使用临时表并且涉及大量数据处理,可以考虑增加
temp_buffers
的值。例如,调整到 32MB 或 64MB。
-
logical_decoding_work_mem
(integer
)- 描述:指定逻辑解码要使用的最大内存量,在将某些解码的更改写入本地磁盘之前。 这将限制逻辑流复制连接使用的内存量。它默认为 64 兆字节(
64MB
)。 - 注意:由于每个复制连接仅使用此大小的单个缓冲区,并且安装通常不会同时具有多个此类连接(受
max_wal_senders
的限制),因此将此值设置得明显高于work_mem
是安全的,从而减少写入磁盘的解码更改数量。
- 描述:指定逻辑解码要使用的最大内存量,在将某些解码的更改写入本地磁盘之前。 这将限制逻辑流复制连接使用的内存量。它默认为 64 兆字节(
-
max_stack_depth
(integer
)-
描述:指定服务器执行堆栈的最大安全深度。此参数的理想设置是内核强制执行的实际堆栈大小限制(由或本地等效设置),减去一兆字节左右的安全裕度。
-
默认值:2MB。保守来说很小,不太可能有崩溃的风险。但是,它可能太小而无法执行复杂的功能。
-
注意:在设置
max_stack_depth
时,还需要确认系统的堆栈大小限制。你可以使用ulimit
命令来查看和调整。确保系统级的堆栈大小足够大以支持你在max_stack_depth
中配置的值ulimit -s # 查看当前堆栈大小 ulimit -s unlimited # 设置堆栈大小为无限制
-
1.2 磁盘
temp_file_limit
(integer
)- 描述:指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量
- 默认值:-1 (意味着没有限制)。只有超级用户和具有适当
SET
权限的用户才能更改此设置。
1.3 内核资源使用
max_files_per_process
(integer
)- 描述:每个服务器子进程允许同时打开的最大文件数目。默认是 1000 个文件。
- 注意:如果很多进程都尝试打开很多文件,内核将允许独立进程打开比个系统真正可以支持的数目大得多得文件数。如果你发现自己看到了“Too many open files”这样的失败,可尝试减小这个设置。这个参数只能在服务器启动时设置。
1.4 基于代价的清理延迟
在VACUUM
和ANALYZE
命令的执行过程中,系统维持着一个内部计数器来跟踪各种被执行的I/O操作的估算开销。当累计的代价达到一个限制(由vacuum_cost_limit
指定),执行这些操作的进程将按照vacuum_cost_delay
所指定的休眠一小段时间。然后它将重置计数器并继续执行。
vacuum_cost_delay
(floating point
)- 描述:当超出开销限制时进程将要休眠的时间量。如果指定值时没有单位,则以毫秒为单位。
- 默认值:默认值为0,这将禁用基于代价的清理延迟特性。正值将启用基于代价的清理。
- 注意:在使用基于代价的清理时,
vacuum_cost_delay
的合适值通常很小,也许是小于1毫秒。
vacuum_cost_page_hit
(integer
)- 描述:清理一个在共享缓存中找到的缓冲区的估计代价。它表示锁住缓冲池、查找共享哈希表 和扫描页内容的代价。它表示读取已经在共享缓冲区(shared buffers)中的页面(page)的代价,而不需要从磁盘中读取。
- 默认值:1。
vacuum_cost_page_miss
(integer
)- 描述:清理一个必须从磁盘上读取的缓冲区的代价。 它表示锁住缓冲池、查找共享哈希表、从磁盘读取需要的块以及扫描其内容的代价。这个参数表示当 VACUUM 操作需要读取的页面不在共享缓冲区(shared buffers)中,因此需要从磁盘中读入时的代价。
- 默认值:2。
- 设置考量:
- 如果系统 I/O 性能较好(如使用 SSD),可以考虑适当降低
vacuum_cost_page_miss
的值,以减少 VACUUM 操作对磁盘 I/O 的依赖,提高操作效率。 - 如果系统 I/O 性能较差或磁盘负载较高,可以考虑适当增加
vacuum_cost_page_miss
的值,以降低 VACUUM 操作对磁盘 I/O 的影响,避免过度消耗系统资源。
- 如果系统 I/O 性能较好(如使用 SSD),可以考虑适当降低
vacuum_cost_page_dirty
(integer
)- 描述:当清理修改一个之前干净的块时需要花费的估计代价。它表示再次把脏块刷出到磁盘所需要的额外I/O。
它表示当 VACUUM 操作在某个页面中发现不活动元组(dead tuples)并需要修改该页面(即将其标记为“dirty”,意味着需要额外的 I/O 操作来将脏块写回磁盘)时的代价。 - 默认值:20 。
vacuum_cost_page_dirty
定义了 VACUUM 操作中,当需要修改(或“脏化”)一个页面以清理不活动元组时的“成本”。由于这种修改通常需要额外的磁盘 I/O 操作来将脏块写回磁盘,因此其成本通常设置得比vacuum_cost_page_hit
和vacuum_cost_page_miss
高 - 调整建议:
- 在大多数情况下,不需要直接修改
vacuum_cost_page_dirty
的默认值。但如果你发现 VACUUM 操作在清理不活动元组时产生了过多的磁盘 I/O,或者系统 I/O 性能较差,你可能需要调整这个参数。 - 增加
vacuum_cost_page_dirty
的值可以降低 VACUUM 操作清理不活动元组时的“积极性”,从而减少磁盘 I/O。但请注意,这可能会使数据库中的不活动元组积累得更多,从而影响数据库的性能。 - 减少
vacuum_cost_page_dirty
的值可以增加 VACUUM 操作清理不活动元组的“积极性”,从而减少不活动元组的积累。但请注意,这可能会增加磁盘 I/O 的负载,尤其是在系统 I/O 性能较差的情况下。
- 在大多数情况下,不需要直接修改
- 描述:当清理修改一个之前干净的块时需要花费的估计代价。它表示再次把脏块刷出到磁盘所需要的额外I/O。
vacuum_cost_limit
(integer
)- 描述:将导致清理进程休眠的累计代价。
- 默认值:200。
- 影响:通过调整此参数,可以控制
VACUUM
的速度和对系统性能的影响。较低的值可以减少对其他数据库操作的干扰,而较高的值可以加速VACUUM
进程,但可能会影响系统的其他操作。使用SET命令设置时会在当前会话中生效。
1.5 后台写入器
有一个独立的服务器进程,叫做后台写入器,它的功能就是发出写“脏”(新的或修改过的)共享缓冲区的命令。 当干净的共享缓存数量出现不足时,后台写入器写入一些脏缓存到文件系统,并标记为干净。 不过,后台写入器确实会增加 I/O 的总负荷,因为虽然在每个检查点间隔中一个重复弄脏的页面可能只会写出一次,但在同一个间隔中后台写入器可能会把它写出好几次。
bgwriter_delay
(integer
)- 描述:此参数定义了后台写入器在两次后台写入操作之间的延迟时间。较短的延迟值可能导致更多的I/O操作,但可以减少脏数据在内存中的停留时间。
- 默认值:通常为
200ms
。此参数只能在postgresql.conf
文件中或在服务器命令行上设置。 - 示例:
bgwriter_delay = 10ms
表示后台写入器将在每次写入操作后等待10毫秒。在许多系统上,休眠延迟的有效分辨率为 10 毫秒;将bgwriter_delay
设置为不是 10 的倍数的值可能会产生与将其设置为下一个更高的 10 的倍数相同的结果。
bgwriter_lru_maxpages
(integer
)- 描述:此参数定义了每个轮次中后台写入器可以写出的最大缓冲区页面数量。
- 默认值:通常为
100
。此参数只能在postgresql.conf
文件中或在服务器命令行上设置。 - 示例:
bgwriter_lru_maxpages = 200
表示每个轮次中,后台写入器可以写出最多200个脏缓冲区。
bgwriter_lru_multiplier
(floating point
)- 描述:用于控制后台写入器(BgWriter)在每次迭代中写入磁盘的脏数据块量。这个值是一个乘法因子,用于基于最近几轮中服务器进程需要的新缓存页的数量的预估值,来决定每轮中写出的脏页的数量
- 默认值:通常为
2.0
。此参数只能在postgresql.conf
文件中或在服务器命令行上设置。 - 协同:
bgwriter_lru_multiplier
的值需要与bgwriter_lru_maxpages
协同设置。bgwriter_lru_maxpages
定义了每次后台写入器迭代时写出的最大页面数量,而bgwriter_lru_multiplier
则决定了在这些页面中应该有多少是脏页。 - 示例:
bgwriter_lru_multiplier = 1.5
表示使用较低的乘数来估算下一轮次中将会需要的缓冲区数目
bgwriter_flush_after
(integer
)- 描述:每当后台编写器写入的数据量超过此量时,请尝试强制操作系统向底层存储发出这些写入。这样做将限制内核页面缓存中的脏数据量,从而减少在检查点结束时发出 an 或操作系统在后台以更大批量写回数据时停滞的可能性。通常这将导致事务延迟大大降低,但在某些情况下,尤其是对于大于
shared_buffers
但小于操作系统页面缓存的工作负载,性能可能会下降。此设置可能对某些平台没有影响。如果指定此值时没有单位,则将其视为块,即字节,通常为 8kB。 - 默认值:512kB。
- 描述:每当后台编写器写入的数据量超过此量时,请尝试强制操作系统向底层存储发出这些写入。这样做将限制内核页面缓存中的脏数据量,从而减少在检查点结束时发出 an 或操作系统在后台以更大批量写回数据时停滞的可能性。通常这将导致事务延迟大大降低,但在某些情况下,尤其是对于大于
1.6. 异步行为
-
backend_flush_after
(integer
)-
描述:当单个后端写入数据的量超过这个数量时,尝试强制操作系统发送这些写入到底层存储。
-
默认值:0(表示禁用此功能)单位: KB 。初步可以设置为设备吞吐量的10-20%,例如,如果你的存储设备每秒可以处理100MB的数据,可以将
backend_flush_after
设置为10MB(10240KB)。 -
硬件配置:
- 磁盘类型:如果使用SSD,可能希望设置一个较高的值,因为SSD的写入延迟较低,随机写入性能较好;而对于HDD,可能需要较低的值以避免过多的数据积累导致突发的刷盘操作。
- 内存大小:系统内存较大时,可以设置一个较高的值,因为可以缓存更多的数据;内存较小时需要更频繁地刷盘以释放内存。
-
调整:
-
使用PostgreSQL自带的监控工具如
pg_stat_bgwriter
查看后台写入统计信息。 -
观察系统的I/O性能和数据库延迟,逐步调整
backend_flush_after
值,直到找到最佳平衡点。
-
-
-
effective_io_concurrency
(integer
)- 描述:设置PostgreSQL可以同时被执行的并发磁盘 I/O 操作的数量。调高这个值,可以增加任何单个PostgreSQL会话试图并行发起的 I/O 操作的数目。
- 默认值:在受支持的系统上,默认值为 1,否则为 0。允许的范围是 1 到 1000,或 0 表示禁用异步 I/O 请求。当前这个设置仅影响位图堆扫描。
- 调整依据:
- 存储设备类型:
- SSD(固态硬盘):SSD的随机读写性能远优于传统HDD,因此可以考虑设置较高的
effective_io_concurrency
值。 - HDD(机械硬盘):对于HDD,由于随机读写性能较差,设置过高可能反而降低性能,所以应设置较低的值。
- SSD(固态硬盘):SSD的随机读写性能远优于传统HDD,因此可以考虑设置较高的
- 存储子系统架构:
- RAID阵列:在RAID 0、RAID 10等配置下,由于并行I/O性能提升,可以设置一个较高的值。
- SAN/NAS:网络存储设备的I/O性能取决于网络和存储设备的整体能力,需要根据具体情况调整。
- 工作负载特征:
- I/O密集型工作负载:对于大量随机读写操作的工作负载,提高
effective_io_concurrency
有助于改善性能。 - CPU密集型工作负载:主要消耗CPU资源的任务可能对该参数敏感度较低。
- I/O密集型工作负载:对于大量随机读写操作的工作负载,提高
- 系统内存大小:
- 较大的系统内存可以更好地缓存数据,减少实际I/O操作次数,因此可以稍微提高
effective_io_concurrency
值以利用系统的并行I/O能力。
- 较大的系统内存可以更好地缓存数据,减少实际I/O操作次数,因此可以稍微提高
- 存储设备类型:
-
maintenance_io_concurrency
(integer
)- **描述**:与 effective_io_concurrency类似,但用于代表许多客户端会话完成的维护工作。
- 默认值:在受支持的系统上,默认值为 10,否则为 0。通过设置同名的 tablespace 参数,可以覆盖特定表空间中的表的此值
-
max_worker_processes
(integer
)- 描述:设置系统能够支持的后台进程的最大数量。这个参数只能在服务器启动时设置。
- 默认值:默认值为 8。
- 注意:运行一个后备服务器时,你必须把这个参数设置为等于或者高于主控服务器上的值。 否则,后备服务器上可能不会允许查询.
- 调整建议:如果服务器有足够的CPU和内存资源,并且并发需求较高,可以考虑将
max_worker_processes
设置为CPU核心数的50%到80%之间(取决于具体的工作负载和其他系统进程的需求
-
max_parallel_workers_per_gather
(integer
)-
描述:设置单个节点或节点可以启动的最大工作线程数。并行工作线程取自
max_worker_processes
建立的流程池,受max_parallel_workers
限制。请注意,请求的工作线程数在运行时实际上可能不可用。如果发生这种情况,该计划的运行工作人员将少于预期,这可能效率低下。 -
默认值:默认值为 2。将此值设置为 0 将禁用并行查询执行。
-
注意:与非并行查询相比,并行查询消耗的资源可能要多得多,因为每个工作进程都是一个完全独立的进程,其对系统的影响与附加用户会话大致相同。在为此设置选择值时,以及在配置控制资源利用率的其他设置(如
work_mem
)时,应考虑到这一点。诸如此类的资源限制单独应用于每个工作人员,这意味着所有流程的总利用率可能比任何单个流程的总利用率高得多。例如,使用 4 个工作线程的并行查询使用的 CPU 时间、内存、I/O 带宽等可能与根本不使用工作线程的查询相比最多 5 倍。 -
服务器硬件配置:
- CPU 核心数: 通常建议
max_parallel_workers_per_gather
值不要超过 CPU 总核数的一半,以避免 CPU 资源过度竞争。 - 内存大小: 并行工作进程会消耗额外内存,因此内存充足时可以增加该值,但要确保不会导致内存不足。
- 工作负载特征:
- 并行查询比例: 如果系统中并发查询较多,并且多数查询都能从并行执行中受益,可以适当增加该值。
- 查询复杂度: 对于复杂的大查询,增加并行工作进程可以显著缩短执行时间,但对于简单查询,可能收益不明显且增加开销。
- 当前系统负载:
- 根据系统当前负载情况调整。如果系统已经处于高负载状态,可能需要降低并行度以平衡资源分配。
- 并行度限制:
- max_parallel_workers: 控制全局范围内所有并行工作进程的数量,
max_parallel_workers_per_gather
的值应小于或等于max_parallel_workers
的值。 - max_worker_processes: 系统级别的后台工作进程总数,也影响并行工作进程的可用性。
- max_parallel_workers: 控制全局范围内所有并行工作进程的数量,
- CPU 核心数: 通常建议
-
-
max_parallel_maintenance_workers
(integer
)- 描述:设置可由单个实用程序命令启动的最大并行工作线程数。目前,支持使用并行工作线程的并行实用程序命令仅在构建 B 树索引时使用,并且没有选项。并行工作线程取自
max_worker_processes
建立的流程池,受max_parallel_workers
限制。请注意,请求的工作线程数在运行时实际上可能不可用。如果发生这种情况,公共程序操作的运行工作线程将少于预期。 - 默认值:默认值为 2。将此值设置为 0 将禁用实用程序命令对并行工作线程的使用。
用于控制在执行维护任务(如CREATE INDEX
、VACUUM
和REINDEX
)时可以使用的最大并行工作进程数
- 描述:设置可由单个实用程序命令启动的最大并行工作线程数。目前,支持使用并行工作线程的并行实用程序命令仅在构建 B 树索引时使用,并且没有选项。并行工作线程取自
-
max_parallel_workers
(integer
)- 描述:设置系统为并行操作所支持的工作者的最大数量。
- 默认值:默认值为8。 在增加或者减小这个值时,也要考虑对
max_parallel_maintenance_workers
以及max_parallel_workers_per_gather
进行调整。 - 注意:这个值设置得大于
max_worker_processes
将不会产生效果,因为并行工作者进程都是从max_worker_processes
所建立的工作者进程池中取出来的。
-
parallel_leader_participation
(boolean
)- 描述:许领导进程在 和 节点下执行查询计划,而不是等待工作进程。
- 默认值:默认值为
on
。设置此值可降低工作进程被阻塞的可能性,因为领导者读取元组的速度不够快,但需要领导者进程等待工作进程启动,然后才能生成第一个元组。领导者在多大程度上可以帮助或阻碍绩效取决于计划类型、工作人员数量和查询持续时间。
-
old_snapshot_threshold
(integer
)- 描述:设置在使用快照时,一个快照可以被使用而没有发生“snapshot too old” 错误的风险的最小时间。超过此阈值时间的死数据将允许被清除。 这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。
- 默认值:
-1
(默认值) 禁用此功能,实际上将快照的时限设置为无穷大。此参数只能在服务器启动时设置。 - 注意:此设置不会尝试保证在任何特定情况下都会生成错误。事实上,如果可以从(例如)已实现结果集的游标生成正确的结果,即使引用的表中的基础行已被清除,也不会生成错误。某些表无法安全地提前清除,因此不会受到此设置的影响,例如系统目录。对于此类表,此设置既不会减少膨胀,也不会在扫描时产生 “快照太旧” 错误的可能性。
2.WAL日志参数
wal配置对性能影响:30.5. WAL配置 (postgres.cn)
2.1 wal设置
-
wal_level
(enum
)- 描述:确定写入WAL的信息量,影响复制和恢复能力。
- 可选值:
minimal
:只记录足够用于崩溃恢复的信息。replica
:记录足够的信息以支持WAL归档和流复制。logical
:记录足够的信息以支持逻辑解码,这是比replica
更详细的日志级别。
- 默认值:
replica
(对于大多数用途足够)。修改后需要重启数据库生效。 - 注意:在 9.6 之前的版本中,这个参数也允许值
archive
和hot_standby
。现在仍然接受这些值,但是它们会被映射到replica
。
-
fsync
(boolean
)- 描述:打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出
fsync()
系统调用或者使用多种等价的方法 - 默认值:off关闭。虽然关闭
fsync
常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重建整个数据库时才建议关闭fsync
。 - 注意:为非关键事务关闭 synchronous_commit 可以提供关闭
fsync
的大部分潜在性能优势,而没有数据损坏的伴随风险。fsync
只能在postgresql.conf
文件或服务器命令行中设置。如果您关闭此参数,还要考虑关闭full_page_writes
。
- 描述:打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出
-
synchronous_commit
(enum
)- 描述:指定数据库服务器返回“success”指示给客户端之前,必须要完成多少WAL处理。 合法的值为
remote_apply
,on
(默认值),remote_write
,local
, 和off
。 - 值说明:如果
synchronous_standby_names
为空,则唯一有意义的设置为on
和off
;remote_apply
,remote_write
和local
都提供与on
相同的本地同步级别。 所有非off
模式的本地行为都是等待WAL的本地刷新到磁盘。 在off
模式,无需等待,因此在向客户端报告成功和以后保证事务安全防止服务器崩溃之间可能会出现延迟。
-remote_apply
:提交将等待,直到来自当前同步备用服务器的答复显示他们已收到事务的提交记录并应用了它,以便它变得对备用服务器上的查询可见,并写入备用服务器上的持久存储。on
:提交将等待,直到来自于当前同步的后备服务器的回复显示它们已经收到了事务的提交记录并将其刷入了磁盘。 这保证事务将不会被丢失,除非主服务器和所有同步后备都遭受到了数据库存储损坏的问题。remote_write
:提交将等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经把该记录写到它们的文件系统local
:当事务提交时,写入本地磁盘即可,不用关心备机的情况。off
:当数据库事务提交时不需要等待本地WAL buffer写入WAL日志,立刻向客户端返回成功。
- 描述:指定数据库服务器返回“success”指示给客户端之前,必须要完成多少WAL处理。 合法的值为
-
wal_sync_method
(enum
)- 描述:用来向强制 WAL 更新到磁盘的方法。如果
fsync
是关闭的,那么这个设置就不相关,因为 WAL 文件更新将根本不会被强制。 - 可选值:
open_datasync
(用open()
选项O_DSYNC
写 WAL 文件)fdatasync
(在每次提交时调用fdatasync()
)fsync
(在每次提交时调用fsync()
)fsync_writethrough
(在每次提交时调用fsync()
,强制任何磁盘写高速缓存的直通写)open_sync
(用open()
选项O_SYNC
写 WAL 文件)
- 描述:用来向强制 WAL 更新到磁盘的方法。如果
-
full_page_writes
(boolean
)- 描述:启用此参数后,PostgreSQL 服务器会在检查点后首次修改该页面时将每个磁盘页面的全部内容写入 WAL。这是必需的,因为在操作系统崩溃期间正在进行的页面写入可能仅部分完成,从而导致磁盘上页面包含新旧数据的混合。通常存储在 WAL 中的行级更改数据不足以在崩溃后恢复期间完全还原此类页面。存储整页图像可以保证页面可以正确还原,但代价是增加了必须写入 WAL 的数据量。(由于 WAL 重播始终从检查点开始,因此在检查点之后对每个页面进行第一次更改时执行此操作就足够了。因此,降低整页写入成本的一种方法是增加检查点间隔参数。
- 默认值:on。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 注意:关闭此参数可加快正常操作速度,但可能会导致系统故障后不可恢复的数据损坏或静默数据损坏。风险类似于关闭
fsync
,但较小,并且应仅根据为该参数建议的相同情况将其关闭。关闭此参数不会影响将 WAL 存档用于时间点恢复 (PITR)。
-
wal_log_hints
(boolean
)- 描述:当此参数为on 时,PostgreSQL 服务器会在检查点后对该页面进行第一次修改期间将每个磁盘页面的全部内容写入 WAL,即使对于所谓的提示位的非关键修改也是如此
- 注意:如果启用了数据校验和,则提示位更新始终记录 WAL,并忽略此设置。您可以使用此设置来测试如果数据库启用了数据校验和,将发生多少额外的 WAL 日志记录。
- 默认值:off。此参数只能在服务器启动时设置。
-
wal_compression
(enum
)-
描述:此参数允许使用指定的压缩方法压缩 WAL。启用后,PostgreSQL 服务器会在基础备份中或基础备份期间压缩写入 WAL
full_page_writes
整页映像。压缩的页面图像将在 WAL 重播期间解压缩。 -
注意:不同的编译方式支持的方法不一样.改变
wal_compression
设置需要平衡磁盘 I/O 和 CPU 资源之间的关系。 -
适用场景:
-
高写入负载系统:在写入负载高且磁盘 I/O 成为瓶颈的系统中,启用
wal_compression
可以有效减轻磁盘压力。存储资源有限:在存储资源有限的环境中,启用
wal_compression
可以节省存储空间。
-
-
默认值:
off
。
-
-
wal_init_zero
(enum
)-
描述:
默认值on
,此选项将导致新的 WAL 文件填充为零。在某些文件系统上,这可确保在我们需要写入 WAL 记录之前分配空间。但是,写入时复制 (COW) 文件系统可能无法从此技术中受益,因此可以选择跳过不必要的工作。如果设置为 off,则在创建文件时仅写入最后一个字节,以便其具有预期的大小。 -
设置为
on
: 在需要高安全性、避免旧数据泄漏的环境中,建议将wal_init_zero
设置为on
,以确保新的 WAL 文件不包含旧数据的残留。设置为
off
: 在追求性能、并且对旧数据残留不敏感的环境中,可以将wal_init_zero
设置为off
,以减少写入额外数据的开销。
-
-
wal_recycle
(boolean
)- 描述:如果设置为on(默认值),则此选项会通过重命名 WAL 文件来回收它们,从而避免创建新文件。在 COW 文件系统上,创建新文件系统可能会更快,因此可以选择禁用此行为。
- 默认值:on。
-
synchronous_standby_names
(string
)-
描述:指定哪些备库应被视为同步备库。这个参数接受一个或多个备库的application_name或网络地址。
-
格式:一个或多个用逗号分隔的字符串,每个字符串可以是一个备库的application_name或网络地址。
单台从可表示为 synchronous_standby_names = 'Standby1'
通常有ANY和FIRST两种设置多从的方式,如ANY num(...)表示任意num台答复,FIRST num(...)表示优先级前num的机器都答复
-
注意:当此参数被设置时,
synchronous_commit
参数的行为会受到影响,以确保在返回客户端成功之前,同步备库也提交了相应的事务
-
-
wal_writer_delay(integer)
- 描述:WAL写入器在每次刷新WAL到磁盘后的延迟时间。
- 默认值:
200ms
。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 详细解释:这个参数决定了WAL写入器在每次将WAL数据写入磁盘后的休眠时间。这有助于减少磁盘I/O操作,但也可能增加在崩溃时丢失的数据量。
-
wal_writer_flush_after
(integer
)- 描述:在WAL写入器休眠之前,允许累积的WAL数据量。
- 默认值:
1MB
。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 详细解释:这个参数与
wal_writer_delay
一起使用,决定了在WAL写入器休眠之前可以累积多少WAL数据。如果达到这个量,WAL写入器将忽略wal_writer_delay
并立即将数据写入磁盘。如果将设置为0
,则 WAL 数据将始终立即刷新。如果未指定此值的单位,则将其视为 WAL 块,即XLOG_BLCKSZ
字节,通常为 8kB。
-
wal_skip_threshold
(integer
)- 描述:当 is 和 事务在创建或重写永久关系后提交时,此设置确定如何保留新数据。如果数据小于此设置,请将其写入 WAL 日志;否则,请使用受影响文件的 FSYNC。根据存储的属性,如果此类提交会减慢并发事务的速度,则提高或降低此值可能会有所帮助。如果指定此值时不带单位,则以千字节为单位。
- 默认值:默认值为 2MB。
-
wal_buffers
(integer
)- 描述:用于还未写入磁盘的 WAL 数据的共享内存量。
- 默认值:
-1
(基于shared_buffers
的1/32,但不小于64kB)。此参数只能在服务器启动时设置。 - 详细解释:这个参数决定了WAL缓冲区的大小,用于缓存WAL数据直到它们被写入磁盘。如果设置为
-1
,则PostgreSQL将自动选择一个大小。
-
commit_delay
(integer
)- 描述:设置会在启动 WAL 刷新之前添加时间延迟。如果系统负载足够高,以至于其他事务已准备好在给定的时间间隔内提交,则允许通过单个 WAL 刷新提交更多事务,从而提高组提交吞吐量。但是,它也会将延迟增加,最高可达每次 WAL 刷新。由于如果没有其他事务准备好提交,则延迟只会被浪费,因此仅当即将启动刷新时至少有其他事务处于活动状态时,才会执行延迟。此外,如果禁用,则不会执行延迟。如果指定此值时没有单位,则以微秒为单位。
- 默认值:默认值为零(无延迟)。只有超级用户和具有适当
SET
权限的用户才能更改此设置。
-
commit_siblings
(integer
)- 描述:在执行延迟之前需要的最小并发未结事务数。值越大,在延迟间隔内,至少有一个其他事务更有可能准备好提交。
- 默认值:默认值为 5 个事务。
2.2 检查点
checkpoint_segments``checkpoint_completion_target``设为0.9,
checkpoint_timeout`为300秒,这样一般checkpoint的间隔能达到1分钟以上。
-
checkpoint_timeout
(integer
)- 描述:自动 WAL 检查点之间的最长时间。如果指定值时没有单位,则以秒为单位。
- 默认值:默认是 5 分钟(
5min
)。合理的范围在 30 秒到 1 天之间。增加这个参数的值会增加崩溃恢复所需的时间。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 注意:更改
checkpoint_timeout
后,需要等待当前检查点完成,并且等待下一个检查点定时任务触发才能应用新的间隔值。
-
checkpoint_completion_target
(floating point
)- 描述:控制第一个检查点触发之后,在第二个检查点触发之前,必须完成90%的脏数据落盘(当该次checkpoint操作落盘达到checkpoint_completion_target的比例时,即会进入休眠,等待下一次)。
- 默认值: 0.9。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 注意:此参数将把检查点分布在几乎所有可用的时间间隔上,提供公平一致的I/O负载,同时也为检查点完成开销留下了一些时间。 减少此参数是不被推荐的,因为这会导致检查点完成得更快。会造成处于在检查点和下一个计划检查点之间较少IO之后的检查点会有更高的IO比例。
-
checkpoint_flush_after
(integer
)- 描述:每当在执行检查点时写入的数据量超过此量时,请尝试强制操作系统向底层存储发出这些写入。这样做将限制内核页面缓存中的脏数据量,从而减少在检查点结束时发出 an 时或操作系统在后台以更大的批次写回数据时停滞的可能性。通常,这将导致事务延迟大大降低,但在某些情况下,尤其是对于大于
shared_buffers
但小于操作系统页面缓存的工作负载,性能可能会下降。此设置可能对某些平台没有影响。如果指定此值时没有单位,则将其视为块,即字节,通常为 8kB。 - 默认值:在 Linux 上,256kB。其他地方为0。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
- 描述:每当在执行检查点时写入的数据量超过此量时,请尝试强制操作系统向底层存储发出这些写入。这样做将限制内核页面缓存中的脏数据量,从而减少在检查点结束时发出 an 时或操作系统在后台以更大的批次写回数据时停滞的可能性。通常,这将导致事务延迟大大降低,但在某些情况下,尤其是对于大于
-
checkpoint_warning
(integer
)- 描述:由于填充WAL段文件导致的检查点之间的间隔低于这个参数表示的时间量,那么就向服务器日志写一个消息(它建议增加
max_wal_size
的值) - 默认值: 如果指定值时没有单位,则以秒为单位。默认值是 30 秒(
30s
)。零则关闭警告。如果checkpoint_timeout
低于checkpoint_warning
,则不会有警告产生。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:由于填充WAL段文件导致的检查点之间的间隔低于这个参数表示的时间量,那么就向服务器日志写一个消息(它建议增加
-
max_wal_size
(integer
)- 描述:在触发检查点之前,WAL可以增长的最大大小。
- 默认值:通常为1GB。在特殊的情况下 WAL 尺寸可能会超过
max_wal_size
。此参数只能在postgresql.conf
文件或服务器命令行中设置。尽管可以动态修改它们的值,但更改后需要等待当前 WAL 日志循环结束才能完全生效,因为 WAL 日志文件的大小不会立即调整。 - 示例值:
max_wal_size = 2GB
-
min_wal_size
(integer
)-
描述:只要 WAL 磁盘用量保持在这个设置之下,在检查点时旧的 WAL 文件总是 被回收以便未来使用,而不是直接被删除。这可以被用来确保有足够的 WAL 空间被保留来应付 WAL 使用的高峰,例如运行大型的批处理任务。
-
默认值:通常为80MB。此参数只能在
postgresql.conf
文件或服务器命令行中设置。尽管可以动态修改它们的值,但更改后需要等待当前 WAL 日志循环结束才能完全生效,因为 WAL 日志文件的大小不会立即调整。 -
示例值:
min_wal_size = 800MB
-
2.3 归档
-
archive_mode
(enum
)- 描述:
archive_mode
参数用于控制是否启用WAL归档。WAL归档是PostgreSQL中的一种备份和恢复策略,它通过将WAL文件复制到外部位置来实现。 - 可选值:
off
:关闭WAL归档。on
:启用WAL归档,但不允许在恢复模式下进行归档。always
:启用WAL归档,并允许在恢复模式下进行归档。
- 注意:
- 当启用WAL归档时,还需要确保
wal_level
参数不是MINIMAL
,因为MINIMAL
模式下不会记录所有必要的WAL信息。 archive_mode
是archive_command
和archive_library
的一个单独设置,因此可以更改archive_command
和archive_library
,而无需离开归档模式。此参数只能在服务器启动时设置。当wal_level
设置为minimal
时,无法启用archive_mode
。
- 当启用WAL归档时,还需要确保
- 描述:
-
archive_command
(string
)-
描述:
archive_command
参数用于指定在归档模式下,将WAL文件归档到指定位置的命令或脚本。这个命令或脚本负责将WAL文件从pg_wal
目录复制到外部位置。 -
配置示例:
archive_command = 'rsync -av %p user@remote_host:/path/to/archive/%f'
在这个示例中,
rsync
命令用于将WAL文件复制到远程主机的指定路径。%p
和%f
是占位符,分别表示WAL文件的路径
和文件名
。 -
注意:
- 如果
archive_command
参数被设置,或者指定的命令有错误,则可能无法真正进行WAL归档。 - WAL归档可以提高数据可靠性和容灾能力,因为即使数据库发生故障,也可以通过归档的WAL文件进行恢复。
- 如果
-
-
archive_library
(string)- 描述:用于存档已完成的 WAL 文件段的库。如果设置为空字符串(默认值),则启用通过 shell 存档,并使用
archive_command
。如果同时设置了archive_command 和 archive_library,则会引发错误。否则,将使用指定的共享库进行存档。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:用于存档已完成的 WAL 文件段的库。如果设置为空字符串(默认值),则启用通过 shell 存档,并使用
-
archive_timeout
(integer
)- 描述:指定了在没有 WAL 流量(或产生的 WAL 流量很少)的情况下,强制进行 WAL 归档的时长。
- 默认值:0(表示禁用此功能)。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 取值范围:0 到 1073741823(单位通常为秒,但如果不指定单位,则默认为秒)
- 注意:
- 如果设置
archive_timeout
的值太小,可能会导致过多的 WAL 归档操作,从而浪费存储空间。 - 推荐的
archive_timeout
设置通常是几分钟(例如 600 秒,即 10 分钟),但这取决于具体的业务需求、存储能力和系统性能。 archive_timeout
只有在archive_mode
被设置为on
或always
时才有效。
- 如果设置
2.4 恢复
适用于一般恢复的设置,影响崩溃恢复、流复制和基于归档的复制。
-
recovery_prefetch
(enum
)- 在恢复期间,是否尝试预取 WAL 中引用的但尚未在缓冲池中的块。有效值是
off
、on
和try
(默认值)。设置try
仅在操作系统提供posix_fadvise
函数时启用预取,该函数当前用于实现预取。请注意,某些操作系统提供了该函数,但它不起作用。预取即将需要的块可以减少某些工作负载在恢复期间的 I/O 等待时间。 - 默认值:try。
- 在恢复期间,是否尝试预取 WAL 中引用的但尚未在缓冲池中的块。有效值是
-
wal_decode_buffer_size
(integer
)- 描述:限制服务器在 WAL 中向前查找以查找要预取的块的距离。如果未指定单位,则此值将以字节为单位。
- 默认值:默认值为 512kB。
2.5 归档恢复
本节描述仅适用于恢复期间的设置。对于要执行的任何后续恢复,都必须重置这些设置。
“恢复”涵盖将服务器用作备用服务器或执行目标恢复。通常,备用模式用于提供高可用性和/或读取可扩展性,而目标恢复用于从数据丢失中恢复。
要在备用模式下启动服务器,请在数据目录中创建一个名为 standby.signal
的文件。服务器将进入恢复状态,并且在达到已归档 WAL 的末尾时不会停止恢复,而是会通过连接到 primary_conninfo
设置指定的发送服务器和/或使用 restore_command
获取新的 WAL 段来继续尝试恢复。
-
restore_command
(string
)-
描述:用于获取 WAL 文件系列的一个已归档段的本地 shell 命令。这个参数是归档恢复所必需的,但是对于流复制是可选的。
-
示例:
restore_command = 'cp /mnt/server/archivedir/%f "%p"' restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows
%f
会被替换为从归档中获得的文件的名字%p
会被在服务器上的复制目标路径名替换%r
会被包含上一个可用重启点的文件的名字所替换,%r
通常只被温备配置所使用- 要嵌入一个真正的
%
字符,需要写成%%
-
注意:很重要的一点是,该命令只有在成功时才返回一个为零的退出状态。一个例外是如果该命令被一个信号(不是SIGTERM,它是数据库服务器关闭的一部分)或者一个 shell 错误(例如命令未找到)终止,则恢复将会中止并且服务器将不会启动。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
-
archive_cleanup_command
(string
)-
描述:这个可选参数指定了一个 shell 命令,它将在每一个重启点被执行。
archive_cleanup_command
的目的是提供一种清除不再被后备服务器需要的旧的已归档 WAL 文件的机制。archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
-
示例:
archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
-
注意:请注意,如果多个备用服务器正在从同一存档目录还原,则需要确保在不再需要任何服务器时才删除 WAL 文件。如果命令返回非零退出状态,则将写入警告日志消息。一个例外是,如果命令被信号或 shell 错误(例如未找到命令)终止,则会引发致命错误。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
-
recovery_end_command
(string
)- 描述:这个参数指定了一个将只在恢复末尾被执行一次的 shell 命令。这个参数是可选的。
recovery_end_command
的目的是为复制或恢复之后的清除提供一种机制。,以便在复制或恢复后进行清理。任何%r
都将替换为包含最后一个有效重启点的文件的文件名。 - 注意:如果该命令返回一个非零退出状态,则一个警告日志消息将被写出并且不管怎样该数据库将继续启动。 一个例外是如果该命令被一个信号或者 shell 错误(例如命令未找到)中止,该数据库将不会继续启动。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
- 描述:这个参数指定了一个将只在恢复末尾被执行一次的 shell 命令。这个参数是可选的。
2.6 恢复目标
默认情况下,恢复将会一直恢复到 WAL 日志的末尾。下面的参数可以被用来指定一个更早的停止点。 在recovery_target
、recovery_target_lsn
、recovery_target_name
、recovery_target_time
和recovery_target_xid
中, 最多只能使用一个,如果在配置文件中使用了多个,将会产生一个错误。这个参数只能在服务器启动时设置。
-
recovery_target
='immediate
'- 描述:这个参数指定恢复应该在达到一个一致状态后尽快结束,即尽早结束。在从一个在线备份中恢复时,这意味着备份结束的那个点。
- 说明:在技术上,这是一个字符串参数,但是
'immediate'
是目前唯一允许的值。
-
recovery_target_name
(string
)- 描述:这个参数指定(
pg_create_restore_point()
所创建)的已命名的恢复点,恢复将进入该恢复点。
- 描述:这个参数指定(
-
recovery_target_time
(timestamp
)- 描述:此参数指定恢复将执行的时间戳。精确的停止点还受到
recovery_target_inclusive
得影响。此参数的值是时间戳,格式与timestamp with time zone
数据类型接受的格式相同,但不能使用时区缩写(除非 timezone_abbreviations 变量已在配置文件中提前设置)。首选样式是使用 UTC 的数字偏移量,或者可以编写一个完整时区名称,例如Europe/Helsinki
,而不是EEST
。
- 描述:此参数指定恢复将执行的时间戳。精确的停止点还受到
-
recovery_target_xid
(string
)- 描述:这个参数指定恢复将进入的事务 ID。记住虽然事务 ID 是在事务开始时顺序分配的,但是事务可能以不同的数字顺序完成。 那些在指定事务之前(也可以包括该事务)提交的事务将被恢复。确切的停止点还受
recovery_target_inclusive
的影响。
- 描述:这个参数指定恢复将进入的事务 ID。记住虽然事务 ID 是在事务开始时顺序分配的,但是事务可能以不同的数字顺序完成。 那些在指定事务之前(也可以包括该事务)提交的事务将被恢复。确切的停止点还受
-
recovery_target_lsn
(pg_lsn
)- 描述:此参数指定恢复将继续进行的预写日志位置的LSN。精确的停靠点也受
recovery_target_inclusive
的影响。 使用系统数据类型pg_lsn
解析此参数。
- 描述:此参数指定恢复将继续进行的预写日志位置的LSN。精确的停靠点也受
-
recovery_target_timeline
(string
)- 描述:指定恢复到特定时间线。该值可以是数字时间线 ID 或特殊值。该值将沿着执行基本备份时的同一时间线恢复。该值将恢复到存档中找到的最新时间线,这在备用服务器中非常有用。
- 默认值:
latest
是默认值。 - 注意:要以十六进制形式指定时间轴 ID,请在前面加上
0x
。通常,你只需要在复杂重新恢复情况下设置此参数,在该情况下,你需要返回到在时间点恢复后达到的状态。
-
recovery_target_action
(enum
)-
描述:指定服务器在达到恢复目标后应执行的操作。
默认值为 pause
,这意味着恢复将暂停。 表示恢复过程将完成,服务器将开始接受连接。最后在达到恢复目标后将停止服务器。 -
注意:该设置的预期用途是允许对数据库执行查询,以检查此恢复目标是否是恢复的最理想点。可以使用恢复暂停状态,这会导致恢复结束。如果此恢复目标不是所需的停止点,请关闭服务器,将恢复目标设置更改为以后的目标,然后重新启动以继续恢复。在任何情况下,如果配置了恢复目标,但归档恢复在达到目标之前结束,服务器将以致命错误关闭。
-
默认值:默认值为
pause
。 -
参数解释:如下
-
pause
:恢复到目标点后,数据库将暂停并等待用户手动干预。这是默认值。promote
:恢复到目标点后,数据库将自动结束恢复并进入正常运行状态。shutdown
:恢复到目标点后,数据库将关闭
-
-
适用场景:
-
时间点恢复(PITR):你可以在恢复过程中指定一个时间点、事务ID或恢复标记,并控制在恢复到该点后数据库的行为。例如,你可以指定
promote
让数据库自动结束恢复,或者指定pause
让数据库暂停以便进一步检查。延迟应用日志(delayed application):在某些流复制的场景中,你可能希望将恢复目标设定在一定的时间点之后,并在恢复到该点后采取特定的操作。
-
-
-
recovery_target_inclusive
(bool
)- 描述:指定是在指定的恢复目标 () 之后停止,还是在恢复目标 () 之前停止。在指定recovery_target_lsn、
recovery_target_time
或recovery_target_xid
时适用。此设置控制恢复中是否包括分别具有目标 WAL 位置 (LSN)、提交时间或事务 ID 的事务。 - 默认值:默认值为on。
- 描述:指定是在指定的恢复目标 () 之后停止,还是在恢复目标 () 之前停止。在指定recovery_target_lsn、
3.复制
这些设置控制内置流复制功能和内置逻辑复制功能的行为。
对于流复制,服务器将是主服务器或备用服务器。主服务器可以发送数据,而备用服务器始终是复制数据的接收器。当使用级联复制时,备用服务器也可以是发送器和接收器。参数主要适用于发送服务器和备用服务器,尽管某些参数仅在主服务器上才有意义。如果需要,可以在集群中更改设置,而不会出现问题。
对于逻辑复制,发布者(执行CREATE PUBLICATION
的服务器)将数据复制到订阅者(执行CREATE SUBSCRIPTION
的服务器)。服务器还可以同时是发布者和订阅者。请注意,以下部分将发布者称为“发送者”。
3.1 发送服务器
max_wal_senders
(integer
)- 描述: 主要用于流复制,指定了可以同时连接到主节点的最大备节点数量。每个备节点在连接到主节点时,都会占用一个 WAL sender 进程。
wal_level
必须设置为replica
或更高级别以允许来自后备服务器的连接。 - 默认值:默认值为 10。 0,表示复制被禁用;
- 注意:
- 考虑备节点数量:在设置
max_wal_senders
参数时,当运行备用服务器时,你必须将此参数设置为与主服务器上相同的或更高的值。否则,备用服务器中将不允许查询。 - 考虑主节点性能:增加
max_wal_senders
的值会增加主节点的资源消耗
- 考虑备节点数量:在设置
- 描述: 主要用于流复制,指定了可以同时连接到主节点的最大备节点数量。每个备节点在连接到主节点时,都会占用一个 WAL sender 进程。
max_replication_slots
(integer
)- 描述:指定服务器可以支持的复制槽最大数量。默认值为10。这个参数只能在服务器启动时设置。将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。此外,要允许使用复制槽,
wal_level
必须被设置为replica
或 更高。 - 默认值:默认值为10。
- 描述:指定服务器可以支持的复制槽最大数量。默认值为10。这个参数只能在服务器启动时设置。将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。此外,要允许使用复制槽,
wal_keep_size
(integer
)- 描述:指定在后备服务器需要为流复制获取日志段文件的情况下,
pg_wal
目录下所能保留的过去日志文件段的最小尺寸。 - 默认值:0,系统将会自动调整其大小。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 提问:wal_keep_size=1G,是否当后备服务器未接收的wal大小超过1G才会断开吗?如果设置了
wal_keep_size=1GB
,那么后备服务器在未接收到的 WAL 日志大小超过1GB时,可能会断开连接。这个参数的目的是确保后备服务器能够及时接收到主服务器生成的 WAL 日志,以保持数据的实时复制和恢复能力。
- 描述:指定在后备服务器需要为流复制获取日志段文件的情况下,
max_slot_wal_keep_size
(integer
)- 描述:指定允许复制槽在检查点时保留在目录中的 WAL 文件的最大大小。如果为 -1(默认值),则复制槽可以保留无限数量的 WAL 文件。否则,如果复制槽的restart_lsn落后于当前 LSN 的大小超过给定大小,则使用该槽的备用数据库可能由于删除了所需的 WAL 文件而无法继续复制。您可以在
pg_replication_slots
中查看复制槽的 WAL 可用性。 - 默认值:默认值为-1。如果未指定单位,则此值将以兆字节为单位。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
- 描述:指定允许复制槽在检查点时保留在目录中的 WAL 文件的最大大小。如果为 -1(默认值),则复制槽可以保留无限数量的 WAL 文件。否则,如果复制槽的restart_lsn落后于当前 LSN 的大小超过给定大小,则使用该槽的备用数据库可能由于删除了所需的 WAL 文件而无法继续复制。您可以在
wal_sender_timeout
(integer
)- 描述:中断那些停止活动超过这个时间量的复制连接,这对发送服务器检测一个费用服务器崩溃或网络中断有用。对于分布在多个地理位置的集群,针对每个位置使用不同的值可以提高集群管理的灵活性。对于具有低延迟网络连接的备用服务器,较小的值有助于更快地检测故障;较大的值有助于更好地判断位于远程位置且具有高延迟网络连接的备用服务器的运行状况。
- 默认值:如果指定值时没有单位,则以毫秒为单位。默认值是 60 秒。值为0将禁用超时机制。
- track_commit_timestamp (boolean)
- 描述:记录事务的提交时间。这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。 - 默认值:默认值是
off
。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:记录事务的提交时间。这个参数只能在
3.2 主服务器
-
synchronous_standby_names
(string
)-
描述:这个参数指定一个支持同步复制的后备服务器的列表。 可能会有一个或者多个活动的同步后备服务器,在这些后备服务器确认收到它们的数据之后,等待提交的事务将被允许继续下去。使用下面的语法指定备用服务器。
FIRST] num_sync ( standby_name [, ...] ) ANY num_sync ( standby_name [, ...] ) standby_name [, ...]
-
解释:其中
num_sync
是事务需要等待其回复的同步备用服务器的数量,standby_name
是备用服务器的名称。FIRST
和ANY
指定从列出的服务器中选择同步备用服务器的方法。关键字
FIRST
与num_sync
配合使用,指定基于优先级的同步复制,并使事务提交等待,直到其 WAL 记录复制到根据其优先级选择的num_sync
同步备用服务器。例如,设置FIRST 3 (s1, s2, s3, s4)
将导致每个提交等待来自备用服务器s1
、s2
、s3
和s4
中选择的三台较高优先级的备用服务器的回复。列表中较早出现的备用服务器被赋予较高的优先级,并将被视为同步。此列表中稍后出现的其他备用服务器表示潜在的同步备用服务器。如果任何当前的同步备用服务器因任何原因断开连接,它将立即被下一个最高优先级的备用服务器替换。关键字FIRST
是可选的。关键字
ANY
与num_sync
配合使用,指定基于法定的同步复制,并使事务提交等待,直到其 WAL 记录复制到 至少num_sync
个列出的备用服务器。例如,设置ANY 3 (s1, s2, s3, s4)
将导致每个提交在s1
、s2
、s3
和s4
的至少三个备用服务器回复后立即进行。FIRST
和ANY
不区分大小写。如果这些关键字用作备用服务器的名称,则其standby_name
必须用双引号引起来。第三个语法在 PostgreSQL 9.6 版之前使用,并且仍然受支持。它与第一个语法相同,
FIRST
和num_sync
等于 1。例如,FIRST 1 (s1, s2)
和s1, s2
具有相同的含义:s1
或s2
被选为同步备用服务器。特殊条目
*
匹配任何备用名称。没有机制来强制备用名称的唯一性。如果出现重复,则将其中一个匹配的备用视为优先级较高,但具体是哪一个是不确定的。
如果此处未指定同步备用名称,则不会启用同步复制,事务提交不会等待复制。这是默认配置。即使启用了同步复制,也可以通过将 synchronous_commit 参数设置为
local
或off
来配置各个事务不等待复制。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
-
vacuum_defer_cleanup_age
(integer
)- 描述:指定
VACUUM
和HOT更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。后备服务器上的hot_standby_feedback
可以作为使用这个参数的一种替代方案。 - 默认值:零个事务。
- 描述:指定
3.3 后备服务器
-
primary_conninfo
(string
)-
描述:指定备用服务器用来连接发送服务器的连接字符串。如果此字符串中未指定任何选项,则会检查相应的环境变量如果环境变量也没有设置,则使用默认值。此参数只能在
postgresql.conf
文件中或服务器命令行中设置。如果在 WAL 接收器进程运行时更改此参数,则会向该进程发出关闭信号,并预期它使用新设置重新启动(除非primary_conninfo
是一个空字符串)。如果服务器不在备用模式,则此设置无效。 -
示例:
primary_conninfo = 'host=192.168.152.134 port=5432 user=replica password=replica'
。连接字符串应指定发送服务器的主机名(或地址),以及端口号(如果它与备用服务器的默认值不同)。还要指定一个与发送服务器上具有适当权限的角色相对应的用户名。如果发送方要求密码身份验证,则还需要提供密码。可以在primary_conninfo
字符串中或备用服务器上的单独~/.pgpass
文件中提供(使用replication
作为数据库名称)。请勿在primary_conninfo
字符串中指定数据库名称
-
-
primary_slot_name
(string
) -
描述:有选择地指定通过流复制连接到发送服务器时使用一个现有的复制槽来控制上游节点上的资源移除。指定复制槽。此参数只能在
postgresql.conf
文件中或服务器命令行中设置。 -
注意:如果在 WAL 接收器进程运行时更改此参数,则该进程将发出关机信号,并预期使用新设置重新启动(除非
primary_conninfo
为空字符串)。 如果没有设置primary_conninfo
或服务器没有处于备用模式,则此设置无效。 -
hot_standby
(boolean
)- 描述:指定在恢复期间,你是否能够连接并运行查询。
- 默认值:默认值是
on
。此参数只能在服务器启动时设置。它仅在归档恢复期间或备用模式下有效。
-
max_standby_archive_delay
(integer
)- 描述:当热备用处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间, 当从 WAL 存档中读取 WAL 数据(因此不是最新的)时适用。如果指定此值时不带单位,则以毫秒为单位。
- 默认值:默认值为 30 秒。值为 -1 允许备用数据库永远等待冲突查询完成。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 注意:
max_standby_archive_delay
与查询在取消之前可以运行的最长时间不同;相反,它是在应用任何一个 WAL 段数据的过程中允许的最大总时间。因此,如果一个查询导致 WAL 段的前面部分出现重大延迟,后续的冲突查询将有更少的宽限时间。
-
max_standby_streaming_delay
(integer
)- 描述:当热备用处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间, 当通过流复制接收 WAL 数据时适用。如果指定此值时不带单位,则以毫秒为单位。
- 默认值:默认值为 30 秒。值为 -1 允许备用数据库永远等待冲突查询完成。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 注意:这与查询在取消之前可以运行的最长时间不同;相反,它是从主服务器接收 WAL 数据后允许应用 WAL 数据的最大总时间。因此,如果一个查询导致了显著的延迟,则后续冲突查询的宽限时间将大大缩短,直到备用服务器再次赶上。
-
wal_receiver_create_temp_slot
(boolean
)- 描述:指定未配置要使用的永久复制槽时,WAL 接收器进程是否应在远程实例上创建临时复制槽(使用
primary_slot_name
)。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 默认值:默认值为关闭。此参数只能在文件或服务器命令行中设置。如果在 WAL 接收器进程运行时更改此参数,则会发出该进程关闭的信号,并预期会使用新设置重新启动。
- 描述:指定未配置要使用的永久复制槽时,WAL 接收器进程是否应在远程实例上创建临时复制槽(使用
-
wal_receiver_status_interval
(integer
)-
描述:指定备用数据库上的 WAL 接收器进程的最小频率,以将有关复制进度的信息发送到主备用数据库或上游备用数据库,在主备用数据库或上游备用数据库中可以使用
pg_stat_replication
视图查看该信息。备用数据库将报告它写入的最后一个预写日志位置、它刷新到磁盘的最后一个位置以及它应用的最后一个位置。此参数的值是报表之间的最大时间量。每次写入或刷新位置更改时都会发送更新,如果设置为非零值,则按此参数指定的频率发送更新。在其他情况下,在忽略此参数的情况下发送更新;例如,当现有 WAL 的处理完成或设置为 时。因此,应用位置可能略微滞后于真实位置。如果指定此值时没有单位,则将其视为秒。 -
默认值:默认值为 10 秒。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
-
hot_standby_feedback
(boolean
)- 描述:指定热备用是否向主备用或上游备用发送有关当前在备用上执行的查询的反馈。此参数可用于消除由清理记录导致的查询取消,但对于某些工作负载,可能会导致主数据库上的数据库膨胀。反馈消息的发送频率不会超过每个 .
- 默认值:默认值为off。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 注意:如果使用级联复制,则反馈将向上游传递,直到最终到达主备用。备用不会将接收到的反馈用于除向上游传递之外的任何其他用途。此设置不会覆盖主备用上
old_snapshot_threshold
的行为;备用上的快照超过主备用的年龄阈值可能会变得无效,从而导致备用上的事务取消。这是因为old_snapshot_threshold
旨在对死行可能导致膨胀的时间提供绝对限制,否则由于备用的配置,该限制将被违反。
-
wal_receiver_timeout
(integer
)- 描述:终止超过此时间的非活动状态的复制连接。这对于接收备用服务器检测主节点崩溃或网络中断非常有用。如果指定此值时不带单位,则以毫秒为单位。
- 默认值:默认值为 60 秒。值为零将禁用超时机制。
-
wal_retrieve_retry_interval
(integer
)-
描述:指定当 WAL 数据无法从任何源(流复制、本地或 WAL 存档)获得时,备用服务器应等待多长时间,然后再尝试检索 WAL 数据。如果指定此值时不带单位,则以毫秒为单位。
-
默认值:默认值为 5 秒。
-
-
recovery_min_apply_delay
(integer
)- 描述:默认情况下,备用服务器会尽快从发送服务器还原 WAL 记录。拥有数据的延时副本可能很有用,从而提供了纠正数据丢失错误的机会。此参数允许您将恢复延迟指定的时间。例如,如果将此参数设置为
5min
,则仅当备用数据库上的系统时间至少比主数据库报告的提交时间晚五分钟时,备用数据库才会重播每个事务提交。如果指定此值时不带单位,则以毫秒为单位。- 默认值:默认值为零,不添加延迟。
- 描述:默认情况下,备用服务器会尽快从发送服务器还原 WAL 记录。拥有数据的延时副本可能很有用,从而提供了纠正数据丢失错误的机会。此参数允许您将恢复延迟指定的时间。例如,如果将此参数设置为
-
promote_trigger_file
(string
)-
描述:指定一个触发器文件,该文件的存在会结束后备机中的恢复。
-
说明:即使这个值没有被设置,你也能够使用
pg_ctl promote
或调用pg_promote()
.来提升后备机。
-
4.连接和认证相关参数
4.1 连接设置
-
listen_addresses
(string
)- 描述:PostgreSQL应该监听的IP地址。
- 默认值:默认值为
localhost
,特殊项*
对应所有可用 IP 接口。项0.0.0.0
允许监听所有 IPv4 地址并且::
允许监听所有 IPv6 地址。此参数只能在服务器启动时设置。
-
max_connections
(integer
)- 描述:决定数据库的的最大并发连接数。但是如果内核设置不支持(initdb时决定),可能会比这个 数少。这个参数只能在服务器启动时设置。在运行备用服务器时,必须将此参数设置为与主服务器相同或更高的值。否则,备用服务器中将不允许查询。
- 默认值:通常为100,但可以根据需要进行调整。调整参数后需要重启数据库才能生效。
- 示例值:
max_connections = 200
-
port
(integer
)- 描述 :服务器监听的 TCP 端口;默认是 5432 。服务器监听的所有 IP 地址都使用相同的端口号。
- 默认值:5432。此参数只能在服务器启动时设置。
-
reserved_connections
(integer
)-
描述 :确定为具有
pg_use_reserved_connections
角色权限的角色保留的连接“槽”的数量。只要空闲连接槽的数量大于superuser_reserved_connections
但小于或等于superuser_reserved_connections
和reserved_connections
之和,则仅接受超级用户和具有pg_use_reserved_connections
权限的角色的新连接。如果superuser_reserved_connections
或更少的连接槽可用,则仅接受超级用户的新连接。 -
默认值 :默认值为零个连接。该值必须小于
max_connections
减去superuser_reserved_connections
。此参数只能在服务器启动时设置。
-
-
superuser_reserved_connections
(integer
)- 描述:决定为PostgreSQL超级用户连接而保留的连接“槽”数。 同时活跃的并发连接最多max_connections个。任何时候,活跃的并发连接数最多为
max_connections
减去superuser_reserved_connections
,新连接就只能由超级用户发起了,并且不会有新的复制连接被接受。 - 默认值:默认值是 3 连接 。这个值必须小于
max_connections
。 此参数只能在服务器启动时设置。
- 描述:决定为PostgreSQL超级用户连接而保留的连接“槽”数。 同时活跃的并发连接最多max_connections个。任何时候,活跃的并发连接数最多为
-
tcp_keepalives_idle
(integer
)- 描述:规定在操作系统向客户端发送一个TCP keepalive消息后无网络活动的时间总量。 如果指定值时没有单位,则以秒为单位。
- 默认值:值0(默认值)表示选择操作系统默认值。 指定不活动多少秒之后通过 TCP 向客户端发送一个 keepalive 消息。 0 值表示使用默认值。 这个参数只有在支持
TCP_KEEPIDLE
或等效套接字选项的系统或 Windows 上才可以使用。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,这个参数被忽略并且总是读作零。 - 注意:在 Windows 上,设定值为0将设置这个参数为 2 小时,因为 Windows 不支持读取系统默认值。
-
tcp_keepalives_interval
(integer
)- 描述:规定未被客户端确认收到的TCP keepalive消息应重新传输的时间长度。 如果指定值时没有单位,则以秒为单位。
- 默认值:值0(默认值)表示选择操作系统默认值。 这个参数只有在支持
TCP_KEEPINTVL
或等效套接字选项的系统或 Windows 上才可以使用。在其他系统上,必须为零。
-
tcp_keepalives_count
(integer
)- 描述:指定服务器到客户端的连接被认为中断之前可以丢失的TCP keepalive消息的数量。
- 默认值:值0(默认值)表示选择操作系统默认值。 这个参数只有在支持
TCP_KEEPCNT
或等效套接字选项的系统上才可以使用。在其他系统上,必须为零
-
tcp_user_timeout
(integer
)- 描述:指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的时间量。 如果指定值时没有单位,则以毫秒为单位。
- 默认值:值0(默认值)表示选择操作系统默认值。 这个参数只有在支持
TCP_USER_TIMEOUT
的系统上才被支持;在其他系统上,它必须为零。
-
client_connection_check_interval
(integer
)-
描述:在运行查询时,设置检查客户端是否保持连接的可选检查的时间间隔。 这个检查通过轮询套接字来执行,并且在内核报告该连接关闭时,允许长时间运行的查询可以尽快中止。这个选项当前仅在支持非标的
POLLRDHUP
扩展到poll
系统调用的系统上有效,包括Linux。 -
默认值:如果指定的值没有单位,则以毫秒为单位。 默认值为
0
,代表禁用连接检查。 没有连接检查,服务器将只在与套接字的下一次交互时检测连接的丢失,当它等待、接收或发送数据时。
-
-
unix_socket_directories
(string
)- 描述:指定 Unix 域套接字的目录,服务器要在其上侦听来自客户端应用程序的连接。可以通过列出以逗号分隔的多个目录来创建多个套接字。条目之间的空格将被忽略;如果需要在名称中包含空格或逗号,请用双引号将目录名称括起来。空值指定不侦听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。
- 默认值:/tmp。在 Windows 上,默认值为空。此参数只能在服务器启动时设置。
- 说明:除了套接字文件本身(其名称为
.s.PGSQL.*
nnnn*
,其中nnnn
是服务器的端口号)之外,还将在每个unix_socket_directories
目录中创建一个名为.s.PGSQL.*
nnnn*.lock
的普通文件。这两个文件都不得手动删除。对于抽象命名空间中的套接字,不会创建锁定文件。
-
unix_socket_group
(string
)- 描述:设置 Unix 域套接字的所属组。(套接字的拥有者始终是启动服务器的用户。结合该参数,这可以用作 Unix 域连接的附加访问控制机制。
- 默认值:默认情况下,这是空字符串,它使用服务器用户的默认组。此参数只能在服务器启动时设置。此参数在 Windows 上不受支持。任何设置都将被忽略。此外,抽象命名空间中的套接字没有文件所有者,因此在这种情况下也会忽略此设置。
-
unix_socket_permissions
(integer
)-
描述:设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应为 chmod和 umask0系统调用所接受的格式中指定的数值模式。(若要使用惯用的八进制格式,数字必须以(零)开头。
-
默认值:默认权限为
0777
,表示任何人都可以连接。合理的替代方案是0770
(仅用户和组)和0700
(仅用户)。(请注意,对于 Unix 域套接字,只有写权限才有意义,因此设置或撤销读或执行权限没有任何意义。)此参数只能在服务器启动时设置。抽象命名空间中的套接字没有文件权限,因此在这种情况下也会忽略此设置。
-
-
client_encoding
(string
)-
描述:参数指定了客户端与服务器之间进行通信时所使用的字符编码方式。它决定了客户端发送到服务器的数据如何被解释和处理,以及服务器发送给客户端的数据如何被解码和显示。
-
作用:控制客户端与服务器之间的文本数据传输编码方式。这对于确保数据在不同语言环境或国家/地区设置下的正确显示和解释至关重要。
-
常见取值:常见取值包括
SQL_ASCII
、UTF8
(或UTF-8
)、LATIN1
等。其中:UTF8
是最常用的 Unicode 编码,支持大多数国际字符集。
-SQL_ASCII
表示无特定字符集,直接按字节传输数据,不进行编码转换。
修改后会立刻生效,不需要重启数据库。在创建数据库或连接数据库时,应确保客户端和服务器的
client_encoding
设置一致,以避免数据不一致或错误解释的问题。如果客户端的字符编码与服务器设置不一致,可能导致数据插入、更新或检索时的乱码或意外行为。
-
4.2 安全与认证
-
authentication_timeout
(integer
)-
描述:允许完成客户端认证的最长时间。如果一个客户端没有在这段时间里完成认证协议,服务器将关闭连接。 这样就避免了出问题的客户端无限制地占有一个连接。如果指定值时没有单位,则以秒为单位。
-
默认值:默认值是 1分钟(
1m
)。
-
-
password_encryption
(enum
)- 描述:当在
CREATE ROLE
或者ALTER ROLE
中指定了口令时,这个参数决定用于加密该口令的算法。 可能的值是scram-sha-256
, 可以用SCRAM-SHA-256, 和md5
加密密码,以MD5 哈希的方式存储密码。 - 默认值:默认为
scram-sha-256
。
- 描述:当在
-
krb_server_keyfile
(string
)- 描述:设置服务器的Kerberos密钥文件的位置。 默认为
FILE:/usr/local/pgsql/etc/krb5.keytab
(其中目录部分是在构建时由sysconfdir
指定的;用pg_config --sysconfdir
来决定)。 如果这个参数被设为空字符串,它将被忽略,并且系统依赖的默认值被应用。
- 描述:设置服务器的Kerberos密钥文件的位置。 默认为
-
krb_caseins_users
(boolean
)- 描述:设置是否应该以大小写不敏感的方式对待GSSAPI用户名。
- 默认值:默认值是
off
(大小写敏感)。
-
db_user_namespace
(boolean
)-
描述:这个参数启用针对每个数据库的用户名。这个参数默认是关掉的。
如果这个参数为打开,应该把用户创建成
username@dbname
的形式。当一个连接客户端传来username
时,@
和数据库名会被追加到用户名并且服务器会查找这个与数据库相关的用户名。注意在SQL环境中用含有@
的名称创建用户时,需要把用户名放在引号内。在这个参数被启用时,仍然可以创建平常的全局用户。而在客户端中指定这种用户时只需要简单地追加
@
,例如joe@
。在服务器查找该用户名之前,@
会被剥离掉。db_user_namespace
会导致客户端和服务器的用户名表达形式不同。认证检查总是会以服务器的用户名表达形式来完成,因此认证方法必须针对服务器用户名而不是客户端用户名来配置。由于md5
方法在客户端和服务器两端都使用用户名作为salt,md5
不能与db_user_namespace
同时使用。
-
-
scram_iterations
(integer
)-
描述:使用 SCRAM-SHA-256 加密密码时要执行的计算迭代次数。默认值为
4096
。较高的迭代次数可为存储的密码提供额外的暴力破解保护,但会使身份验证变慢。更改此值不会对使用 SCRAM-SHA-256 加密的现有密码产生影响,因为迭代次数在加密时是固定的。为了使用更改后的值,必须设置新密码。 -
默认值:默认值为
4096
。 -
pg_hba.conf 配置文件中的认证相关参数
TYPE DATABASE USER ADDRESS METHOD
- TYPE:可以是`local`(匹配使用Unix域套接字的连接)或`host`(匹配使用TCP/IP建立的连接)。
- DATABASE:指定数据库名,或使用
all
表示所有数据库。 - USER:指定用户名,或使用
all
表示所有用户。 - ADDRESS:指定客户端IP地址或主机名,或使用CIDR表示法指定IP地址范围。
- METHOD:指定认证方法,如
trust
、reject
、md5
、password
等。
-
4.3 SSL连接
-
ssl
(boolean
)- 描述:启用SSL连接。
- 默认值:默认值是
off
。
-
ssl_ca_file
(string
)- 描述:指定包含 SSL 服务器证书颁发机构 (CA) 的文件的名称。相对路径是相对于数据目录的。
- 默认值:默认值为空,表示未加载 CA 文件,并且不执行客户端证书验证。
-
ssl_cert_file
(string
)- 描述:指定包含 SSL 服务器证书的文件的名称。相对路径是相对于数据目录的。此参数只能在文件或服务器命令行中设置。
- 默认值:默认值为
server.crt
。
-
ssl_crl_file
(string
)- 描述:指定包含 SSL 客户端证书吊销列表 (CRL) 的文件的名称。相对路径是相对于数据目录的。此参数只能在文件或服务器命令行中设置。
- 默认值:默认值为空,表示不加载 CRL 文件(除非设置了
ssl_crl_dir
)。
-
ssl_crl_dir
(string
)- 描述:使用此设置时,将在连接时按需加载指定目录中的 CRL。可以将新的 CRL 添加到目录,并且会立即使用它们。这与
ssl_crl_file
不同,后者会导致在服务器启动时或重新加载配置时加载文件中的 CRL。两种设置可以一起使用。
- 描述:使用此设置时,将在连接时按需加载指定目录中的 CRL。可以将新的 CRL 添加到目录,并且会立即使用它们。这与
-
ssl_key_file
(string
)- 描述:指定包含 SSL 服务器私钥的文件的名称。相对路径是相对于数据目录的。此参数只能在文件或服务器命令行中设置。
- 默认值:默认值为
server.key
。
-
ssl_ciphers
(string
)-
描述:指定允许 SSL 连接使用的 SSL 密码套件的列表。有关此设置的语法和支持的值列表,请参阅 OpenSSL 包中的密码手册页。
-
参数默认值说明:
-
HIGH
使用
HIGH
组密码的密码套件(例如,AES、Camellia、3DES) -
MEDIUM
使用
MEDIUM
组密码的密码套件(例如,RC4、SEED) -
+3DES
由于
HIGH
的 OpenSSL 默认顺序将 3DES 排在 AES128 之前,因此存在问题。这是错误的,因为 3DES 提供的安全性低于 AES128,而且速度也慢得多。+3DES
将其重新排序到所有其他HIGH
和MEDIUM
密码之后。 -
!aNULL
禁用不进行身份验证的匿名密码套件。此类密码套件容易受到 MITM 攻击,因此不应使用。
可用的密码套件详细信息因 OpenSSL 版本而异。使用命令
openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'
查看当前已安装 OpenSSL 版本的实际详细信息。请注意,此列表在运行时会根据服务器密钥类型进行筛选。 -
-
-
ssl_prefer_server_ciphers
(string
)- 描述:定是否使用服务器的 SSL 密码首选项,而不是客户端的密码首选项。此参数只能在文件或服务器命令行中设置。
-
ssl_ecdh_curve
(string
)- 描述:指定要在 ECDH 密钥交换中使用的曲线的名称。它需要得到所有连接客户端的支持。它不需要与服务器的椭圆曲线键使用的曲线相同。此参数只能在文件或服务器命令行中设置。
- 默认值:为
prime256v1
。
-
ssl_min_protocol_version
(string
)- 描述:设置要使用的最低 SSL/TLS 协议版本。当前有效值为:TLSv1、TLSv1.1、TLSv1.2、TLSv1.3。旧版本的 OpenSSL 库不支持所有值;如果选择不受支持的设置,将引发错误。TLS 1.0 之前的协议版本(即 SSL 版本 2 和 3)始终处于禁用状态
- 默认值:默认值为
TLSv1.2
。
-
ssl_max_protocol_version
(string
)- 描述:设置要使用的最大 SSL/TLS 协议版本。有效值与
ssl_min_protocol_version
相同,并添加了一个空字符串,该字符串允许任何协议版本。 - 默认值:默认设置是允许任何版本。设置最大协议版本主要用于测试,或者某些组件在使用较新的协议时遇到问题。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
- 描述:设置要使用的最大 SSL/TLS 协议版本。有效值与
-
ssl_dh_params_file
(string
)- 描述:指定包含用于所谓的临时 DH 系列 SSL 密码的 Diffie-Hellman 参数的文件的名称。
- 默认值:默认值为空,在这种情况下,使用编译的默认 DH 参数。如果攻击者设法破解已知编译的 DH 参数,使用自定义 DH 参数可减少暴露。您可以使用命令创建自己的 DH 参数文件。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
ssl_passphrase_command
(string
)- 描述:设置在需要获取用于解密 SSL 文件(如私钥)的密码时要调用的外部命令。
- 默认值:默认情况下,此参数为空,表示使用内置提示机制。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
-
ssl_passphrase_command_supports_reload(string)
- 描述:此参数确定如果密钥文件需要密码,则在重新加载配置期间是否也会调用 设置的密码命令。
- 默认值:如果此参数处于关闭状态(默认值),则在重新加载期间将被忽略,并且在需要密码短语时不会重新加载 SSL 配置。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
5.查询计划参数
5.1 规划器方法配置
enable_async_append
(boolean
)- 描述:激活或禁用查询计划的关于异步感知附加计划类型的使用。
- 默认值:默认为
on
。
enable_bitmapscan
(boolean
)- 描述:允许或禁止查询规划器使用位图扫描计划类型。
- 默认值:默认值是
on
。
enable_gathermerge
(boolean
)- 描述:启用或者禁用查询规划器对收集归并计划类型的使用。
- 默认值:默认值是
on
。
enable_hashagg
(boolean
)- 描述:允许或禁用查询规划器使用哈希聚集计划类型。
- 默认值:默认值是
on
。
enable_hashjoin
(boolean
)- 描述:允许或禁止查询规划器使用哈希连接计划类型。
- 默认值:默认值是
on
。
enable_incremental_sort
(boolean
)- 描述:启用或禁用查询规划器对增量排序步骤的使用。
- 默认值:默认为
on
。
enable_indexscan
(boolean
)- 描述:允许或禁止查询规划器使用索引扫描计划类型。
- 默认值:默认值是
on
。
enable_indexonlyscan
(boolean
)- 描述:允许或禁止查询规划器使用只用索引扫描计划类型。
- 默认值:默认值是
on
。
enable_material
(boolean
)- 描述:允许或者禁止查询规划器使用物化。它不可能完全禁用物化,但是关闭这个变量将阻止规划器插入物化节点,除非为了保证正确性。
- 默认值:默认值是
on
。
enable_memoize
(boolean
)- 描述:启用或禁用查询计划器对memoize计划的使用,以便缓存在嵌套循环连接中参数化扫描的结果。 在当前参数的结果已经在缓存中时,此计划类型允许跳过对底层计划的扫描。 当新条目需要更多空间时,不太常用的查询结果可能会从缓存中去除。
- 默认值:默认值是
on
。
enable_mergejoin
(boolean
)- 描述:允许或禁止查询规划器使用归并连接计划类型。
- 默认值:默认值是
on
。
enable_nestloop
(boolean
)- 描述:允许或禁止查询规划器使用嵌套循环连接计划。它不可能完全禁止嵌套循环连接,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
- 默认值:默认值是
on
。
enable_parallel_append
(boolean
)- 描述:允许或禁止查询规划器使用并行追加计划类型。
- 默认值:默认值是
on
。
enable_parallel_hash
(boolean
)- 描述:允许或禁止查询规划器对并行哈希使用哈希连接计划类型。如果哈希连接计划也没有启用,这个参数没有效果。
- 默认值:默认值是
on
。
enable_partition_pruning
(boolean
)- 描述:允许或者禁止查询规划器从查询计划中消除一个分区表的分区。这也控制着规划器产生允许执行器在查询执行期间移除(忽略)分区的查询计划的能力。
- 默认值:默认值是
on
。
enable_partitionwise_join
(boolean
)- 描述:允许或者禁止查询规划器使用面向分区的连接,这使得分区表之间的连接以连接匹配的分区的方式来执行。 面向分区的连接当前只适用于连接条件包括所有分区键的情况,连接条件必须是相同的数据类型并且子分区集合要1对1匹配。 由于面向分区的连接规划在规划期间会使用可观的CPU时间和内存。
- 默认值:默认值为
off
。
enable_partitionwise_aggregate
(boolean
)- 描述:允许或者禁止查询规划器使用面向分区的分组或聚集,这使得在分区表上的分组或聚集可以在每个分区上分别执行。如果
GROUP BY
子句不包括分区键,只有部分聚集能够以基于每个分区的方式执行,并且finalization必须最后执行。由于面向分区的分组或聚集在规划期间会使用可观的CPU时间和内存。 - 默认值:默认值为
off
。
- 描述:允许或者禁止查询规划器使用面向分区的分组或聚集,这使得在分区表上的分组或聚集可以在每个分区上分别执行。如果
enable_seqscan
(boolean
)- 描述:允许或禁止查询规划器使用顺序扫描计划类型。它不可能完全禁止顺序扫描,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
- 默认值:默认值是
on
。
enable_sort
(boolean
)- 描述:允许或禁止查询规划器使用显式排序步骤。它不可能完全禁止显式排序,但是关闭这个变量将使得规划器尽可能优先使用其他方法。
- 默认值:默认值是
on
。
enable_tidscan
(boolean
)- 描述:允许或禁止查询规划器使用TID扫描计划类型。
- 默认值:默认值是
on
。
5.2 规划器成本常量
-
seq_page_cost
(floating point
)- 描述:设置规划器计算一次顺序磁盘页面抓取的开销。默认值是1.0。 通过设置同名的表空间参数,这个值可以重写为一个特定的表空间。 参阅ALTER TABLESPACE。 设置规划器对一系列顺序磁盘页面获取中的一次的代价估计。
- 默认值:默认值是 1.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值
-
random_page_cost
(floating point
)-
描述:设置规划器对一次非顺序获取磁盘页面的代价估计。默认值是 4.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值。
减少这个值(相对于
seq_page_cost
)将导致系统更倾向于索引扫描;提高它将让索引扫描看起来相对更昂贵。你可以一起提高或降低两个值来改变磁盘 I/O 代价相对于 CPU 代价的重要性,后者由下列参数描述。对磁盘存储的随机访问通常比顺序访问要贵不止四倍。但是,由于对磁盘的大部分随机访问(例如被索引的读取)都被假定在高速缓冲中进行,所以使用了一个较低的默认值(4.0)。默认值可以被想成把随机访问建模为比顺序访问慢 40 倍,而期望 90% 的随机读取会被缓存。
默认值:
4.0
。 -
注意:虽然允许你将random_page_cost设置的比 seq_page_cost小,但是物理上的实际情况并不受此影响。 然而当所有数据库都位于内存中时,两者设置为相等是非常合理的,因为 在此情况下,乱序抓取并不比顺序抓取开销更大。同样,在缓冲率很高的 数据库上,你应当相对于 CPU 开销同时降低这两个值,因为获取内存中 的页比通常情况下的开销小许多。 尽管系统可以是你把
random_page_cost
设置得小于seq_page_cost
,但是实际上没有意义。不过,如果数据库被整个缓存在 RAM 中,将它们设置为相等是有意义的,因为在那种情况中不按顺序访问页面是没有惩罚值的。同样,在一个高度缓存化的数据库中,你应该相对于 CPU 参数降低这两个值,因为获取一个已经在 RAM 中的页面的代价要远小于通常情况下的代价。
-
-
cpu_tuple_cost
(floating point
)- 描述:设置规划器对一次查询中处理每一行的代价估计。
- 默认值:默认值是 0.01。
-
cpu_index_tuple_cost
(floating point
)- 描述:设置规划器对一次索引扫描中处理每一个索引项的代价估计。
- 默认值:默认值是 0.005
-
cpu_operator_cost
(floating point
)- 描述:设置规划器对于一次查询中处理每个操作符或函数的代价估计。
- 默认值:默认值是 0.0025。
-
parallel_setup_cost
(floating point
)- 描述:设置规划器对启动并行工作者进程的代价估计。
- 默认值:默认是 1000。
-
parallel_tuple_cost
(floating point
)- 描述:设置规划器对于从一个并行工作者进程传递一个元组给另一个进程的代价估计。
- 默认值:默认是 0.1。
-
min_parallel_table_scan_size
(integer
)- 描述:为必须扫描的表数据量设置一个最小值,扫描的表数据量超过这一个值才会考虑使用并行扫描。 对于并行顺序扫描,被扫描的表数据量总是等于表的尺寸,但是在使用索引时,被扫描的表数据量通常会更小。 如果指定值时没有单位,则以块为单位,即
BLCKSZ
字节,通常为8kB。 - 默认值:默认值是8兆字节(
8MB
)
- 描述:为必须扫描的表数据量设置一个最小值,扫描的表数据量超过这一个值才会考虑使用并行扫描。 对于并行顺序扫描,被扫描的表数据量总是等于表的尺寸,但是在使用索引时,被扫描的表数据量通常会更小。 如果指定值时没有单位,则以块为单位,即
-
min_parallel_index_scan_size
(integer
)- 描述:为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫描。 注意并行索引扫描通常并不会触及整个索引,它是规划器认为该扫描会实际用到的相关页面的数量。 这个参数还用于决定特定的索引是否参与并行vacuum。如果指定值时没有单位,则以块为单位,即
BLCKSZ
字节,通常为8kB。 - 默认值:默认值是512千字节(
512kB
)。
- 描述:为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫描。 注意并行索引扫描通常并不会触及整个索引,它是规划器认为该扫描会实际用到的相关页面的数量。 这个参数还用于决定特定的索引是否参与并行vacuum。如果指定值时没有单位,则以块为单位,即
-
effective_cache_size
(integer
)- 描述:设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。 这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。
- 默认值:如果指定值时没有单位,则以块为单位,即
BLCKSZ
字节,通常为8kB。 默认值是 4吉字节(4GB
)。修改后需要重启数据库生效。
-
jit_above_cost
(floating point
)- 描述:设置激活JIT编译的查询代价,如果查询代价超过这个值就会激活JIT编译。执行JIT会消耗一些规划时间,但是能够加速查询执行。将这个值设置为
-1
会禁用JIT编译。 - 默认值:默认值是
100000
。
- 描述:设置激活JIT编译的查询代价,如果查询代价超过这个值就会激活JIT编译。执行JIT会消耗一些规划时间,但是能够加速查询执行。将这个值设置为
-
jit_inline_above_cost
(floating point
)- 描述:设置JIT编译尝试内联函数和操作符的查询代价阈值,如果查询代价超过这个值,JIT编译就会尝试内联。内联会增加规划时间,但是可以提高执行速度。将这个参数设置成小于
jit_above_cost
是没有意义的。将这个参数设置为-1
会禁用内联。 - 默认值:默认值是
500000
。
- 描述:设置JIT编译尝试内联函数和操作符的查询代价阈值,如果查询代价超过这个值,JIT编译就会尝试内联。内联会增加规划时间,但是可以提高执行速度。将这个参数设置成小于
-
jit_optimize_above_cost
(floating point
)- 描述:设置JIT编译应用优化的查询代价阈值,如果查询代价超过这个值,JIT编译就会应用开销较大的优化。这类优化会增加规划时间,但是更能够改进执行速度。将这个参数设置成小于
jit_above_cost
是没有意义的,并且将它设置成大于jit_inline_above_cost
也未必有益。将这个参数设置为-1
会禁用开销较大的优化。 - 默认值:默认值是
500000
。
- 描述:设置JIT编译应用优化的查询代价阈值,如果查询代价超过这个值,JIT编译就会应用开销较大的优化。这类优化会增加规划时间,但是更能够改进执行速度。将这个参数设置成小于
5.3 遗传查询优化器
GEQO是一个使用探索式搜索来执行查询规划的算法。它可以降低负载查询的规划时间。 同时,GEQO的检索是随机的,因此它的规划可能会不可确定。 更多信息参阅Chapter 50。 遗传查询规划器(GEQO)是一种使用启发式搜索来进行查询规划的算法。它可以降低对于复杂查询(连接很多表的查询)的规划时间,但是代价是它产生的计划有时候要差于使用穷举搜索算法找到的计划。
geqo
(boolean
)- 描述:允许或禁止遗传查询优化。默认是启用。在生产环境中通常最好不要关闭它。
geqo_threshold
变量提供了对 GEQO 更细粒度的空值。
- 描述:允许或禁止遗传查询优化。默认是启用。在生产环境中通常最好不要关闭它。
geqo_threshold
(integer
)- 描述:只有当涉及的
FROM
项数量至少有这么多个的时候,才使用遗传查询优化(注意一个FULL OUTER JOIN
只被计为一个FROM
项)。 - 默认值:默认值是 12。对于更简单的查询,通常会使用普通的穷举搜索规划器,但是对于有很多表的查询穷举搜索会花很长时间,通常比执行一个次优的计划带来的惩罚值还要长。因此,在查询尺寸上的一个阈值是管理 GEQO 使用的一种方便的方法。
- 描述:只有当涉及的
geqo_effort
(integer
)- 描述:控制 GEQO 里规划时间和查询规划的有效性之间的平衡。这个变量必须是 一个范围从 1 到 10 的整数。缺省值是 5 。大的数值增加花在进行查询 规划上面的时间,但是也很可能会提高选中更有效的查询规划的几率。 控制 GEQO 中规划时间和查询计划质量之间的折中。这个变量必须是位于 1 到 10 之间的一个整数。
- 默认值:默认值是 5。更大的值会增加花在查询规划上的时间,但是同时也增加了选择一个高效查询计划的可能性。
geqo_pool_size
(integer
)- 描述:控制 GEQO 使用的池尺寸,它就是遗传种群中的个体数目。它必须至少为 2,且有用的值通常在 100 到 1000 之间。如果它被设置为零(默认设置)则会基于
geqo_effort
和查询中表的数量选择一个合适的值。 - 默认值:0。
- 描述:控制 GEQO 使用的池尺寸,它就是遗传种群中的个体数目。它必须至少为 2,且有用的值通常在 100 到 1000 之间。如果它被设置为零(默认设置)则会基于
geqo_generations
(integer
)- 描述:控制 GEQO 使用的子代数目。子代的意思是算法的迭代次数。它必须至少 是 1 ,有用的值范围和池大小相同。如果设置为零(缺省),那么将基于 geqo_pool_size选取合适的值。 控制 GEQO 使用的代数,也是算法的迭代次数。它必须至少为 1,并且有用值的范围和池尺寸相同。如果它被设置为零(默认设置)则会基于
geqo_pool_size
选择一个合适的值。 - 默认值:0。
- 描述:控制 GEQO 使用的子代数目。子代的意思是算法的迭代次数。它必须至少 是 1 ,有用的值范围和池大小相同。如果设置为零(缺省),那么将基于 geqo_pool_size选取合适的值。 控制 GEQO 使用的代数,也是算法的迭代次数。它必须至少为 1,并且有用值的范围和池尺寸相同。如果它被设置为零(默认设置)则会基于
geqo_selection_bias
(floating point
)- 描述:控制 GEQO 使用的选择偏好。选择偏好是种群中的选择压力。值可以是 1.5 到 2.0 之间,后者是默认值。
- 默认值:2.0。
geqo_seed
(floating point
)- 描述:控制 GEQO 使用的随机数生成器的初始值,随机数生成器用于在连接顺序搜索空间中选择随机路径。该值可以从 0 (默认值)到 1。变化该值会改变被探索的连接路径集合,并且可能导致找到一个更好或更差的路径。
- 默认值:0 。
5.4 其他规划器选项
default_statistics_target
(integer
)- 描述:为没有通过
ALTER TABLE SET STATISTICS
设置列相关目标的表列设置默认统计目标。更大的值增加了需要做ANALYZE
的时间,但是可能会改善规划器的估计质量。 - 默认值:默认值是 100。
- 描述:为没有通过
constraint_exclusion
(enum
)- 描述:控制查询规划器对表约束的使用,以优化查询。
constraint_exclusion
的允许值是on
(对所有表检查约束)、off
(从不检查约束)和partition
(只对继承的子表和UNION ALL
子查询检查约束)。 - 默认值:
partition
是默认设置。它通常与传统的继承树一起使用来提高性能。
- 描述:控制查询规划器对表约束的使用,以优化查询。
cursor_tuple_fraction
(floating point
)- 描述:设置规划器对将被检索的一个游标的行的比例的估计。默认值是 0.1。更小的值使得规划器偏向为游标使用“快速开始”计划,它将很快地检索前几行但是可能需要很长时间来获取所有行。更大的值强调总的估计时间。最大设置为 1.0,游标将和普通查询完全一样地被规划,只考虑总估计时间并且不考虑前几行会被多快地返回。
- 默认值:0.1 。
from_collapse_limit
(integer
)- 描述:如果生成的
FROM
列表不超过这么多项,规划器将把子查询融合到上层查询。较小的值可以减少规划时间,但是可能 会生成较差的查询计划。 - 默认值:默认值是 8。
- 注意:将这个值设置为
geqo_threshold
或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
- 描述:如果生成的
jit
(boolean
)- 描述:PostgreSQL是否可以使用JIT编译。
- 默认值:默认值是
on
。
join_collapse_limit
(integer
)- 描述:默认情况下,这个变量被设置成和
from_collapse_limit
相同, 这样适合大多数使用。把它设置为 1 可避免任何显式JOIN
的重排序。因此查询中指定的显式连接顺序就是关系被连接的实际顺序。因为查询规划器并不是总能 选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为 1,然后显式地指定他们想要的连接顺序。 - 默认值:默认值是 8。
- 注意:将这个值设置为
geqo_threshold
或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
- 描述:默认情况下,这个变量被设置成和
plan_cache_mode
(enum
)- 描述:准备语句(显式准备或隐式生成的,例如 PL/pgSQL)可以使用自定义或通用计划执行。 使用其特定的参数值集为每个执行重新生成自定义计划,而通用计划不依赖于参数值,并且可以在执行中重复使用。 因此,使用通用计划可以节省计划时间,但如果理想计划严重依赖参数值,则通用计划可能效率低下。 这些选项之间的选择通常是自动进行的,但可以通过
plan_cache_mode
覆盖它。 允许的值为auto
(默认的),force_custom_plan
和force_generic_plan
。 这个设置是在执行缓存计划时考虑,而不是在准备计划时考虑。 - 默认值:
auto
。
- 描述:准备语句(显式准备或隐式生成的,例如 PL/pgSQL)可以使用自定义或通用计划执行。 使用其特定的参数值集为每个执行重新生成自定义计划,而通用计划不依赖于参数值,并且可以在执行中重复使用。 因此,使用通用计划可以节省计划时间,但如果理想计划严重依赖参数值,则通用计划可能效率低下。 这些选项之间的选择通常是自动进行的,但可以通过
6.错误报告和日志记录
6.1 日志记录位置
-
log_destination
(string
)-
描述:指定需要输出日志格式。
-
默认:
stderr
。 -
可选:
- stderr:日志打印到标准错误输出(stderr),通常是在控制台或终端窗口中。
- csvlog:日志以 CSV(逗号分隔值)格式写入到文件中。使用 csvlog 时,通常需要启用
logging_collector
参数。 - syslog:日志通过操作系统的 syslog 机制记录。在 Unix 系统上,PostgreSQL 可以在 syslog 设备 LOCAL0 到 LOCAL7 中记录。在 Windows 上,这个选项不适用。
- eventlog(仅 Windows):日志写入 Windows 事件日志。
-
如果你想将日志同时输出到标准错误和 CSV 文件,你可以设置
log_destination = 'stderr,csvlog'
。 -
注意:在大多数 Unix 系统上,你将需要修改系统的syslog守护进程的配置来使用
log_destination
的syslog选项。PostgreSQL可以在syslog设备LOCAL0
到LOCAL7
中记录(见syslog_facility
),但是大部分平台上的默认syslog配置会丢弃所有这种消息。你将需要增加这样的内容:local0.* /var/log/postgresql
-
-
logging_collect
(boolean
)- 描述:是否启动日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中
- 默认值:
off
(不启动) - 注意:日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它会被阻塞。相反,syslog倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。
-
log_directory
(string
)-
描述:当
logging_collector
被启用时,这个参数决定日志文件将被在哪个目录下创建。 -
默认值:默认是
log
。它可以被指定为一个绝对路径,也可以被指定为一个相对于集簇数据目录的相对路径。如‘pg_log’。
-
-
log_file_mode
(integer
)- 描述:这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被
chmod
和umask
系统调用接受(要使用通常的十进制格式,该数字必须以一个0
(零)开始)。
- 描述:这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被
-
log_rotation_size
(integer
)- 描述:当
logging_collector
被启用时,这个参数决定一个个体日志文件的最大尺寸。 - 默认:24MB,0表示不限制日志大小。
- 描述:当
-
log_rotation_age
(integer
)- 描述:当
logging_collector
被启用时,这个参数决定使用一个单个日志文件的最大时间量,之后将创立一个新的日志文件。 - 默认值:如果指定值时没有单位,则以分钟为单位。默认为24小时。 将这个参数设置为零将禁用基于时间的新日志文件创建。
- 描述:当
-
log_statement
(enum
)- 描述:控制需要记录的sql类型(或仅记录DDL/DML/DML_ROW/ALL等特定类型)。
- 默认值:
none
(不记录)。更改log_statement
的值后,日志记录行为会立即改变,新的设置会在下个日志条目中生效,无需重启数据库。可选:'none', 'ddl', 'mod', 或 'all'。只有超级用户和具有适当SET
权限的用户才能更改此设置。
-
log_filename
(string
)-
描述:当
logging_collector
被启用时,这个参数设置被创建的日志文件的文件名。此参数只能在postgresql.conf
文件中或在服务器命令行上设置。 -
例如:
'postgresql-%Y-%m-%d_%H%M%S.log'
。
-
-
log_replication_commands
(boolean
)- 描述:开启记录流复制记录。
- 默认:
off
不开启。
-
log_truncate_on_rotation
(boolean
)- 描述:当
logging_collector
启用时,此参数将导致 PostgreSQL 截断(覆盖)同名任何现有日志文件,而不是追加到该文件。但是,仅当由于基于时间的轮换而打开新文件时才会发生截断,而不是在服务器启动或基于大小的轮换期间。关闭时,在所有情况下都将追加到现有文件。例如,将此设置与类似于log_filename
的postgresql-%H.log
结合使用将生成二十四小时日志文件,然后循环覆盖它们。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:当
-
syslog_facility
(enum
)- 描述:当启用了向syslog记录时,这个参数决定要使用的syslog“设备”。你可以在
LOCAL0
、LOCAL1
、LOCAL2
、LOCAL3
、LOCAL4
、LOCAL5
、LOCAL6
、LOCAL7
中选择。 - 默认值:默认值是
LOCAL0
。
- 描述:当启用了向syslog记录时,这个参数决定要使用的syslog“设备”。你可以在
-
syslog_ident
(string
)- 描述:当启用了向syslog记录时,这个参数决定用来标识syslog中的PostgreSQL消息的程序名。
- 默认值:默认值是
postgres
。
-
syslog_sequence_numbers
(boolean
)- 描述:当日志被记录到syslog并且这个设置为 on (默认)时,每一个消息会被加上一个增长的序号作为前缀(例如
[2]
)。这种行为避开了很多 syslog 实现默认采用的“--- 上一个消息重复 N 次 ---”形式。在现代 syslog 实现中,抑制重复消息是可以配置的(例如rsyslog中的$RepeatedMsgReduction
),因此这个参数可能不是必需的。此外,如果你真的想抑制重复消息,你可以把这个参数设置为 off。 - 默认值:
on
。
- 描述:当日志被记录到syslog并且这个设置为 on (默认)时,每一个消息会被加上一个增长的序号作为前缀(例如
-
syslog_split_messages
(boolean
)- 描述:当启用把日志记录到syslog时,这个参数决定消息如何送达 syslog。当设置为 on(默认)时,消息会被分成行,并且长的行也会被划分以便能够放到 1024 字节中,这是传统 syslog 实现一种典型的尺寸限制。当设置为 off 时,PostgreSQL 服务器日志消息会被原样送达 syslog 服务,而处理可能的大体量消息的任务由 syslog 服务负责。
- 默认值:
on
。
-
event_source
(string
)- 描述:当启用了向事件日志记录时,这个参数决定用来标识日志中PostgreSQL消息的程序名。
- 默认值:默认值是
PostgreSQL
。
6.2. 日志记录时间
log_min_messages
(enum
)- 描述:控制哪些消息级别 被写入到服务器日志。有效值是
DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
、ERROR
、LOG
、FATAL
和PANIC
。每个级别都包括以后的所有级别。级别越靠后,被发送的消息越少。 - 默认值:默认值是
WARNING
。
- 描述:控制哪些消息级别 被写入到服务器日志。有效值是
log_min_error_statement
(enum
)- 描述:控制哪些导致一个错误情况的 SQL 语句被记录在服务器日志中。任何指定 严重级别 或更高级别的消息的当前 SQL 语句将被包括在日志项中。有效值是
DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
、ERROR
、LOG
、FATAL
和PANIC
。默认值是ERROR
,它表示导致错误、日志消息、致命错误或恐慌错误的语句将被记录在日志中。要有效关闭失败语句的记录,请将此参数设置为PANIC
。只有超级用户和具有相应SET
权限的用户才能更改此设置。
- 描述:控制哪些导致一个错误情况的 SQL 语句被记录在服务器日志中。任何指定 严重级别 或更高级别的消息的当前 SQL 语句将被包括在日志项中。有效值是
- log_duration
- 描述:记录每个 SQL 语句的执行时间。
- 默认:
off
(不开启)。
- log_min_duration_statement
- 描述:此参数用于设置一个阈值,只有执行时间超过该阈值的 SQL 语句才会被记录到日志中。单位是毫秒。
- 默认值:通常是
-1
,表示不基于执行时间过滤日志中的语句。 - 例如:
log_min_duration_statement = 500
(记录执行时间超过 500 毫秒的语句)。 - 注:此参数仅在
log_statement_stats
,log_parser_stats
,log_planner_stats
,log_executor_stats
或log_duration
中的任何一个被启用时才有意义。
log_min_duration_sample
(integer
)- 描述:允许对最少运行了指定时间的已完成语句的持续时间进行抽样。
- 注意:如果将它设置为
100ms
则所有运行 100ms 或更长的 SQL 语句都将被采样。 - 默认值:
-1
(默认值)禁用采样语句持续时间。
log_statement_sample_rate
(floating point
)- 描述:定持续时间超过
log_min_duration_sample
的语句的部分。 采样是随机的,例如0.5
意味着从统计学上讲,任何给定语句都有1/2的概率将被记录。 - 默认值:默认值为
1.0
,意味着要记录所有采样语句。 设置为零将禁用采样语句持续时间日志,与将log_min_duration_sample
设为-1
相同。
- 描述:定持续时间超过
log_transaction_sample_rate
(floating point
)- 描述:设置所有语句都被记录的交易的部分,以及由于其他原因而记录的语句。它适用于每个新事务,而不考虑其语句的持续时间。 采样是随机的,例如
0.1
意味着从统计学上讲,任何给定事务都有十分之一的机会将被记录。log_transaction_sample_rate
有助于构建一个事务示例. 默认值为0
,表示不记录任何额外事务的语句。 设置这个为1
将记录所有交易的所有语句。 - 默认值:
0
。
- 描述:设置所有语句都被记录的交易的部分,以及由于其他原因而记录的语句。它适用于每个新事务,而不考虑其语句的持续时间。 采样是随机的,例如
log_min_duration_statement
(integer
)- 描述:设置启动进程将记录有关仍在进行中的长时间运行操作的消息的时间量,以及该操作的进一步进度消息之间的间隔。
- 默认值:默认值为 10 秒。设置为0禁用该功能。如果指定此值时不带单位,则以毫秒为单位。此设置分别应用于每个操作。
- 示例:例如,如果同步数据目录需要 25 秒,然后重置未记录的关系需要 8 秒,并且如果此设置的默认值为 10 秒,则将在数据目录进行 10 秒后记录同步数据目录的消息,并在数据目录进行 20 秒后再次同步数据目录, 但是,重置未记录的关系不会记录任何内容。
6.3 记录内容
-
debug_print_parse
(boolean
)
debug_print_rewritten
(boolean
)
debug_print_plan
(boolean
)- 描述:这个参数启用发出各种调试输出。当设置时,会打印生成的解析树, 查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG 信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。 可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省是off。 这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在
LOG
消息级别上被发出,因此默认情况下它们将出现在服务器日志中但不会被发送到客户端。你可以通过调整client_min_messages
和/或log_min_messages
来改变这种情况。
- 描述:这个参数启用发出各种调试输出。当设置时,会打印生成的解析树, 查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG 信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。 可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省是off。 这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在
-
debug_pretty_print
(boolean
)- 描述:当被设置时,
debug_pretty_print
会缩进由debug_print_parse
、debug_print_rewritten
或debug_print_plan
产生的输出。这将导致比关闭参数时使用的“紧凑”模式可读性更强但是更长的输出。它默认是打开的。 - 默认值:
on
。
- 描述:当被设置时,
-
log_autovacuum_min_duration
(integer
)- 描述:如果autovacuum执行的每个操作至少运行了指定的时间,该操作会被记录。 设置这个为零记录所有autovacuum操作。
-1
(默认的)禁用日志记录autovacuum操作。 如果指定此值时不带单位,则以毫秒为单位。 例如,如果将其设置为250ms
,那么所有运行250毫秒或更长时间的自动vacuums和分析都将被记录。 此外,当此参数设置为-1
以外的任何值时,如果由于锁冲突或并发删除关系而跳过autovacuum操作,则会记录一条消息。 启用此参数有助于跟踪autovacuum活动。 该参数只能在postgresql.conf
文件或在服务器命令行中设置;但是可以通过更改表存储参数来覆盖单独表的设置。 - 默认值:
-1
。 - 注意:修改
autovacuum
的设置后,数据库立即根据新的自动清理设置执行 VACUUM 操作,而不需要重新启动数据库。
- 描述:如果autovacuum执行的每个操作至少运行了指定的时间,该操作会被记录。 设置这个为零记录所有autovacuum操作。
-
log_checkpoints
(boolean
)- 描述:导致检查点和重启点被记录在服务器日志中。一些统计信息也被包括在日志消息中,包括写入缓冲区的数据和写它们所花的时间。这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。 - 默认值:默认值是关闭
off
。
- 描述:导致检查点和重启点被记录在服务器日志中。一些统计信息也被包括在日志消息中,包括写入缓冲区的数据和写它们所花的时间。这个参数只能在
-
log_connections
(boolean
)- 描述:导致每一次尝试对服务器的连接被记录,客户端认证(如需要)和认证的成功完成也会被记录。 只有超级用户能在会话开始时更改这个参数,在会话中它不能被更改。
- 默认值:默认 为
off
。
-
log_disconnections
(boolean
)- 描述:导致会话终止被记录。日志输出提供的信息类似于
log_connections
,不过还外加会话的持续时间。 只有超级用户能在会话开始时更改这个参数,在会话中它不能被更改。 - 默认值:默认 为
off
。
- 描述:导致会话终止被记录。日志输出提供的信息类似于
-
log_duration
(boolean
)- 描述:导致每一个完成的语句的持续时间被记录。
- 默认值:默认值是
off
。 - 注意:启用
log_duration
和设置log_min_duration_statement
为零之间的区别是,超过log_min_duration_statement
强制查询的文本被记录,但这个选项不会。因此,如果log_duration
为on
并且log_min_duration_statement
为正值,所有持续时间都将被记录,但是只有超过阈值的语句才会被记录查询文本。这种行为有助于在高负载安装中收集统计信息。
-
log_error_verbosity
(enum
)- 描述:控制为每一个被记录的消息要写入到服务器日志的细节量。有效值是
TERSE
、DEFAULT
和VERBOSE
,每一个都为显示的消息增加更多域。TERSE
排除记录DETAIL
、HINT
、QUERY
和CONTEXT
错误信息。VERBOSE
输出包括SQLSTATE
错误码以及产生错误的源代码文件名、函数名和行号。
- 描述:控制为每一个被记录的消息要写入到服务器日志的细节量。有效值是
-
log_hostname
(boolean
)- 描述:默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致很微小的性能损失。
-
log_line_prefix
(string
)-
描述:这是一个
printf
风格的字符串,它在每个日志行的开头输出。%
字符开始“转义序列”,它将被按照下文描述的替换成状态信息。 未识别的转义被忽略。其他字符被直接复制到日志行。某些转义只被会话进程识别并且被主服务器进程等后台进程当作空。 通过指定一个在%之后和该选项之前的数字可以让状态信息左对齐或右对齐。 负值将导致在右边用空格填充状态信息已达到最小宽度,而正值则在左边填充。填充对于日志文件的人类可读性大有帮助。 -
默认值:默认值是
'%m [%p] '
,它记录时间戳和进程ID。转义 效果 只限会话 %a
应用名 是 %u
用户名 是 %d
数据库名 是 %r
远程主机名或 IP 地址,以及远程端口 是 %h
远程主机名或 IP 地址 是 %b
后端类型 否 %p
进程 ID 否 %P
并行组leader的进程ID,如果该进程是一个并行查询worker no %t
无毫秒的时间戳 否 %m
带毫秒的时间戳 否 %n
带毫秒的时间戳(作为 Unix 时代) no %i
命令标签:会话当前命令的类型 是 %e
SQLSTATE 错误代码 否 %c
会话 ID:见下文 否 %l
对每个会话或进程的日志行号,从 1 开始 否 %s
进程开始的时间戳 否 %v
虚拟事务 ID (backendID/localXID) 否 %x
事务 ID (如果未分配则为 0) 否 %q
不产生输出,但是告诉非会话进程在字符串的这一点停止;会话进程忽略 否 %Q
当前查询的查询标识符。 查询标识符默认是不计算的,所以这个部分将是零,除非 compute_query_id
参数被激活或者配置了计算查询标识符的第三方模块yes %%
纯文字 %
否
-
-
log_lock_waits
(boolean
)- 描述:控制当一个会话为获得一个锁等到超过
deadlock_timeout
时,是否要产生一个日志消息。这有助于决定是否所等待造成了性能低下。 - 默认值:默认值是
off
。只有超级用户可以更改这个设置。
- 描述:控制当一个会话为获得一个锁等到超过
-
log_recovery_conflict_waits
(boolean
)- 描述:控制启动过程等待时间超过针对恢复冲突的
deadlock_timeout
的时候是否产生日志消息。 这对于决定恢复冲突是否会阻止恢复应用WAL有所帮助。 - 默认值:默认为
off
。
- 描述:控制启动过程等待时间超过针对恢复冲突的
-
log_parameter_max_length
(integer
)- 描述:如果大于零,则使用非错误语句日志消息记录的每个绑定参数值都被裁剪为这么多字节。 零禁用非错误语句日志的绑定参数日志。
-1
(默认值)允许绑定参数被完整登录。 如果指定此值时没有单位,则将其作为字节。 - 默认值:-
1
。
- 描述:如果大于零,则使用非错误语句日志消息记录的每个绑定参数值都被裁剪为这么多字节。 零禁用非错误语句日志的绑定参数日志。
-
log_parameter_max_length_on_error
(integer
)- 描述:如果大于零,则错误消息中报告的每个绑定参数值都将裁剪为这么多字节。 零(默认值)禁止在错误消息中包含绑定参数。
-1
允许打印完整绑定参数。 如果指定此值时没有单位,则将其作为字节。 - 默认值:
0
。 - 注意:该设置的非零值会增加开销,由于PostgreSQL需要在每条语句的开始处将参数值的文本表示存储在内存中,无论最终是否会发生错误。 当绑定参数以二进制形式发送时,开销比以文本形式发送时更大,因为前者需要数据转换,而后者只需要复制字符串。
- 描述:如果大于零,则错误消息中报告的每个绑定参数值都将裁剪为这么多字节。 零(默认值)禁止在错误消息中包含绑定参数。
-
log_statement
(enum
)- 描述:控制哪些 SQL 语句被记录。有效值是
none
(off)、ddl
、mod
和all
(所有语句)。ddl
记录所有数据定义语句,例如CREATE
、ALTER
和DROP
语句。mod
记录所有ddl
语句,外加数据修改语句例如INSERT
,UPDATE
、DELETE
、TRUNCATE
, 和COPY FROM
。 如果PREPARE
、EXECUTE
和EXPLAIN ANALYZE
包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个执行消息时会产生日志并且会包括绑定参数的值。 - 默认值:默认值为
none
。只有超级用户和具有适当SET
权限的用户才能更改此设置。 - 注意:即使使用
log_statement
=all
设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在执行阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement
设置为ERROR
(或更低)来记录这种语句
- 描述:控制哪些 SQL 语句被记录。有效值是
-
log_replication_commands
(boolean
)- 描述:导致每一个复制命令都被记录在服务器日志中。
- 默认值:默认值是
off
。只有 超级用户可以更改这个设置。
-
log_temp_files
(integer
)- 描述:控制记录临时文件名和尺寸。临时文件可以被创建用来排序、哈希和存储临时查询结果。 如果启用这个设置,当每一个临时文件被删除时都会产生一个日志项。 一个零值记录所有临时文件信息,而正值只记录尺寸大于或等于指定数据量的文件。如果指定值时没有单位,则以千字节为单位。
- 默认值:默认设置为
-1
,它禁用这种记录。
-
log_timezone
(string
)- 描述:设置在服务器日志中写入的时间戳的时区。和
TimeZone
不同,这个值是集簇范围的,因此所有会话将报告一致的时间戳。内建默认值是GMT
,但是通常会被在postgresql.conf
中覆盖。initdb将安装一个对应于其系统环境的设置。 - 默认值:
GMT
。
- 描述:设置在服务器日志中写入的时间戳的时区。和
7. 运行时统计数据
这些参数控制服务器范围的统计数据收集特性。当统计收集被启用时,被产生的数据可以通过pg_stat
和pg_statio
系统视图族访问。
7.1查询和索引统计收集器
track_activities
(boolean
)- 描述:启用对每个会话的当前执行命令的信息收集,还有它的标识符和命令开始执行的时间。 这个参数默认为打开。注意即使被启用,这些信息也不是对所有用户可见,只有超级用户和拥有报告信息的会话的用户可见,因此它不会表现为一个安全风险。
- 默认值:
on
。 - 注意:动态修改
track_activities
后,跟踪活动的设置会立即生效,不需要重新启动数据库。
track_activity_query_size
(integer
)- 描述:为每个活动会话指定存储当前执行命令的文本所保留的内存量,它们被用于
pg_stat_activity
.query
域。 如果指定值时没有单位,则以字节为单位。默认值是 1024字节。 - 默认值:
1024
。
- 描述:为每个活动会话指定存储当前执行命令的文本所保留的内存量,它们被用于
track_counts
(boolean
)- 描述:启用在数据库活动上的统计收集。这个参数默认为打开,因为自动清理守护进程需要被收集的信息。
- 默认值:
on
。
track_io_timing
(boolean
)- 描述:启用对系统 I/O 调用的计时。这个参数默认为关闭,因为它将重复地向操作系统查询当前时间,这会在某些平台上导致显著的负荷。 你可以使用
pg_test_timing
工具来度量你的系统中计时的开销。 I/O 计时信息被显示在pg_stat_database
中, 当BUFFERS
选项被使用时的EXPLAIN
输出中,通过autovacuum
对auto-vacuums
和auto-analyzes
,当log_autovacuum_min_duration
被pg_stat_statements
设置时。 - 默认值:
off
。
- 描述:启用对系统 I/O 调用的计时。这个参数默认为关闭,因为它将重复地向操作系统查询当前时间,这会在某些平台上导致显著的负荷。 你可以使用
track_wal_io_timing
(boolean
)- 描述:激活WAL I/O调用的计时。 该参数默认为关闭,因为它将重复查询操作系统当前时间,这可能在某些平台上造成显著的开销。 您可以使用pg_test_timing工具来评估系统上的定时开销。 I/O计时信息在
pg_stat_wal
.中显示。 - 默认值:
off
。
- 描述:激活WAL I/O调用的计时。 该参数默认为关闭,因为它将重复查询操作系统当前时间,这可能在某些平台上造成显著的开销。 您可以使用pg_test_timing工具来评估系统上的定时开销。 I/O计时信息在
track_functions
(enum
)- 描述:启用跟踪函数调用计数和用时。指定
pl
只跟踪过程语言函数,指定all
还会跟踪 SQL 和 C 语言函数。 - 默认值:默认值是
none
,它禁用函数统计跟踪。 - 注意:简单到足以被“内联”到调用查询中的 SQL 语言函数不会被跟踪, 而不管这个设置。
- 描述:启用跟踪函数调用计数和用时。指定
stats_temp_directory
(string
)- 描述:设置存储临时统计数据的目录。这可以是一个相对于数据目录的路径或一个绝对路径。默认值是
pg_stat_tmp
。在一个基于 RAM 的文件系统上指明这个参数将降低物理 I/O 需求,并且提高性能。 - 注意:虽然可以实时更改
stats_temp_directory
,但现有的临时统计信息文件可能会继续存储在旧的目录中,直到它们被清理或过期。
- 描述:设置存储临时统计数据的目录。这可以是一个相对于数据目录的路径或一个绝对路径。默认值是
7.2 统计监控
compute_query_id
(enum
)- 描述:启用查询标识符的内核中计算。 查询标识符可以显示在
pg_stat_activity
视图中,使用EXPLAIN
,或者在日志中发出,如果通过log_line_prefix
参数配置。pg_stat_statements
扩展还需要一个查询标识符以计算。 注意,如果内核中查询标识符计算方法不可接受,也可以使用外部模块。 在这种情况下,必须始终禁用核内计算。 有效的值为off
(总是禁用),on
(总是启用)和auto
,这让像pg_stat_statements
的模块自动启用它。 - 默认值:默认为
auto
。 - 注意:确认只有一个查询标识符被计算和显示,如果一个查询标识符已经被计算,扩展计算标识符将抛出一个错误。
- 描述:启用查询标识符的内核中计算。 查询标识符可以显示在
log_statement_stats
(boolean
)
log_parser_stats
(boolean
)
log_planner_stats
(boolean
)
log_executor_stats
(boolean
)- 描述:对每个查询,向服务器日志里输出相应模块的性能统计。这是一种粗糙的分析工具。类似于 Unix 的
getrusage()
系统功能。log_statement_stats
报告总的语句统计,而其它的报告针每个模块的统计。log_statement_stats
不能和 其它任何针对每个模块统计的选项一起启用。所有这些选项都是默认禁用的。只有超级用户可以更改这个设置。
- 描述:对每个查询,向服务器日志里输出相应模块的性能统计。这是一种粗糙的分析工具。类似于 Unix 的
8. 自动清理
这些设置控制autovacuum特性的行为。
-
autovacuum
(boolean
)- 描述:控制服务器是否运行自动清理启动器后台进程。默认为开启, 不过要自动清理正常工作还需要启用
track_counts
。 该参数只能在postgresql.conf
文件或服务器命令行中设置, 不过,通过更改表存储参数可以为表禁用自动清理。 - 默认值:
on
。
- 描述:控制服务器是否运行自动清理启动器后台进程。默认为开启, 不过要自动清理正常工作还需要启用
-
autovacuum_max_workers
(integer
)- 描述:指定能同时运行的自动清理进程(除了自动清理启动器之外)的最大数量。
- 默认值:默认值为3。
-
autovacuum_naptime
(integer
)- 描述:指定自动清理在任意给定数据库上运行的最小延迟。在每一轮中后台进程检查数据库并根据需要为数据库中的表发出
VACUUM
和ANALYZE
命令。 如果指定值时没有单位,则以秒为单位。 - 默认值:默认值为1分钟(
1min
)。 - 注意:修改
autovacuum_naptime
后,需要等待自动 VACUUM 进程执行下一轮清理操作(取决于设置的时间间隔)才能应用新的休眠时间。
- 描述:指定自动清理在任意给定数据库上运行的最小延迟。在每一轮中后台进程检查数据库并根据需要为数据库中的表发出
-
autovacuum_vacuum_threshold
(integer
)- 描述:指定能在一个表上触发
VACUUM
的被更新或被删除元组的最小数量。 - 默认值:默认值为50个元组
- 描述:指定能在一个表上触发
-
autovacuum_vacuum_insert_threshold
(integer
)-
描述:指定在任何一个表中触发
VACUUM
所需要插入的元组数。默认值为 1000 个元组。 如果指定了 -1,则autovacuum不会根据插入数量在任何表上触发VACUUM
操作。默认值:
1000
个元组。
-
-
autovacuum_analyze_threshold
(integer
)- 描述:指定能在一个表上触发
ANALYZE
的被插入、被更新或被删除元组的最小数量。 - 默认值:默认值为50个元组。
- 描述:指定能在一个表上触发
-
autovacuum_vacuum_scale_factor
(floating point
)- 描述:指定一个表尺寸的分数,在决定是否触发
VACUUM
时将它加到autovacuum_vacuum_threshold
上。 - 默认值:默认值为0.2(表尺寸的20%)。
- 描述:指定一个表尺寸的分数,在决定是否触发
-
autovacuum_vacuum_insert_scale_factor
(floating point
)- 描述:指定一个要添加到
autovacuum_vacuum_insert_threshold
中的表的大小的比例,在决定是否触发VACUUM
时。 - 默认值: 默认值为 0.2(表大小的 20%)。
- 描述:指定一个要添加到
-
autovacuum_analyze_scale_factor
(floating point
)- 描述:指定一个表尺寸的分数,在决定是否触发
ANALYZE
时将它加到autovacuum_analyze_threshold
上。 - 默认值:默认值为0.1(表尺寸的10%)。
- 描述:指定一个表尺寸的分数,在决定是否触发
-
autovacuum_freeze_max_age
(integer
)- 描述:指定在一个
VACUUM
操作被强制执行来防止表中事务ID回卷之前,一个表的pg_class
.relfrozenxid
域能保持的最大年龄(事务的)。注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。
- 描述:指定在一个
-
autovacuum_multixact_freeze_max_age
(integer
)- 描述:指定在一个
VACUUM
操作被强制执行来防止表中多事务ID回卷之前,一个表的pg_class
.relminmxid
域能保持的最大年龄(多事务的)。注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。 - 注意:清理多事务也允许从
pg_multixact/members
和pg_multixact/offsets
子目录中移除旧文件,这也是为什么默认值被设置为较低的4亿事务。
- 描述:指定在一个
-
autovacuum_vacuum_cost_delay
(floating point
)- 描述:指定用于自动
VACUUM
操作中的代价延迟值。如果指定-1,则使用vacuum_cost_delay
值。 如果指定值时没有单位,则以毫秒为单位。 - 默认值:默认值为2毫秒。
- 描述:指定用于自动
-
autovacuum_vacuum_cost_limit
(integer
)- 描述:指定用于自动
VACUUM
操作中的代价限制值。如果指定-1(默认值),则使用vacuum_cost_limit
值。注意该值被按比例地分配到运行中的自动清理工作者上(如果有多个),因此每一个工作者的限制值之和不会超过这个变量中的值。 - 默认值:
-1
。
- 描述:指定用于自动
9.锁管理
deadlock_timeout
(integer
)- 描述:这是进行死锁检测之前在一个锁上等待的时间量。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。 我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了报告真正死锁错误的速度。 如果指定值时没有单位,则以毫秒为单位。默认是 1 秒(
1s
),这可能是实际中你想要的最小值。 在一个高负载的服务器上,你可能需要增大它。这个值的理想设置应该超过你通常的事务时间,这样就可以减少在锁释放之前就开始死锁检查的机会。 - 默认值:
1s
。
- 描述:这是进行死锁检测之前在一个锁上等待的时间量。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。 我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了报告真正死锁错误的速度。 如果指定值时没有单位,则以毫秒为单位。默认是 1 秒(
max_locks_per_transaction
(integer
)- 描述:共享锁表跟踪在
max_locks_per_transaction
* (max_connections
+max_prepared_transactions
) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这*不*是能被锁住的行数,那个值是没有限制的。默认值 64 已经被历史证明是足够的,但是如果你有需要在一个事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。 - 默认值:
64
。
- 描述:共享锁表跟踪在
max_pred_locks_per_transaction
(integer
)- 描述:共享谓词锁表跟踪在
max_pred_locks_per_transaction
* (max_connections
+max_prepared_transactions
) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这不是能被锁住的行数,那个值是没有限制的。默认值 64 已经在测试中被证明通常是足够的,但是如果你有需要在一个可序列化事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。 - 默认值:
64
。
- 描述:共享谓词锁表跟踪在
max_pred_locks_per_relation
(integer
)- 描述:这个参数控制在谓词锁被提升为覆盖整个关系之前,该谓词锁能够在单个关系上锁住多少页面或元组。大于等于零的值表示一种绝对限制,而负值表示用
max_pred_locks_per_transaction
除以这个设置的绝对值。 - 默认值:默认值为
-2
,它将保持以往版本的PostgreSQL中的行为。
- 描述:这个参数控制在谓词锁被提升为覆盖整个关系之前,该谓词锁能够在单个关系上锁住多少页面或元组。大于等于零的值表示一种绝对限制,而负值表示用
max_pred_locks_per_page
(integer
)- 描述:这个参数控制在谓词锁被提升为覆盖整个页面之前,该谓词锁能在单一页面上锁住多少行。
- 默认值:默认值是
2
。
10. 错误处理
-
exit_on_error
(boolean
)- 描述:如果为开(on),任何错误将中止当前会话。默认情况下,这个值被设置为关(off),这样只有 FATAL 错误(致命)将中止会话。
- 默认值:
off
。
-
restart_after_crash
(boolean
)- 描述:当被设置为开(on),PostgreSQL将在一次后端崩溃后自动重新初始化。 让这个值设置为开(on)通常是将数据库可用性最大化的最佳方法。但是在某些环境中,例如PostgreSQL被集群软件调用时,禁用重启可能很有用,这样集群软件可以得到控制并且采取它认为适当的行动。
-
data_sync_retry
(boolean
)-
描述:如果设置为关(off),PostgreSQL在将修改的数据文件刷新到文件系统失败时,将引发PANIC级错误。 这样会导致数据库服务器崩溃。这个参数只能在服务器启动时被设置。
在某些操作系统上,回写失败后,内核页面缓存中的数据状态未知。 在某些情况下,它可能已被完全遗忘,因此重试不安全;第二次尝试可能报告为成功,而事实上数据已丢失。在此类情形下,避免数据丢失的唯一方法是在报告任何故障后从WAL中恢复,最好是在调查了故障的根本原因并更换了任何有故障的硬件之后。
如果设置为开(on),PostgreSQL将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷新操作。 仅在调查操作系统假如回写失败时对缓冲数据的处理方式的情况下,才将其设置为开(on)。
-
-
recovery_init_sync_method
(enum
)- 描述:当设置为
fsync
,也就是默认值,PostgreSQL将在崩溃恢复开始之前递归地打开并同步数据目录中的所有文件。 对文件的搜索将遵循WAL目录和每个配置表空间的符号链接(而不是任何其它符号链接)。 这是为了确保在重现更改之前,所有WAL和数据文件都持久地存储在硬盘上。 这适用于在启动没有完全关闭的数据库集群时,包括由pg_basebackup创建的副本。在Linux上,可以用syncfs
代替,请求操作系统来同步包含数据目录的整个文件系统,WAL文件和每个表空间(但不是通过符号链接可访问到的任何其他文件系统)。 这可能比fsync
设置快得多,因为它不需要逐个打开每个文件。 另一方面,如果一个文件系统是被其他需要修改大量文件的应用程序共享的,它可能会慢一些,因为这些文件也将写入硬盘。 此外,在5.8之前的Linux版本中,向磁盘写入数据时遇到的I/O错误可能不会报告给PostgreSQL,相关的错误消息可能只出现在内核日志中。 - 默认值:
fsync
。
- 描述:当设置为
11. 预置设置
注意:下列“参数”是只读的。 同样,它们被排除在postgresql.conf
文件例子之外。 这些选项报告特定应用可能感兴趣的多种PostgreSQL行为,特别是管理前端相关的行为。 所有这些都是在PostgreSQL被编译或者它被安装时决定的。
block_size
(integer
)- 描述:报告一个磁盘块的大小。它由编译服务器时
BLCKSZ
的值确定。默认值是 8192 字节。有些配置变量的含义(例如shared_buffers
)会被block_size
影响。 - 默认值:
8192
。
- 描述:报告一个磁盘块的大小。它由编译服务器时
data_checksums
(boolean
)- 描述:报告对这个集簇是否启用了数据校验码。
data_directory_mode
(integer
)- 描述:在Unix系统上,这个参数报告启动时的数据目录(由
data_directory
定义)的权限。
- 描述:在Unix系统上,这个参数报告启动时的数据目录(由
debug_assertions
(boolean
)- 描述:报告编译PostgreSQL时是否启用了断言。 如果PostgreSQL被编译时定义了宏
USE_ASSERT_CHECKING
is defined when PostgreSQL(例如通过configure
选项--enable-cassert
定义),那么会报告已启用。默认情况下 PostgreSQL编译时没有用断言。 - 默认值:
off
。
- 描述:报告编译PostgreSQL时是否启用了断言。 如果PostgreSQL被编译时定义了宏
integer_datetimes
(boolean
)- 描述:报告PostgreSQL是否在编译时打开了 64 位整数日期和时间。
- 默认值:从PostgreSQL 10起,这个值总是
on
。
in_hot_standby
(boolean
)- 描述:报告服务器当前是否处于热备模式。 当这个是
on
的时候,所有的事务强制为只读。 在会话中,这个只能在服务器提升为主服务器的时候变更。
- 描述:报告服务器当前是否处于热备模式。 当这个是
lc_collate
(string
)- 描述:报告文本数据排序使用的区域。该值是在数据库被创建时确定的。
lc_ctype
(string
)- 描述:报告决定字符分类的区域。该值是在数据库被创建时决定的。通常它和
lc_collate
一样,但是可以为特殊应用设置成不同的值。
- 描述:报告决定字符分类的区域。该值是在数据库被创建时决定的。通常它和
max_function_args
(integer
)- 描述:报告函数参数的最大数量。它由编译服务器时的
FUNC_MAX_ARGS
值决定的。 - 默认值:默认值是 100 个参数。
- 描述:报告函数参数的最大数量。它由编译服务器时的
max_identifier_length
(integer
)- 描述:报告标识符的最大长度。它由编译服务器时的
NAMEDATALEN
值减一决定。NAMEDATALEN
的默认值是 64 ;因此max_identifier_length
的默认值是 63,但是在使用多字节编码时可以少于 63 个字符。 - 默认值:
63
。
- 描述:报告标识符的最大长度。它由编译服务器时的
max_index_keys
(integer
)- 描述:报告索引键的最大数目。
- 默认值:它由编译服务器时的
INDEX_MAX_KEYS
值决定。默认值是 32 个键。
segment_size
(integer
)- 描述:报告一个文件段中可以存储的块(页)的数量。由编译服务器时的
RELSEG_SIZE
值决定。 - 默认值:一个段文件的最大尺寸(以字节计)等于
segment_size
乘以block_size
,默认是 1GB。
- 描述:报告一个文件段中可以存储的块(页)的数量。由编译服务器时的
server_encoding
(string
)- 描述:报告数据库的编码(字符集)。这是在数据库被创建时决定的。通常,客户端只需要关心
client_encoding
的值。
- 描述:报告数据库的编码(字符集)。这是在数据库被创建时决定的。通常,客户端只需要关心
server_version
(string
)- 描述:报告服务器版本数值。它是由编译服务器时的
PG_VERSION
值决定的。
- 描述:报告服务器版本数值。它是由编译服务器时的
server_version_num
(integer
)- 描述:报告服务器版本数值的整数值。它是由编译服务器时的
PG_VERSION_NUM
值决定的。
- 描述:报告服务器版本数值的整数值。它是由编译服务器时的
ssl_library
(string
)- 描述:报告此PostgreSQL服务器已构建的 SSL 库的名称(即使此实例当前未配置或使用 SSL), 例如
OpenSSL
,或一个空字符串(如果没有)。
- 描述:报告此PostgreSQL服务器已构建的 SSL 库的名称(即使此实例当前未配置或使用 SSL), 例如
wal_block_size
(integer
)- 描述:报告一个 WAL 磁盘块的尺寸。由编译服务器时的
XLOG_BLCKSZ
值决定。 - 默认值:默认是 8192 字节。
- 描述:报告一个 WAL 磁盘块的尺寸。由编译服务器时的
wal_segment_size
(integer
)- 描述:报告 WAL 段文件的大小。
- 默认值:默认是 16MB。
12. 客户端连接默认值
12.1 语句行为
client_min_messages
(enum
)- 描述:控制发送到客户端的消息级别。有效值为DEBUG5
DEBUG4
DEBUG3DEBUG2
DEBUG1LOG
NOTICEWARNING
ERROR。每个级别都包括它后面的所有级别。级别越晚,发送的消息越少。 - 默认值:
notice
。请注意,这里的排名与log_min_messages
中的排名不同。 - 注意:
INFO
级别消息始终发送到客户端
- 描述:控制发送到客户端的消息级别。有效值为DEBUG5
search_path
(string
)- 描述:此变量指定当对象(表、数据类型、函数等)由未指定架构的简单名称引用时,搜索架构的顺序。当不同架构中存在名称相同的对象时,将使用搜索路径中首先找到的对象。如果对象不在搜索路径中的任何架构中,则只能通过使用限定(虚线)名称指定其包含架构来引用该对象。
- 默认值:
'"$user", public'
row_security
(boolean
)- 描述:此变量控制是否引发错误以代替应用行安全策略。设置为 on时,策略将正常应用。设置为off时,查询将失败,否则将应用至少一个策略。
- 默认值:
on
。更改为行可见性有限的位置,这可能会导致不正确的结果;
default_table_access_method
(string
)- 描述:此参数指定在创建表或实例化视图时要使用的默认表访问方法(如果命令未显式指定访问方法),或者在使用时不允许指定表访问方法。
- 默认值:'
heap
。
statement_timeout
(integer
)- 描述:中止任何花费超过指定时间的语句。如果设置为ERROR或更低,则还将记录超时的语句。如果指定此值时不带单位,则以毫秒为单位。值为零(默认值)将禁用超时。
- 默认值:
0
。
12.2 语言环境和格式
-
DateStyle
(string
) -
描述:设置日期和时间值的显示格式,以及解释不明确的日期输入值的规则。
-
TimeZone
(string
) -
描述:设置用于显示和解释时间戳的时区。内置默认值为GMT ,但通常在postgresql.conf中被覆盖;initdb 将在那里安装与其系统环境相对应的设置。
-
lc_messages
(string
) -
描述:设置显示消息的语言。可接受的值取决于系统;有关更多信息。如果此变量设置为空字符串(默认值),则该值将以与系统相关的方式从服务器的执行环境继承。在某些系统上,此区域设置类别不存在。设置此变量仍然有效,但不会产生任何影响。此外,可能不存在所需语言的翻译消息。在这种情况下,您将继续看到英文消息。一般设置为zh_CN.UTF-8。
- 默认值:空字符串。
-
lc_monetary
(string
)- 描述:设置用于设置货币金额格式的区域设置,例如使用函数系列。如果此变量设置为空字符串(默认值)一般设置为zh_CN.UTF-8。
- 默认值:空字符串。
-
lc_numeric
(string
)- 描述:设置用于设置数字格式的区域设置,例如使用函数系列。可接受的值取决于系统;有关更多信息。如果此变量设置为空字符串(默认值)一般设置为zh_CN.UTF-8。
- 默认值:空字符串。
-
lc_time
(string
) -
描述:设置用于设置日期和时间格式的区域设置,例如使用函数系列。可接受的值取决于系统;有关更多信息。如果此变量设置为空字符串(默认值)一般设置为zh_CN.UTF-8。
- 默认值:空字符串。
13. 文件位置
ConfigDir
是指$PGDATA环境变量或者是命令行指定的 -D 值
-
data_directory
(string
)- 描述:指ConfigDir的文件夹。
- 默认值:
ConfigDir
。此参数只能在服务器启动时设置。 - 如:
data_directory = 'ConfigDir'
此时的ConfigDir
是一个相对路径,当用户配置了环境变量$PGDATA
时,则data_directory实际上是$PGDATA/ConfigDir
目录,当用户未配置$PGDATA
时,则是~/ConfigDir
目录。
-
hba_file
(string
)- 描述:指定了基于主机认证配置文件的位置,该文件用于控制客户端对PostgreSQL服务器的访问权限。
- 默认值:
ConfigDir/pg_hba.conf
。此参数只能在服务器启动时设置。
-
ident_file
(string
)- 描述:指定了用于用户名称映射的配置文件的位置。
- 默认值:
ConfigDir/pg_ident.conf。
此参数只能在服务器启动时设置。
-
external_pid_file
(string
)- 描述:指定可被服务器创建的用于管理程序的额外进程 ID(PID)文件。此参数只能在服务器启动时设置。
-
config_file
(string
)- 描述:指定主服务器配置文件(通常称为
postgresql.conf
)。此参数只能在postgres
命令行中设置。
- 描述:指定主服务器配置文件(通常称为
14. 短选项
短选项键表
短选项 | 等效项 |
---|---|
-B * x* |
shared_buffers = * x* |
-d * x* |
log_min_messages = DEBUG* x* |
-e |
datestyle = euro |
-fb , -fh , -fi , -fm , -fn , -fo , -fs , -ft |
enable_bitmapscan = off , enable_hashjoin = off , enable_indexscan = off , enable_mergejoin = off , enable_nestloop = off , enable_indexonlyscan = off , enable_seqscan = off , enable_tidscan = off |
-F |
fsync = off |
-h * x* |
listen_addresses = * x* |
-i |
listen_addresses = '*' |
-k * x* |
unix_socket_directories = * x* |
-l |
ssl = on |
-N * x* |
max_connections = * x* |
-O |
allow_system_table_mods = on |
-p * x* |
port = * x* |
-P |
ignore_system_indexes = on |
-s |
log_statement_stats = on |
-S * x* |
work_mem = * x* |
-tpa , -tpl , -te |
log_parser_stats = on , log_planner_stats = on , log_executor_stats = on |
-W * x* |
post_auth_delay = * x* |
15. 开发者选项
以下参数适用于开发者测试,切勿在生产数据库中使用。但是,其中一些参数可用于帮助恢复严重损坏的数据库。因此,它们已被排除在示例 postgresql.conf
文件中。请注意,其中许多参数都需要特殊的源编译标志才能正常工作。
-
allow_in_place_tablespaces
(boolean
)- 描述:当向
CREATE TABLESPACE
命令提供空位置字符串时,允许在pg_tblspc
内将表空间创建为目录。此操作旨在允许测试主服务器和备用服务器在同一台机器上运行的复制场景。此类目录可能会混淆备份工具,因为这些工具只期望在该位置找到符号链接。只有超级用户和具有适当SET
权限的用户才能更改此设置。
- 描述:当向
-
allow_system_table_mods
(boolean
)- 描述:允许修改系统表的结构以及对系统表执行其他某些有风险的操作。否则,即使对于超级用户也不允许这样做。不当使用此设置会导致不可挽回的数据丢失或严重损坏数据库系统。只有超级用户和具有适当
SET
权限的用户才能更改此设置。
- 描述:允许修改系统表的结构以及对系统表执行其他某些有风险的操作。否则,即使对于超级用户也不允许这样做。不当使用此设置会导致不可挽回的数据丢失或严重损坏数据库系统。只有超级用户和具有适当
-
backtrace_functions
(string
)- 描述:此参数包含一个用逗号分隔的 C 函数名称列表。如果引发错误,并且发生错误的内部 C 函数的名称与列表中的值匹配,则会将回溯信息与错误消息一起写入服务器日志。这可用于调试源代码的特定区域。并非所有平台都支持回溯,并且回溯的质量取决于编译选项。只有超级用户和具有适当
SET
权限的用户可以更改此设置。
- 描述:此参数包含一个用逗号分隔的 C 函数名称列表。如果引发错误,并且发生错误的内部 C 函数的名称与列表中的值匹配,则会将回溯信息与错误消息一起写入服务器日志。这可用于调试源代码的特定区域。并非所有平台都支持回溯,并且回溯的质量取决于编译选项。只有超级用户和具有适当
-
debug_discard_caches
(integer
)- 描述:当设置为
1
时,每个系统目录缓存项都会在第一个可能的机会失效,无论是否真的发生了会使其失效的任何事情。结果是系统目录的缓存实际上被禁用,因此服务器将运行得非常慢。较高的值会递归运行缓存失效,这会更慢,并且仅对测试缓存逻辑本身有用。0
的默认值选择正常的目录缓存行为。在尝试触发涉及并发目录更改的难以重现的错误时,此参数可能非常有用,但其他情况下很少需要。有关详细信息,请参阅源代码文件inval.c
和pg_config_manual.h
。当在编译时定义DISCARD_CACHES_ENABLED
时,支持此参数(在使用 configure 选项--enable-cassert
时会自动发生)。在生产版本中,其值将始终为0
,并且尝试将其设置为另一个值将引发错误。 - 默认值:
0
。
- 描述:当设置为
-
force_parallel_mode
(enum
)- 描述:允许使用并行查询进行测试,即使在预期不会带来性能好处的情况下也是如此。
force_parallel_mode
的允许值是off
(仅在期望提高性能时使用并行模式)、on
(对所有被认为安全的查询强制并行查询)和regress
(与on
类似,但具有以下解释的附加行为更改)。 - 说明:更具体地说,将该值设置为
on
将在任何查询计划的顶部添加一个Gather
节点,这样查询就可以在并行工作进程中运行。即使并行worker不可用或无法使用,在并行查询上下文中禁止的操作(如启动子事务)也将被禁止,除非计划器认为这将导致查询失败。如果在设置此选项时出现失败或意外结果,则查询使用的某些函数可能需要标记为PARALLEL UNSAFE
(也可能标记为PARALLEL RESTRICTED
)。将此值设置为regress
与将其设置为on
具有相同的效果,加上一些旨在促进自动化回归测试的其他效果。通常,来自并行工作线程的消息包括一个上下文行,表明这一点,但是设置为regress
会抑制该行,以便输出与非并行执行中的输出相同。此外,通过此设置添加到计划的Gather
节点隐藏在EXPLAIN
输出中,以便输出与如果此设置变为off
时将获得的输出相匹配。
- 描述:允许使用并行查询进行测试,即使在预期不会带来性能好处的情况下也是如此。
-
ignore_system_indexes
(boolean
)- 描述:在读取系统表时忽略系统索引(但在修改表时仍更新索引)。在从损坏的系统索引中恢复时,这很有用。此参数在会话启动后无法更改。
-
post_auth_delay
(integer
)- 描述:在执行身份验证过程后,启动新的服务器进程时延迟的时间量。目的是让开发人员有机会使用调试器附加到服务器进程。如果未指定单位,则此值将作为秒数。零值(默认值)会禁用延迟。此参数在会话启动后无法更改。
- 默认值:
0
。
-
pre_auth_delay
(integer
)- 描述:在新的服务器进程分叉后,在执行身份验证过程之前延迟的时间量。目的是让开发人员有机会使用调试器附加到服务器进程,以追踪身份验证中的错误行为。如果未指定单位,则该值将被视为秒。值为零(默认值)将禁用延迟。此参数只能在
postgresql.conf
文件或服务器命令行中设置。 - 默认值:
0
。
- 描述:在新的服务器进程分叉后,在执行身份验证过程之前延迟的时间量。目的是让开发人员有机会使用调试器附加到服务器进程,以追踪身份验证中的错误行为。如果未指定单位,则该值将被视为秒。值为零(默认值)将禁用延迟。此参数只能在
-
trace_notify
(boolean
)- 描述:为
LISTEN
和NOTIFY
命令生成大量调试输出。client_min_messages
或log_min_messages
必须分别为DEBUG1
或更低,才能将此输出发送到客户端或服务器日志。
- 描述:为
-
trace_recovery_messages
(enum
)- 描述:启用对与恢复相关的调试输出的记录,否则不会记录这些输出。此参数允许用户覆盖
log_min_messages
的常规设置,但仅适用于特定消息。这旨在用于调试热备。有效值为DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
和LOG
。默认值LOG
根本不影响记录决策。其他值会导致该优先级或更高优先级的与恢复相关的调试消息被记录,就好像它们具有LOG
优先级一样;对于log_min_messages
的常见设置,这会导致无条件地将它们发送到服务器日志。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 默认值:
LOG
。
- 描述:启用对与恢复相关的调试输出的记录,否则不会记录这些输出。此参数允许用户覆盖
-
trace_sort
(boolean
)- 描述:如果启用,在排序操作期间发出有关资源使用情况的信息。此参数仅在编译 PostgreSQL 时定义了
TRACE_SORT
宏时才可用。(但是,TRACE_SORT
目前默认定义。)
- 描述:如果启用,在排序操作期间发出有关资源使用情况的信息。此参数仅在编译 PostgreSQL 时定义了
-
trace_locks
(boolean
)-
描述:如果启用,发出有关锁使用的信息。转储的信息包括锁操作的类型、锁的类型以及被锁定或解锁的对象的唯一标识符。还包括已针对此对象授予的锁类型的位掩码以及针对此对象等待的锁类型。对于每种锁类型,还会转储已授予锁和等待锁的数量以及总数。下面显示了日志文件输出的示例。正在转储的结构的详细信息可以在
src/include/storage/lock.h
中找到。此参数仅在编译 PostgreSQL 时定义了LOCK_DEBUG
宏时才可用。LOG: LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: GrantLock: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(2) req(1,0,0,0,0,0,0)=1 grant(1,0,0,0,0,0,0)=1 wait(0) type(AccessShareLock) LOG: UnGrantLock: updated: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(INVALID)
-
-
trace_lwlocks
(boolean
)- 描述:如果启用,发出有关轻量级锁使用的信息。轻量级锁主要用于提供对共享内存数据结构的访问互斥。此参数仅在编译 PostgreSQL 时定义了
LOCK_DEBUG
宏时才可用。
- 描述:如果启用,发出有关轻量级锁使用的信息。轻量级锁主要用于提供对共享内存数据结构的访问互斥。此参数仅在编译 PostgreSQL 时定义了
-
trace_userlocks
(boolean
)- 描述:如果启用,发出有关用户锁使用的信息。输出与
trace_locks
相同,仅适用于咨询锁。此参数仅在编译 PostgreSQL 时定义了LOCK_DEBUG
宏时才可用。
- 描述:如果启用,发出有关用户锁使用的信息。输出与
-
trace_lock_oidmin
(integer
)- 描述:如果设置,则不跟踪此 OID 以下的表的锁(用于避免在系统表上输出)。此参数仅在编译 PostgreSQL 时定义了
LOCK_DEBUG
宏时才可用。
- 描述:如果设置,则不跟踪此 OID 以下的表的锁(用于避免在系统表上输出)。此参数仅在编译 PostgreSQL 时定义了
-
trace_lock_table
(integer
)- 描述:无条件地跟踪此表(OID)上的锁。此参数仅在编译 PostgreSQL 时定义了
LOCK_DEBUG
宏时才可用。
- 描述:无条件地跟踪此表(OID)上的锁。此参数仅在编译 PostgreSQL 时定义了
-
debug_deadlocks
(boolean
)- 描述:如果设置,在发生死锁超时时,转储有关所有当前锁的信息。此参数仅在编译 PostgreSQL 时定义了
LOCK_DEBUG
宏时才可用。
- 描述:如果设置,在发生死锁超时时,转储有关所有当前锁的信息。此参数仅在编译 PostgreSQL 时定义了
-
log_btree_build_stats
(boolean
)- 描述:如果设置,记录各种 B 树操作的系统资源使用情况统计信息(内存和 CPU)。此参数仅在编译 PostgreSQL 时定义
BTREE_BUILD_STATS
宏时可用。
- 描述:如果设置,记录各种 B 树操作的系统资源使用情况统计信息(内存和 CPU)。此参数仅在编译 PostgreSQL 时定义
-
wal_consistency_checking
(string
)- 描述:此参数旨在用于检查 WAL 重做例程中的错误。启用后,与 WAL 记录结合修改的任何缓冲区的全页映像将添加到记录中。如果随后重放记录,系统将首先应用每条记录,然后测试记录修改的缓冲区是否与存储的映像匹配。在某些情况下(例如提示位),可以接受次要变体,并且将被忽略。任何意外差异都将导致致命错误,终止恢复。
- 默认值:此设置的默认值为空字符串,它禁用此功能。可以将其设置为
all
以检查所有记录,或将其设置为资源管理器以逗号分隔的列表,以仅检查来自这些资源管理器的记录。当前,受支持的资源管理器有heap
、heap2
、btree
、hash
、gin
、gist
、sequence
、spgist
、brin
和generic
。扩展可以定义其他资源管理器。只有超级用户和具有适当SET
权限的用户才能更改此设置。
-
wal_debug
(boolean
)- 描述:如果打开,则发出与 WAL 相关的调试输出。仅当在编译 PostgreSQL 时定义了
WAL_DEBUG
宏时,此参数才可用。
- 描述:如果打开,则发出与 WAL 相关的调试输出。仅当在编译 PostgreSQL 时定义了
-
ignore_checksum_failure
(boolean
)- 描述:仅当数据校验和已启用时才有效。
- 说明:在读取期间检测到校验和失败通常会导致 PostgreSQL 报告错误,中止当前事务。将
ignore_checksum_failure
设置为 on 会导致系统忽略该失败(但仍会报告警告),并继续处理。此行为可能会导致崩溃、传播或隐藏损坏,或其他严重问题。但是,它可能允许你绕过错误并检索表中可能仍然存在的未损坏元组(如果块头仍然正常)。如果头损坏,即使启用此选项,也会报告错误。默认设置为off
。只有超级用户和具有适当SET
权限的用户才能更改此设置。
-
zero_damaged_pages
(boolean
)- 描述:检测到损坏的页头通常会导致 PostgreSQL 报告错误,中止当前事务。将
zero_damaged_pages
设置为 on 会导致系统改为报告警告,将内存中的损坏页清零,并继续处理。此行为将破坏数据,即损坏页上的所有行。但是,它确实允许你绕过错误并从表中可能存在的任何未损坏页中检索行。如果由于硬件或软件错误导致损坏,则它对于恢复数据非常有用。通常,在你放弃从表的损坏页中恢复数据的希望之前,不应将其设置为 on。不会强制将清零的页写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。 - 默认值:默认设置为
off
。只有超级用户和具有适当SET
权限的用户才能更改此设置。
- 描述:检测到损坏的页头通常会导致 PostgreSQL 报告错误,中止当前事务。将
-
ignore_invalid_pages
(boolean
)- 描述:如果设置为
off
(默认值),在恢复期间检测到对无效页面的引用时,PostgreSQL 会引发 PANIC 级错误,中止恢复。将ignore_invalid_pages
设置为on
会导致系统忽略 WAL 记录中的无效页面引用(但仍会报告警告),并继续恢复。此行为可能会 导致崩溃、数据丢失、传播或隐藏损坏,或其他严重问题。但是,它可能会让你绕过 PANIC 级错误,完成恢复,并启动服务器。该参数只能在服务器启动时设置。它仅在恢复期间或备用模式下有效。 - 默认值:
off
。
- 描述:如果设置为
-
jit_debugging_support
(boolean
)- 描述:如果 LLVM 具有所需功能,则使用 GDB 注册生成函数。这使得调试变得更加容易。
- 默认值:默认设置为
off
。此参数只能在服务器启动时设置。
-
jit_dump_bitcode
(boolean
)- 描述:将生成的 LLVM IR 写入文件系统,位于
data_directory
中。这仅对处理 JIT 实现的内部有用。 - 默认值:默认设置为
off
。只有超级用户和具有适当SET
权限的用户才能更改此设置。
- 描述:将生成的 LLVM IR 写入文件系统,位于
-
jit_expressions
(boolean
)- 描述:确定在激活 JIT 编译时是否对表达式进行 JIT 编译。
- 默认值:默认值为
on
。
-
jit_profiling_support
(boolean
)- 描述:如果 LLVM 具有所需功能,则发出允许 perf 对 JIT 生成的函数进行分析所需的数据。这会将文件写入
~/.debug/jit/
;用户负责在需要时执行清理。 - 默认值:默认设置为
off
。此参数只能在服务器启动时设置。
- 描述:如果 LLVM 具有所需功能,则发出允许 perf 对 JIT 生成的函数进行分析所需的数据。这会将文件写入
-
jit_tuple_deforming
(boolean
)- 描述:确定元组变形是否 JIT 编译,当 JIT 编译被激活时。
- 默认值:默认值为
on
。
-
remove_temp_files_after_crash
(boolean
)- 描述:当设置为
on
(默认值)时,PostgreSQL 将在后端崩溃后自动删除临时文件。如果禁用,文件将被保留,例如用于调试。但是,重复崩溃可能会导致无用文件累积。此参数只能在postgresql.conf
文件或服务器命令行中设置。 - 默认值:
on
。
- 描述:当设置为
-
send_abort_for_crash
(boolean
)- 描述:默认情况下,在后端崩溃后,主控进程将通过向它们发送 SIGQUIT 信号来停止剩余的子进程,允许它们以或多或少优雅的方式退出。当此选项设置为
on
时,将改为发送 SIGABRT。这通常会导致为每个此类子进程生成一个核心转储文件。这有助于在崩溃后调查其他进程的状态。它还可能在重复崩溃时消耗大量磁盘空间,因此请勿在您没有仔细监控的系统上启用此功能。请注意,不存在自动清理核心文件(s) 的支持。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:默认情况下,在后端崩溃后,主控进程将通过向它们发送 SIGQUIT 信号来停止剩余的子进程,允许它们以或多或少优雅的方式退出。当此选项设置为
-
send_abort_for_kill
(boolean
)- 描述:默认情况下,在尝试使用 SIGQUIT 停止子进程后,主控进程将等待五秒钟,然后发送 SIGKILL 以强制立即终止。当此选项设置为
on
时,将发送 SIGABRT 而不是 SIGKILL。这通常会导致为每个此类子进程生成一个核心转储文件。这有助于调查““卡住””子进程的状态。它还可能在重复崩溃时消耗大量磁盘空间,因此请勿在您没有仔细监控的系统上启用此功能。请注意,不存在自动清理核心文件(s) 的支持。此参数只能在postgresql.conf
文件或服务器命令行中设置。
- 描述:默认情况下,在尝试使用 SIGQUIT 停止子进程后,主控进程将等待五秒钟,然后发送 SIGKILL 以强制立即终止。当此选项设置为
-
debug_logical_replication_streaming
(enum
)- 描述:允许的值为
buffered
和immediate
。默认值为buffered
。此参数旨在用于测试大事务的逻辑解码和复制。debug_logical_replication_streaming
对发布者和订阅者的影响不同。 - 影响说明:
- 发布者:在发布者方面,
debug_logical_replication_streaming
允许在逻辑解码中立即流式传输或序列化更改。当设置为immediate
时,如果启用了streaming
选项,则流式传输每个更改,否则序列化每个更改。当设置为buffered
时,当达到logical_decoding_work_mem
时,解码将流式传输或序列化更改。 - 订阅者:在订阅者方面,如果
streaming
选项设置为parallel
,则可以使用debug_logical_replication_streaming
指示领导应用工作器将更改发送到共享内存队列或将所有更改序列化到文件。当设置为buffered
时,领导者通过共享内存队列将更改发送到并行应用工作器。当设置为immediate
时,领导者将所有更改序列化到文件,并通知并行应用工作器在事务结束时读取并应用它们。
- 发布者:在发布者方面,
- 描述:允许的值为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本