甘草片
作者甘草片·2022-01-19 18:06
软件开发工程师·安天科技

postgresql 参数说明.conf

字数 44728阅读 1894评论 0赞 0

-----------------------------

PostgreSQL configuration file

-----------------------------

This file consists of lines of the form:

name = value

(The "=" is optional.) Whitespace may be used. Comments are introduced with

"#" anywhere on a line. The complete list of parameter names and allowed

values can be found in the PostgreSQL documentation.

The commented-out settings shown in this file represent the default values.

Re-commenting a setting is NOT sufficient to revert it to the default value;

you need to reload the server.

This file is read on server startup and when the server receives a SIGHUP

signal. If you edit the file on a running system, you have to SIGHUP the

server for the changes to take effect, or use "pg_ctl reload". Some

parameters, which are marked below, require a server shutdown and restart to

take effect.

Any parameter can also be given as a command-line option to the server, e.g.,

"postgres -c log_connections=on". Some parameters can be changed at run time

with the "SET" SQL command.

Memory units: kB = kilobytes Time units: ms = milliseconds

MB = megabytes s = seconds

GB = gigabytes min = minutes

h = hours

d = days

查看参数命令

(1)show all; --查看所有数据库参数的值

(2)show search_path; --查看参数search_path的值

要是有 1 2 3 段的就是在不同的地方摘录的。共参考。

------------------------------------------------------------------------------

FILE LOCATIONS

------------------------------------------------------------------------------

The default values of these variables are driven from the -D command-line

option or PGDATA environment variable, represented here as ConfigDir.

data_directory = 'ConfigDir' # use data in another directory

# (change requires restart)

hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file

# (change requires restart)

ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file

# (change requires restart)

If external_pid_file is not explicitly set, no extra PID file is written.

external_pid_file = '(none)' # write an extra PID file

# (change requires restart)

------------------------------------------------------------------------------

CONNECTIONS AND AUTHENTICATION

------------------------------------------------------------------------------

- Connection Settings -

listen_addresses = 'localhost' # what IP address(es) to listen on;

# comma-separated list of addresses;

# defaults to 'localhost', '*' = all

# (change requires restart)

这个参数只有在启动数据库时,才能被设置。它指定数据库用来监听客户端连接的TCP/IP地址。

默认是值是* ,表示数据库在启动以后将在运行数据的机器上的所有的IP地址上监听用户请求(如果机器只有一个网卡,

只有一个IP地址,有多个网卡的机器有多个 IP地址)。

可以写成机器的名字,也可以写成IP地址,不同的值用逗号分开,

例如,’server01’, ’140.87.171.49, 140.87.171.21’。

如果被设成localhost,表示数据库只能接受本地的客户端连接请求,

不能接受远程的客户端连接请求。

port = 5432 # (change requires restart)

这个参数只有在启动数据库时,才能被设置。

它指定数据库监听户端连接的TCP端口。默认值是5432

max_connections = 100 # (change requires restart)

1

这个参数只有在启动数据库时,才能被设置。它决定数据库可以同时建立的最大的客户端连接的数目。默认值是100。

2

max_connections: 通常,max_connections的目的是防止max_connections * work_mem超出了实际内存大小。比如,

如果将work_mem设置为实际内存的2%大小,则在极端情况下,如果有50个查询都有排序要求,而且都使 用2%的内存,

则会导致swap的产生,系统性能就会大大降低。当然,如果有4G的内存,同时出现50个如此大的查询的几率应该是很小的。

不过,要清楚 max_connections和work_mem的关系。

3

通常max_connections的目的是防止 max_connections * work_mem 超出了实际内存大小。

比如,如果将work_mem设置为实际内存的2%大小,则在极端情况下,如果有50个查询都有排序要求,

而且都使用2%的内存,则会导致swap的产生,系统性能就会大大降低。

当然,如果有4G的内存,同时出现50个如此大的查询的几率应该是很小的。

不过,要清楚 max_connections和work_mem的关系

Note: Increasing max_connections costs ~400 bytes of shared memory per

connection slot, plus lock space (see max_locks_per_transaction).

如果超出最大的连接数会报:

FATAL: sorry, too many clients already

superuser_reserved_connections = 3 # (change requires restart)

这个参数只有在启动数据库时,才能被设置。它表示预留给超级用户的数据库连接数目。

它的值必须小于max_connections。 普通用户可以在数据库中建立的最大的并发连接的数目是max_connections- superuser_reserved_connections,

默认值是3。

unix_socket_directory = '' # (change requires restart)

unix_socket_group = '' # (change requires restart)

这个参数只有在启动数据库时,才能被设置。设置Unix-domain socket所在的操作系统用户组。

默认值是空串,用启动数据库的操作系统用户所在的组作为Unix-domain socket的用户组。

unix_socket_permissions = 0777 # begin with 0 to use octal notation

# (change requires restart)

这个参数只有在启动数据库时,才能被设置。它设置Unix-domain socket的访问权限,格式与操作系统的文件访问权限是一样的。

默认值是0770,表示任何操作系统用户都能访问Unix-domain socket。

可以设为0770(所有Unix-domain socket文件的所有者所在的组包含的用户都能访问)和0700(只有Unix-domain socket文件的所有者才能访问)。

对于Unix-domain socket,只有写权限才有意义,读和执行权限是没有意义的。

bonjour = off # advertise server via Bonjour

# (change requires restart)

bonjour_name = '' # defaults to the computer name

# (change requires restart)

- Security and Authentication - 安全与认证

authentication_timeout = 1min # 1s-600s

这个参数只能在postgresql.conf文件中被设置,它指定一个时间长度,在这个时间长度内,

必须完成客户端认证操作,否则客户端连接请求将被拒绝。它可以阻止某些客户端进行认证时长时间占用数据库连接。

单位是秒,默认值是60。

ssl = off # (change requires restart)

这个参数只有在启动数据库时,才能被设置。决定数据库是否接受SSL连接。默认值是off。

ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH' # allowed SSL ciphers

# (change requires restart)

指定可以使用的SSL加密算法。查看操作系统关于openssl的用户手册可以得到完整的加密算法列表(执行命令openssl ciphers –v也可以得到)。

ssl_renegotiation_limit = 512MB # amount of data between renegotiations

password_encryption = on

db_user_namespace = off

Kerberos and GSSAPI

krb_server_keyfile = ''

krb_srvname = 'postgres' # (Kerberos only)

krb_caseins_users = off

- TCP Keepalives -

see "man 7 tcp" for details

tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;

# 0 selects the system default

这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。

它设置TCP套接字的TCP_KEEPIDLE属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。

int keepidle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测

tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;

# 0 selects the system default

这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。

它设置TCP套接字的TCP_KEEPINTVL属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。

int keepinterval = 5; // 探测时发包的时间间隔为5 秒

tcp_keepalives_count = 0 # TCP_KEEPCNT;

# 0 selects the system default

这个参数可以在任何时候被设置。默认值是0,意思是使用操作系统的默认值。

它设置TCP套接字的TCP_KEEPCNT属性。这个参数对于通过Unix-domain socket建立的数据库连接没有任何影响。

int keepcount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

------------------------------------------------------------------------------

RESOURCE USAGE (except WAL)

------------------------------------------------------------------------------

- Memory -

shared_buffers = 32MB # min 128kB

# (change requires restart)

1

这个参数只有在启动数据库时,才能被设置。它表示数据缓冲区中的数据块的个数,每个数据块的大小是8KB。

数据缓冲区位于数据库的共享内存中,它越大越好,不能小于128KB。默认值是1024。

2

shared_buffers:这是最重要的参数,postgresql通过shared_buffers和内核和磁盘打交道,因此应该尽量大,

让更多的数据缓存在shared_buffers中。通常设置为实际RAM的10%是合理的,比如50000(400M)

3

shared_buffers = 1/4-1/2 memory in your system #这是最重要的参数,

postgresql通过shared_buffers和内核和磁盘打交道,因此应该尽量大,让更多的数据缓存在shared_buffers中

4

读数据时:

数据库先在共享内存里查找,找不到的话,再检索磁盘。检索磁盘时先查OS的缓存,找不到的话才会实际扫描磁盘。然后把数据放到OS的缓存,再返回给数据库,也就是放到共享内存里面。

按照这个逻辑,同一份数据,同时存在于OS的缓存和数据库的共享内存里面。 如果OS的缓存太小的化,就会放生swap,把数据放到磁盘里,当然效率也就会降低了。

写数据时:

和读数据相反,先更新共享内存里面的内容,攒到一定数量或者到了一定时间段,再把更新的数据反应给OS。OS也是先更新到缓存,再实际更新到磁盘里。

如果需要更新的数据超过了OS的缓存,更新处理会等OS整理缓存以得到可利用的空间。

更新处理比较多的数据库,或者vacuum处理的时候,需要占用大量OS缓存。一定时间内无法确保到需要的空间时,数据库服务也有可能会停止。

综上所述,共享内存的值与OS的缓存一致是比较安全的。

如果以检索为主的话,共享内存大一些也没什么问题吧。当然前提是数据库基本都能放到共享内存里。

查询类的几个参数可以用以下的关系表示。

物理内存 = work_mem " 最大同时连接数" 平均使用work_mem数 + shared_buffers + effective_cache_size

以上公式只适用于数据库专用服务器的场合

5

Postgres 启动时要到的固定内存。每个allocation是8k。 Postgres不直接做硬盘读写,而是把硬盘中的东西放入Shared Buffers,然后更改Shared Buffers,在flush 到硬盘去。

通常 Shared Buffers设定为内存(available memory)的25%-40%左右。

在系统(OS)中,记得设置 kernel.shmmax的值(/etc/sysctl.conf)

kernel.shmmax决定了进程可调用的最大共享内存数量。简单的计 算方法是

kernel.shmmax=postgres shared_buffers + 32 MB

要保留足够的空间(不然会out of memory)postgresql除了shared buffer还会用到一些其他的内存,例如max_connections, max_locks_pre_transaction

temp_buffers = 8MB # min 800kB

1

这个参数可以在任何时候被设置。默认值是8MB。它决定存放临时表的数据缓冲区中的数据块的个数,每个数据块的大小是8KB。

临时表缓冲区存放在每个数据库进程的 私有内存 中,而不是存放在数据库的共享内存中。默认值是1024。

2

设置每个数据库会话使用的临时缓冲区的最大数目,

这些都是会话的本地缓冲区,只用于访问临时表。缺省是 1000。

这个设置可以再独立的会话内部设置,但是只有在会话第一次使用临时表的时候才能增长,在该会话里随后的改变该数值的企图将没有作用。

一个会话将按照 temp_buffers 给出的限制,根据需要分配临时缓冲区。

如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,

其开销只是一个缓冲区描述符,或者说每次temp_buffers里的增加大概64字节,

不过,如果一个缓冲区实际上被使用,那么就会有额外的8192字节为之消耗(或者,概括来说是 BLCKSZ 字节)。

max_prepared_transactions = 0 # zero disables the feature

# (change requires restart)

1

这个参数只有在启动数据库时,才能被设置。它决定能够同时处于prepared状态的事务的最大数目(参考PREPARE TRANSACTION命令)。

如果它的值被设为0。则将数据库将关闭prepared事务的特性。它的值通常应该和max_connections的值 一样大。默认值是5。

2

设置可以同时处于"准备好"状态的事务的最大数目,把这个参数设置为零则关闭准备好的事务的特性,

缺省是 5,这个选项只能在服务器启动的时候设置,

如果你不使用准备好事务,这个参数也可以设置为零。

如果你使用它们,你可能会需要把 max_prepared_transactions 设置成至少和 max_connections 一样大,

以避免在准备步骤的失败,增加这个参数可能会导致 PostgreSQL 要求比缺省的操作系统配置的更多的 System V 共享内存。

如果超出最大的连接数会报:

FATAL: sorry, too many clients already

它的值通常应该和max_connections的值 一样大。默认值是

Note: Increasing max_prepared_transactions costs ~600 bytes of shared memory

per transaction slot, plus lock space (see max_locks_per_transaction).

It is not advisable to set max_prepared_transactions nonzero unless you

actively intend to use prepared transactions.

work_mem = 1MB # min 64kB

1

这个参数可以在任何时候被设置。它决定数据库的排序操作和哈希表使用的内存缓冲区的大小。

如何work_mem指定的内存被耗尽,数据库将使用磁盘文件进 行完成操作,速度会慢很多。

ORDER BY、DISTINCT和merge连接会使用排序操作。哈希表在Hash连接、hash聚集函数和用哈希表来处理IN谓词中的子查询中被使用。

单位是 KB,默认值是1024。

2

work_mem: 在pgsql 8.0之前叫做sort_mem。postgresql在执行排序操作时,

会根据work_mem的大小决定是否将一个大的结果集拆分为几个小的和 work_mem查不多大小的临时文件。

显然拆分的结果是降低了排序的速度。因此增加work_mem有助于提高排序的速度。通常设置为实际RAM的2% -4%,

根据需要排序结果集的大小而定,比如81920(80M)

3

EnterpriseDB在执行排序操作时,会根据work_mem的大小决定是否将一个大的结果集拆分为几个小的

和work_mem查不多大小的临时文件。显然拆分的结果是降低了排序的速度。

因此增加work_mem有助于提高排序的速度。及散列表在散列连接,散列为基础的聚集,以及散列为基础的 IN 子查询处理中都要用到。

通常设置为实际RAM的2% -4%,根据需要排序结果集的大小而定,比如81920(80M)

4

该参数是postgresql每个进程可以使用的工作内存空间。如果进程需要的容量超过了这个范围,就要把处理内容输出到临时文件里,相当于OS的swap处理。

查询时如果用到了排序,哈希关联,bitmap检索等方式的话,就要分别利用work_mem的内存空间。也就是一个SQL语句可能会同时使用多个工作内存空间,而不是共用一个。

设置这个参数的时候,就要考虑到同时连接数以及每个连接平均使用的内存空间数。总内存数减去 (同时连接数”平均使用数的总和),

剩下的才是OS和postgresql可以利用的缓存。(参考值,不是绝对值) 设置的太大的话,反倒会引起OS的swap,影响性能。

5

这个是postgres运行作业中 (task)需要的内存,例如内存内的hashed (aggregates, hash joins)sort (order by, distinct 等等)合理的设定,

可以保证postgres在做这些东西的时候可以完全在内存内完成,而不需要把数据吐回到硬盘上去作swap。

但是设定太大的话,会造 成postgres使用的内存大于实际机器的内存,这个时候就会去硬盘swap了。(效能下降)

working memory是per connection and per sort的设定。所以设定一定要非常小心。举例来说,如果设定working memory为32MB,

那么以下例子:

select * from lines, lineitems

where lines.lineid = lineitems.lineid

and lineid=6

order by baz;

这里就可 能用到64MB的内存。

hashjoin between lines and lineitems (32MB)

order by baz (32MB)

要注意自己有多少query是用到了order by或者join

如果同时有100个链接,那么就是 100 connection X 64MB = 6400MB (6G) 内存

通常来说,working mem不要给太大,2-4MB足够

在postgres 8.3之后的版本,working mem可以在query中设定

Query:

begin;

set work_mem to ’128MB’;

select * from foo order by bar;

insert into foo values (‘bar’);

reset work_mem;

commit;

Function:

create function return_foo() returns setof text as

$ select * from foo order by bar; $

SET work_mem to ’128MB’

LANGUAGE ‘sql’

postgres官方不建议(但是支持)在 postgresql.conf文件中更改work_mem然后HUP (数据库应该没有任何中断)

利用 explain analyze可以检查是否有足够的work_mem

sort (cost=0.02..0.03 rows=1 width=0) (actual time=2270.744..22588.341 rows=1000000 loops=1)

Sort Key: (generate_series(1, 1000000))

Sort Method: external merge Disk:13696kb

-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.006..144.720 rows=1000000 loops=1)

Total runtime: 3009.218 ms

(5 rows)

以上的 query分析显示,这里需要从硬盘走13MB的东西。所以这个query应给set work_mem到16MB才能确保性能

下面是测试数据(谭洪伟)

SET = '2048MB'; (可以每个session 去设置)

workwork_mem_mem

环境:数据量 28G 导出数据 300M

create table athw1111112350dd5 as --查询成功: 共计 3328060 行受到影响,耗时: 613284 毫秒(ms)。 work_mem = 30MB

--查询成功: 共计 3328060 行受到影响,耗时: 26567 毫秒(ms)。 work_mem = 2048MB

--查询成功: 共计 3328060 行受到影响,耗时: 709130 毫秒(ms)。 work_mem = 6MB

--查询成功: 共计 3328060 行受到影响,耗时: 27534 毫秒(ms)。 work_mem = 1024MB

--查询成功: 共计 3328060 行受到影响,耗时: 32339 毫秒(ms)。 work_mem = 500MB

--查询成功: 共计 3328060 行受到影响,耗时: 709130 毫秒(ms) work_mem = 300MB

select md5,crc32 ,count(*) from t_segment_sig

group by md5,crc32

order by count(*)

--查询成功: 共计 3328060 行受到影响,耗时: 24236 毫秒(ms)。 work_mem = '3000MB';

--查询成功: 共计 3328060 行受到影响,耗时: 604236 毫秒(ms)。 work_mem = '3MB';

SET work_mem = '3MB';

create table athw2555r656r as

select distinct md5,crc32 from t_segment_sig

maintenance_work_mem = 16MB # min 1MB (恢复时有用)

0

在建立索引的时候会用到,而且很有用,这个测试过了。索引排序不用 work_mem 而是用的 maintenance_work_mem 所以在建立主键,索引时就要用这个参数。

1

这个参数可以在任何时候被设置。它决定数据库的维护操作使用的内存空间的大小。

数据库的维护操作包括VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等操作。

maintenance_work_mem的值如果比较大,通常可以缩短VACUUM数据库和从dump文件中恢复数据库需要的时间。

maintenance_work_mem存放在每个数据库进程的私有内存中,而不是存放在数据库的共享内存中。单位是KB,默认值是16384。

2

maintence_work_mem:这里定义的内存只是在CREATE INDEX, VACUUM等时用到,因此用到的频率不高,

但是往往这些指令消耗比较多的资源,因此应该尽快让这些指令快速执行完毕:给maintence_work_mem大的内存,比如512M(524288)

3

这里定义的内存只是在CREATE INDEX, VACUUM等时用到,

因此用到的频率不高,但是往往这些指令消耗比较多的资源,因为在一个数据库会话里,

任意时刻只有一个这样的操作可以执行,并且一个数据库安装通常不会有太多这样的工作并发执行,

把这个数值设置得比 work_mem 更大是安全的。更大的设置可以改进清理和恢复数据库转储的速度。

因此应该尽快让这些指令快速执行完毕:给maintence_work_mem大的内存,比如512M(524288)

4

并且需要注意如果开启了autovacuum, 最大可能有autovacuum_max_workers*maintenance_work_mem的内存被系统消耗掉.

5

maintenance_work_mem 决定系统作维护时可以调用的内存大小。

这个也是同样可以在query中随时设定。

这个内存只有在VACUUM, CREATE INDEX 以及 REINDEX 等等系统维护指令的时候才会用到。

系统维护是,调用硬盘swap会大大降低系统效能。通常maintenance_work_mem超过1G的时候并没有

什么实际的效能增加(如果内存够, 设定在1G足以)

下面是列子:

---查询成功但无结果,耗时: 716102 毫秒(ms)。 SET work_mem = '15000MB'; SET maintenance_work_mem = '15000MB';

--- 查询成功但无结果,耗时: 735225 毫秒(ms)。 SET work_mem = '15000MB'; SET maintenance_work_mem = '15MB';

---查询成功但无结果,耗时: 727605 毫秒(ms)。 SET work_mem = '15MB'; SET maintenance_work_mem = '15000MB';

--- 查询成功但无结果,耗时: 755316 毫秒(ms)。 SET work_mem = '15MB'; SET maintenance_work_mem = '15MB';

SET work_mem = '15MB';

SET maintenance_work_mem = '15000MB';

--drop index in_dex_t77

--drop index in_dex_t77

create index in_dex_t7755 on t_segment_sig (md5,crc32)

备注(THW):

-- maintenance_work_mem 参数调整后没有太大的改进,影响不大。据说调整CPU的主频效果比较明显。

max_stack_depth = 2MB # min 100kB

1

这个参数可以在任何时候被设置,但只有数据库超级用户才能修改它。

它决定一个数据库进程在运行时的STACK所占的空间的最大值。

数据库进程在运行时,会 自动检查自己的STACK大小是否超过max_stack_depth,如果超过,会自动终止当前事务。

这个值应该比操作系统设置的进程STACK的大小 的上限小1MB。

使用操作系统命令“ulimit –s“可以得到操作系统设置的进程STACK的最大值。

单位是KB,默认值是100。

2

声明服务器的执行堆栈的最大安全深度。

内核强制的实际堆栈尺寸(就是 ulimit -s 或者局部等效物的设置),

小于一个安全的一兆字节左右的范围。需要这么一个安全的界限是因为在服务器里,

并非所有过程都检查了堆栈深度, 而只是在可能递规的过程,比如表达式计算这样的过程里面进行检查。

把这个参数设置得大于实际的内核限制讲意味着一个正在跑的递归函数可能会导致一个独立服务器进程的崩溃。

缺省设置是 2048 KB (两兆),这个值相对比较小,不容易导致崩溃。

但是,这个值可能太小了,以至于无法执行复杂的函数。

一般设置为比系统限制的略少,ulimit -a : stack size (kbytes, -s) 10240

- Kernel Resource Usage -

max_files_per_process = 1000 # min 25

# (change requires restart)

这个参数只有在启动数据库时,才能被设置。他设定每个数据库进程能够打开的文件的数目。默认值是1000

shared_preload_libraries = '' # (change requires restart)

这个参数只有在启动数据库时,才能被设置。它设置数据库在启动时要加载的操作系统共享库文件。

如果有多个库文件,名字用逗号分开。如果数据库在启动时未找到shared_preload_libraries指定的某个库文件,

数据库将无法启动。默认值为空串。

- Cost-Based Vacuum Delay -

执行VACUUM 和ANALYZE命令时,因为它们会消耗大量的CPU与IO资源,而且执行一次要花很长时间,

这样会干扰系统执行应用程序发出的SQL命令。为了解决这个 问题,VACUUM 和ANALYZE命令执行一段时间后,

系统会暂时终止它们的运行,过一段时间后再继续执行这两个命令。这个特性在默认的情况下是关闭的。

将参数 vacuum_cost_delay设为一个非零的正整数就可以打开这个特性。

用户通常只需要设置参数vacuum_cost_delay和vacuum_cost_limit,其它的参数使用默认值即可。

VACUUM 和ANALYZE命令在执行过程中,系统会计算它们执行消耗的资源,资源的数量用一个正整数表示,

如果资源的数量超过 vacuum_cost_limit,则执行命令的进程会进入睡眠状态,睡眠的时间长度是是vacuum_cost_delay。

vacuum_cost_limit的值越大,VACUUM 和ANALYZE命令在执行的过程中,睡眠的次数就越少,反之,

vacuum_cost_limit的值越小,VACUUM 和ANALYZE命令在执行的过程中,睡眠的次数就越多。

vacuum_cost_delay = 0ms # 0-100 milliseconds

1

这个参数可以在任何时候被设置。默认值是0。它决定执行VACUUM 和ANALYZE命令的进程的睡眠时间。

单位是微秒。它的值最好是10的整数,如果不是10的整数,系统会自动将它设为比该值大的并且最接近该值的是10 的倍数的整数。

如果值是0,VACUUM 和ANALYZE命令在执行过程中不会主动进入睡眠状态,会一直执行下去直到结束。

2

*以毫秒计的时间长度,如果超过了开销限制,那么进程将睡眠一会儿,缺省值是 0,它关闭基于开销的清理延迟特性。

正数值打开基于开销的清理,不过要注意在许多系统上 sleep 延迟的有效分辨率是 10 毫秒;

把 vacuum_cost_delay 设置为一个不是 10 的整数倍的数值与将它设置为下一个 10 的整数倍作用相同。

vacuum_cost_page_hit = 1 # 0-10000 credits

清理一个在共享缓存里找到的缓冲区的预计开销。它代表锁住缓冲池,查找共享的散列表以及扫描页面的内容的开销。缺省值是 1。

vacuum_cost_page_miss = 10 # 0-10000 credits

清理一个要从磁盘上读取的缓冲区的估计开销。这个行为代表锁住缓冲池,查找共享散列表,从磁盘读取需要的数据块以及扫描它的内容的开销。缺省值是 10。

vacuum_cost_page_dirty = 20 # 0-10000 credits

如果清理修改一个原先是干净的块的预计开销,它需要一个把脏的磁盘块再次冲刷到磁盘上的额外开销。缺省值是 20。

vacuum_cost_limit = 200 # 1-10000 credits

注意: 有些操作会持有关键的锁,并且应该尽快结束。

在这样的操作过程中,基于开销的清理延迟不会发生作用。为了避免在这种情况下的长延时,

实际的延迟是:vacuum_cost_delayaccumulated_balance/vacuum_cost_limit与vacuum_cost_delay4之间的最大值

- Background Writer -后台写数据库进程

1

后台写数据库进程负责将数据缓冲区中的被修改的数据块(又叫脏数据块)写回到数据库物理文件中

2

功能:

负责定时写 shared buffer cache 中的 dirty shared buffers

好处:

a. 减少系统flush shared buffers到硬盘(已经被bgwriter做了)

b. 在checkpoint中,不会看到I/O的突然性暴增,因为dirty buffers在背景中已经被flush进硬盘

坏处:

因为一直定时在背后flush disk,会看到平均硬盘I/O怎加(好过checkpoint时I/O暴增

bgwriter_delay = 200ms # 10-10000ms between rounds

1

这个参数只能在文件postgresql.conf中设置。它决定后台写数据库进程的睡眠时间。

后台写数据库进程每次完成写数据到物理文件中的任务以后, 就会睡眠bgwriter_delay指定的时间。

bgwriter_delay的值应该是10的倍数,如果用户设定的值不是10的倍数,

数据库会自动将参数的值设为比用户指定的值大的最接近用户指定的值 的同时是10的倍数的值。单位是毫秒,默认值是200

2

声明后端写进程活跃回合之间的延迟。在每个回合里,写进程都会为一些脏的缓冲区发出写操作。

然后它就休眠 bgwriter_delay 毫秒,然后重复动作。缺省值是 200。

请注意在许多系统上,休眠延时的有效分辨率是 10 毫秒;

因此,设置 bgwriter_delay 为一个不是 10 的倍数的数值与把它设置为下一个 10 的倍数是一样的效果。

这个选项只能在服务器启动的时候。

3

默认bgwriter进程执行一次后会停顿200ms再被唤醒执行下一次操作,

当数据库的写操作很频繁的时候, 200ms可能太长,

导致其他进程需要花费过多的时间来进行bgwriter的操作( 如果写的太频繁了就把参数设置为:bgwriter_delay = 10ms ).

bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round

1

这个参数只能在文件postgresql.conf中设置。默认值是100。后台写数据库进程每次写脏数据块时,

写到外部文件中的脏数据块的个数不能超过 bgwriter_lru_maxpages指定的值。例如,如果它的值是500,

则后台写数据库进程每次写到物理文件的数据页的个数不能超过500,若 超过,进程将进入睡眠状态,

等下次醒来再执行写物理文件的任务。如果它的值被设为0, 后台写数据库进程将不会写任何物理文件(但还会执行检查点操作)。

2

决 定每次bgwriter写多少数据。如果实际数据大于这里的设定,

那么剩余数据将会被postgres的进程(server process)来完成。

server porcess自己写的数据会造成一定的性能下降。如果想确定所有的数据都由bgwriter来写,

可以设定这里的值为-1

bgwriter_lru_multiplier = 2.0 # 0-10.0 multipler on buffers scanned/round

1

这个参数只能在文件postgresql.conf中设置。默认值是2.0。它决定后台写数据库进程每次写物理文件时,

写到外部文件中的脏数据块的个数 (不能超过bgwriter_lru_maxpages指定的值)。

一般使用默认值即可,不需要修改这个参数。这个参数的值越大,后台写数据库进程每次写 的脏数据块的个数就越多。

2

采 用计算的方式来决定多少数据应该被bgwriter来写。这里保持内置的2.0就可以。

计算bgwriter的I/O:

1000 / bgwriter_delay bgwriter_lru_maxpages 8192 = 实际I/O

(8192是 postgres的8k block)

例如:

1000/200 100 8192 = 4096000 = 4000 kb

bgwrater 可以用 pg_stat_bgwriter 来监测。如果想要观察bgwrater 的运行状况,记得首先清理旧的stat信息。

bgwriter如果设定的太大(做太多事情)那么就会影响到前台的效能 (server)但是如果由系统(server)来做buffer flush同样会影响效能。

所以这里的最好设定就是通过观察 pg_stat_bgwriter 来找到一个最佳的平衡点。

- Asynchronous Behavior -

effective_io_concurrency = 1 # 1-1000. 0 disables prefetching

------------------------------------------------------------------------------

WRITE AHEAD LOG

------------------------------------------------------------------------------

postgres中的所有写动作都是首先写入WAL,然后才执行的。这样可以确保数据的准确跟 完整。当中途数据库崩溃的时候,postgres可以通过WAL恢复到崩溃前的状况而不会出现数据错误等等问题。

WAL 会在两种情况下被回写硬盘。

  1. commit。 当commit数据的时候,WAL会被强制写回硬盘(flush)并且所有这个commit之前的东西如果在WAL中,也会一同被flush。
  2. WAL writer进程自己会定时回写。

FSYNC vs ASYNC

postgres 的 default 是做 fsync,也就是说postgres会等待数据被写入硬盘,才会给query返回成功的信号。

如果设定sync=no关闭fsync的话,postgres不会等待WAL会写硬盘,就直接返回query成功。通常这个会带来15-25%的性能提升。

但是缺点就是,如果系统崩溃 (断电,postgres挂掉)的时候,你将有可能丢失最后那个transcation.

不过这个并不会造成你系统的数据结构问题。(no data corrupt)如果说在系统出问 题的时候丢失1-2笔数据是可以接受的,

那么25%的性能提升是很可观的。

- Settings -

wal_level = minimal # minimal, archive, or hot_standby

# (change requires restart)

fsync = on # turns forced synchronization on or off

该参数直接控制日志是否先写入磁盘。默认值是ON(先写入)。

开启该值时表明,更新数据写入磁盘时系统必须等待WAL的写入完成。

可以配置该参数为OFF,更新数据写入磁盘完全不用等待WAL的写入完成,

没有了等待的时间,显然接下来的工作能够更早的去做,节省了时间,提高了性能。

其直接隐患是无法保证在系统崩溃时最近的事务能够得到恢复,也就无法保证相关数据的真实与正确性。

synchronous_commit = on # synchronization level; on, off, or local

参数表明是否等待WAL完成后才返回给用户事务的状态信息。

默认值是ON,表明必须等待WAL完成后才返回事务状态信息。

配置OFF值能够更快的反馈回事务状态。因参数只是控制事务的状态反馈,因此对于数据的一致性不存在风险。

但事务的状态信息影响着数据库的整个状态。

该参数可以灵活的配置,对于业务没有严谨要求的事务可以配置为OFF,能够为系统的性能带来不小的提升。

wal_sync_method = fsync # the default is the first option

# supported by the operating system:

# open_datasync

# fdatasync (default on Linux)

# fsync

# fsync_writethrough

# open_sync

full_page_writes = on # recover from partial page writes

这个参数只能在postgresql.conf文件中被设置。默认值是on。打开这个参数,可以提高数据库的可靠性,

减少数据丢失的概率,但是会产生过多的事务日志,降低数据库的性能。

wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers

# (change requires restart)

1

这个参数只有在启动数据库时,才能被设置。默认值是8。

它指定事务日志缓冲区中包含的数据块的个数,每个数据块的大小是8KB,所以默认的事务日志缓冲区的大小是8*8=64KB。

事务日志缓冲区位于数据库的共享内存中。

2

WAL 的储存大小。default 是 64 kb。 实验证明, 设定这个值在 256 kb 到 1 MB 之间会提升效能。

3

wal buffers默认是-1 根据shared_buffers的设置自动调整shared_buffers*3% .最大限制是XLOG的segment_size.

wal_writer_delay = 200ms # 1-10000 milliseconds

1

这个参数只能在postgresql.conf文件中被设置。它决定写事务日志进程的睡眠时间。

WAL进程每次在完成写事务日志的任务后,就会睡眠 wal_writer_delay指定的时间,

然后醒来,继续将新产生的事务日志从缓冲区写到WAL文件中。单位是毫秒(millisecond),默认 值是200。

2

WAL 检查WAL数据(回写)的间隔时间。值是毫秒(milliseconds)

commit_delay = 0 # range 0-100000, in microseconds

这个参数可以在任何时候被设置。它设定事务在发出提交命令以后的睡眠时间,

只有在睡眠了commit_delay指定的时间以后,事务产生的事务日志才会 被写到事务日志文件中,

事务才能真正地提交。增大这个参数会增加用户的等待时间,但是可以让多个事务被同时提交,

提高系统的性能。如果数据库中的负载比较 高,而且大部分事务都是更新类型的事务,可以考虑增大这个参数的值。

下面的参数commit_siblings会影响commit_delay是否生效。 默认值是0,单位是微秒(microsecond)。

commit_siblings = 5 # range 1-1000 ?

这个参数可以在任何时候被设置。这个参数的值决定参数commit_delay是否生效。

假设commit_siblings的值是5,如果一个事务发出 一个提交请求,此时,

如果数据库中正在执行的事务的个数大于或等于5,那么该事务将睡眠commit_delay指定的时间。

如果数据库中正在执行的事务 的个数小于5,这个事务将直接提交。默认值是5。

- Checkpoints -

Checkpoints(其他资料的解释挺好的)

确保数据回写硬盘。dirty data page会被 flushed回硬盘。

checkpoint 由以下3中条件激发 (bgwriter如果设定,会帮忙在后台写入,所以就不会有checkpoint时候的短期高I/O出现)

  1. 到达设定的WAL segments
  2. 到达设定的timeout
  3. 用户下达checkpoint指令

如果 checkpoint运行频率高于checkpint_warning值。postgres会在日志(log)中记录出来,通过观察log,可以来决定 checkpoint_segments的设定。

增加cehckpoint_segments或者checkpoint_timeout可以有一 定的效能提升。而唯一的坏处就是如果系统挂了,在重启的时需要多一点时间来回复(系统启动回复期间数据库是不能用的)鉴于postgres很少挂掉,这个 其实可以设定的很长(1天都可以)

设定:

checkpoint_segments 最多的wal log数量,到达后会激发checkpoint,通常设定在30就好

checkpoint_timeout 一般设置15-20分钟,常的可以设定1天也没关系

checkpoint_completion_target 这个保持不动就好。内建是0.5,意思就是每个checkpoint预计在下个checkpoint完成前的一半时间内完成(听起来有点绕嘴,呵呵)

checkpoint_warning 如果checkpint速度快于这个时间,在log中记录。内建是30秒

理论中的完美设定,就是你的backend从来不用回写硬盘。 东西都是由background来写入的。这个就要靠调整bgwriter, checkpoints跟wal到一个最佳平衡状态。当然这个是理想中的完美,想真的做到。。。继续想吧。呵呵

checkpoint_segments = 3 # in logfile segments, min 1, 16MB each

1

这个参数只能在postgresql.conf文件中被设置。默认值是3。它影响系统何时启动一个检查点操作。

如果上次检查点操作结束以后,系统产生的事 务日志文件的个数超过checkpoint_segments的值,

系统就会自动启动一个检查点操作。增大这个参数会增加数据库崩溃以后恢复操作需要的时 间。

2

多少个xlog file产生后开始checkpoint操作, 这个值越大, 允许shared_buffer中的被频繁访问的脏数据存储得更久. 一定程度上可以提高数据库性能. 但是太大的话会导致在数据库发生checkpoint的时候需要处理更多的脏数据带来长时间的IO开销. 太小的话会导致产生更多的WAL文件(因为full page writes=on,CHECKPOINT后的第一次块的改变要写全块,

checkpoint越频繁, 越多的数据更新要写全块导致产生更多WAL). (如 checkpoint_segments = 30)

checkpoint_timeout = 5min # range 30s-1h

1

这个参数只能在postgresql.conf文件中被设置。单位是秒,默认值是300。

它影响系统何时启动一个检查点操作。如果现在的时间减去上次检查 点操作结束的时间超过了checkpoint_timeout的值,

系统就会自动启动一个检查点操作。增大这个参数会增加数据库崩溃以后恢复操作需要的时 间。

checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 ?

1

这个参数控制检查点操作的执行时间。合法的取值在0到1之间,默认值是0.5。

不要轻易地改变这个参数的值,使用默认值即可。 这个参数只能在postgresql.conf文件中被设置。

2

该参数表示checkpoint的完成目标,系统默认值是0.5,也就是说每个checkpoint需要在checkpoints间隔时间的50%内完成。

3

checkpoint_timeout是5分钟,而checkpoint_completion_target是0.5的话,

那么实际上是用了2分30秒来分步写入变更过的数据。每次写入不需要大量的缓存,可以加快写入效率。

当然是越分步越好了,所以推荐设置成0.9。 当然不能超过1啦,会跟下一次的写入发生冲突

checkpoint_warning = 30s # 0 disables

系统默认值是30秒,如果checkpoints的实际发生间隔小于该参数,

将会在server log中写入写入一条相关信息。可以通过设置为0禁用信息写入。

备注:

checkpoint执行控制:

1,数据量达到checkpoint_segments*16M时,系统自动触发;

2,时间间隔达到checkpoint_timeout参数值时;

3,用户发出checkpoint命令时。

checkpoints参数调整:

正确合适的参数值总能够给系统带来益处,checkpoints参数合理的配置不仅能够减少系统IO写入的阻塞,同时还会减少高峰时IO给系统带来的压力。

首先可以通过观察checkpoint_warning参数写入的日志,来估算系统写入的数据量:一般情况下checkpoint_warning参数值小于checkpoint_timeout;

估算公式:checkpoint_segments16M(60s/m)/checkpoint_warning=大致每分钟数据量,得到每分钟写入的数据量(这里全部是估算,建立在warning参数的合理设置上)。

合理配置情况:checkpoint_segments16Mcheckpoint_timeout(m)略大于上述值.

以上述公式为依据,配置checkpoint_segments与checkpoint_timeout,两个参数应该尽量平衡为一个足够大和足够小的值。

在数据量异常高的情况下应该考虑,磁盘带宽与checkpoint时数据量的关系。

个人观点:

假如以checkpoint_segments参数为阀值时,可以计算高峰时需要的带宽(秒):checkpoint_segments16M/(checkpoint_warningcheckpoint_completion_target)。

假如以checkpoint_timeout参数为阀值时,checkpoint_warning值最好大于等于checkpoint_timeout,通过监控系统数据字典统计写入的数据量Total。

Total/(checkpoint_timeout*checkpoint_completion_target)得到IO的带宽要求。

- Archiving - 归档模式

archive_mode = off # allows archiving to be done

# (change requires restart)

这个参数只有在启动数据库时,才能被设置。默认值是off。它决定数据库是否打开归档模式。

archive_command = '' # command to use to archive a logfile segment

archive_dir (string)

这个参数只有在启动数据库时,才能被设置。默认值是空串。它设定存放归档事务日志文件的目录。

archive_timeout = 0 # force a logfile segment switch after this

# number of seconds; 0 disables

这个参数只能在postgresql.conf文件中被设置。默认值是0。单位是秒。

如果archive_timeout的值不是0,而且当前时间减去数 据库上次进行事务日志文件切换的时间大于archive_timeout的值,

数据库将进行一次事务日志文件切换。一般情况下,数据库只有在一个事务日志 文件写满以后,才会切换到下一个事务日志文件,

设定这个参数可以让数据库在一个事务日志文件尚未写满的情况下切换到下一个事务日志文件。

------------------------------------------------------------------------------

REPLICATION

------------------------------------------------------------------------------

- Master Server -

These settings are ignored on a standby server

max_wal_senders = 0 # max number of walsender processes

# (change requires restart)

wal_sender_delay = 1s # walsender cycle time, 1-10000 milliseconds

wal_keep_segments = 0 # in logfile segments, 16MB each; 0 disables

vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed

replication_timeout = 60s # in milliseconds; 0 disables

synchronous_standby_names = '' # standby servers that provide sync rep

# comma-separated list of application_name

# from standby(s); '*' = all

- Standby Servers -

These settings are ignored on a master server

hot_standby = off # "on" allows queries during recovery

# (change requires restart)

max_standby_archive_delay = 30s # max delay before canceling queries

# when reading WAL from archive;

# -1 allows indefinite delay

max_standby_streaming_delay = 30s # max delay before canceling queries

# when reading streaming WAL;

# -1 allows indefinite delay

wal_receiver_status_interval = 10s # send replies at least this often

# 0 disables

hot_standby_feedback = off # send info from standby to prevent

# query conflicts

------------------------------------------------------------------------------

QUERY TUNING

------------------------------------------------------------------------------

- Planner Method Configuration -

enable_bitmapscan = on

enable_hashagg = on

enable_hashjoin = on

打开或者关闭nested-loop join。默认值是 on。不可能完全不使用nested-loop join,

关闭这个参数会让系统在有其它存取方法可用的情况下,不使用nested-loop join。

enable_indexscan = on

enable_material = on

enable_mergejoin = on

enable_nestloop = on

打开或者关闭nested-loop join。默认值是 on。不可能完全不使用nested-loop join,

关闭这个参数会让系统在有其它存取方法可用的情况下,不使用nested-loop join。

enable_seqscan = on

打开或者关闭sequential scan。默认值是 on。不可能完全不使用sequential scan,

关闭这个参数会让系统在有其它存取方法可用的情况下,不使用sequential scan。

enable_sort = on

enable_tidscan = on

- Planner Cost Constants -

优化器用一个正的浮点数来表示不同的查询计划的执行成本,每个基本的数据库操作都会被赋给一个确定的成本常量,

优化器根据每个基本操作的执行成本来计算每个查询计划的执行成本。不要轻易地改变下面的参数的值,使用它们的默认值即可。

seq_page_cost = 1.0 # measured on an arbitrary scale

设置从数据文件上顺序读取一个数据块的执行成本。默认值是1.0

random_page_cost = 4.0 # same scale as above

1

设置从数据文件上随机读取一个数据块的执行成本。默认值是4.0

2

索引可以增加查询效率,而该参数的设置会影响数据库是否积极地使用索引。

默认的索引是树状结构,根据索引来检索数据的时候,是根据索引的匹配结果再到实际表中的对应位置读取数据。

从磁盘的角度来讲,这种读取数据的方式叫做乱序读取(正式叫法不清楚...)。

相反,不利用索引,直接扫描表的方式叫做顺序读取。

乱序读取当然比顺序读取要慢。而postgresql用random_page_cost参数来设置乱序读取要比顺序读取慢多少(倍)。

现在我们使用的新服务器的内存比数据库要大3倍,所以理论上所有的数据都能放入内存。这样的话,

乱序读取和顺序读取的效率不会差多少。而默认的4倍就不合适了。这次我们把它设置为1,

也就是说和顺序读取一样的效率,让数据库积极的使用索引来检索数据

3

这个参数是说数据库中随机的PAGE访问的开销占seq_page_cost的多少倍 , seq_page_cost默认是1.

其他的开销都是seq_page_cost的倍数. 这些都用于基于成本的执行计划选择.

cpu_tuple_cost = 0.01 # same scale as above

设置处理每一个数据行的执行成本。默认值是0.01

cpu_index_tuple_cost = 0.005 # same scale as above

设置在扫描索引的过程中处理每一个索引项的执行成本。默认值是0.005。

cpu_operator_cost = 0.0025 # same scale as above

设置处理每一个运算符或函数的执行成本。默认值是0.0025

effective_cache_size = 128MB

1

effective_cache_size:是postgresql能够使用的最大缓存,这个数字对于独立的pgsql服务器而言应该足够大,

比如4G的内存,可以设置为3.5G(437500)

2

设置单个查询可以使用的数据缓冲区的大小。默认值是128MB

3

是PostgreSQL能够使用的最大缓存,这个数字对于独立的PostgreSQL服务器而言应该足够大,

比如4G的内存,可以设置为3.5G (437500),use 25% of RAM for cache size, and 2-4% for sort size

4

参数是告诉数据库,OS的缓存大小。越大,数据库使用索引的积极性就越高。

因为数据很可能在os的缓存里,乱序读取的效率也不差。这个值理论上等于OS可以使用的缓存大小。

5

和上一个参数一样, 用于基于成本的执行计划选择. 不是说会用多少cache, 它只是个度量值. 表示系统有多少内存可以作为操作系统的cache.

越大的话, 数据库越倾向使用index这种适合random访问的执行计划.effective_cache_size = 12000MB

- Genetic Query Optimizer -

下列参数控制优化器使用的遗传算法。除非对遗传算法特别了解,一般情况下,使用它们默认值即可

geqo = on

geqo_threshold = 12

确定使用遗传优化器的查询类型。默认值是12。如果FROM子句中引用的的表的数目超过geqo_threshold的值,

就会使用遗传优化器。对于简单的查询使用穷举优化器。

geqo_effort = 5 # range 1-10

控制遗传优化器在生成查询计划需要的时间和查询计划的有效性之间做一个折中。有效的取值范围是1到 10。默认值是5。

值越大,优化器花在选择查询计划的上的时间越长,同时找到一个最优的查询计划的可能性就越大。

系统通常不直接使用 geqo_effort的值,而是使用它的值来计算参数geqo_pool_size和geqo_generations的默认

geqo_pool_size = 0 # selects default based on effort

控制遗传优化器的池(pool)大小。默认值是0。池大小是遗传群体中的个体数目。

至少是2,典型的取值在10和1000之间。如果参数的值是0,系统会自动根据geqo_effort的值和查询中引用的表的个数选择一个默认值。

geqo_generations = 0 # selects default based on effort

控制遗传优化器的代(generation)的大小。默认值是0。代是遗传算法的迭代次数。

至少是1,典型的取值范围与池的取值范围相同。如果参数的值是0,系统会自动根据geqo_pool_size的值和选择一个默认值

geqo_selection_bias = 2.0 # range 1.5-2.0

控制遗传优化器的代选择偏差(selection bias)的大小。默认值是2。取值范围在1.50到2.00之间

geqo_seed = 0.0 # range 0.0-1.0

- Other Planner Options -

default_statistics_target = 100 # range 1-10000

设置默认的收集优化器统计数据的目标值。它的值越大,ANALYZE操作的执行的时间越长,

扫描的数据行的个数也就越多,得到的优化器统计数据就越准确。

也可以使用命令ALTER TABLE ... ALTER COLUMN ... SET STATISTICS来为表的每个列设置一个单独的统计数据目标值,

这个值的作用与参数default_statistics_target是一样,它只影响相关的列的统计数据收集过程。默认值是10。

constraint_exclusion = partition # on, off, or partition

如果该参数的值是on,查询优化器将使用表上的约束条件来优化查询。

如果它的值是off,查询优化器不会使用表上的约束条件来优化查询。默认值是off

这个参数比较重要

cursor_tuple_fraction = 0.1 # range 0.0-1.0

from_collapse_limit = 8

join_collapse_limit = 8 # 1 disables collapsing of explicit

# JOIN clauses

------------------------------------------------------------------------------

ERROR REPORTING AND LOGGING

------------------------------------------------------------------------------

备注:(thw) 这个是我整理出来的。在设置的时候可以考虑。

- Where to Log -

log_destination = 'stderr' # Valid values are combinations of

# stderr, csvlog, syslog, and eventlog,

# depending on platform. csvlog

# requires logging_collector to be on.

This is used when logging to stderr:

logging_collector = off # Enable capturing of stderr and csvlog

# into log files. Required to be on for

# csvlogs.

# (change requires restart)

是否收集日志 重要 是否收集日志的标志 (thw)

These are only used if logging_collector is on:

log_directory = 'pg_log' # directory where log files are written,

# can be absolute or relative to PGDATA

这个参数只能在postgresql.conf文件中被设置。

它决定存放数据库运行日志文件的目录。默认值是pg_log。可以是绝对路径,

也可是相对路径(相对于数据库文件所在的路径)。

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,

# can include strftime() escapes

它决定数据库运行日志文件的名称。默认值是postgresql-%Y-%m-%d_%H%M%S.log。

它的值可以包含%Y、%m、%d、%H、%M 和%S这样的字符串,分别表示年、月、日、小时、分和秒。

如果参数的值中没有指定时间信息(没有出现%Y、%m、%d、%H、%M和%S中的任何一个),

系统会自动在log_filename值的末尾加上文件创建的时间作为文件名,例如,如果log_filename的值是 server_log,

那么在Sun Aug 29 19:02:33 2004 MST被创建的日志文件的名称将是server_log.1093827753,

1093827753是Sun Aug 29 19:02:33 2004 MST在数据库内部的表示形式。这个参数只能在postgresql.conf文件中被设置

如:'pg_datathw-%Y-%m-%d_%H%M%S.log' (thw)

log_file_mode = 0600 # creation mode for log files,

# begin with 0 to use octal notation

log_truncate_on_rotation = off # If on, an existing log file with the

# same name as the new log file will be

# truncated rather than appended to.

# But such truncation only occurs on

# time-driven rotation, not on restarts

# or size-driven rotation. Default is

# off, meaning append to existing files

# in all cases.

系统在创建一个新的数据库运行日志文件时,如果发现存在一个同名的文件,

当log_truncate_on_rotation的值是on时,系统覆盖这个同名文件。当log_truncate_on_rotation的值是off时,

系统将重用这个同名文件,在它的末尾添加新的日志信息。另外要注意的是,

只有在因为参数log_rotation_age起作用系统才创建新的日志文件的情况下,

才会覆盖同名的日志文件。因为数据库重新启动或者因为参数 log_rotation_size起作用而创建新的日志文件,

不会覆盖同名的日志文件,而是在同名的日志文件末尾添加新的日志信息。这个参数只能在 postgresql.conf文件中被设置。

默认值是off。

log_rotation_age = 1d # Automatic rotation of logfiles will

# happen after that time. 0 disables.

它决定何时创建一个新的数据库日志文件。单位是分钟。默认值是0。

如果现在的时间减去上次创建一个数据库运行日志的时间超过了 log_rotation_age的值,

数据库将自动创建一个新的运行日志文件。如果它的值是0,该参数将不起任何作用。

这个参数只能在 postgresql.conf文件中被设置。

log_rotation_size = 10MB # Automatic rotation of logfiles will

# happen after that much log output.

# 0 disables.

这个参数只能在postgresql.conf文件中被设置。它决定何时创建一个新的数据库日志文件。

单位是KB。默认值是10240。如果一个日志文件写入的数据量超过log_rotation_size的值,

数据库将创建一个新的日志文件。如果它的值被设为0,该参数将不起任何作用。

These are relevant when logging to syslog:

syslog_facility = 'LOCAL0'

syslog_ident = 'postgres'

silent_mode = off # Run server silently.

# DO NOT USE without syslog or

# logging_collector

# (change requires restart)

- When to Log -

client_min_messages = notice # values in order of decreasing detail:

# debug5

# debug4

# debug3

# debug2

# debug1

# log

# notice

# warning

# error

控制发送给客户端的消息级别。

合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、 WARNING、ERROR、FATAL和PANIC,

每个级别都包含排在它后面的所有级别中的信息。级别越低,发送给客户端的消息就越少。

默认值是NOTICE。这个参数可以在任何时候被设置。

log_min_messages = warning # values in order of decreasing detail:

# debug5

# debug4

# debug3

# debug2

# debug1

# info

# notice

# warning

# error

# log

# fatal

# panic

控制写到数据库日志文件中的消息的级别。

合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、 WARNING、ERROR、 LOG、FATAL和PANIC,

每个级别都包含排在它后面的所有级别中的信息。级别越低,数据库运行日志中记录的消息就越少。默认值是NOTICE。

只有超级用户才能修改这个参数。只有超级用户才能设置这个参数。

log_min_error_statement = error # values in order of decreasing detail:

# debug5

# debug4

# debug3

# debug2

# debug1

# info

# notice

# warning

# error

# log

# fatal

# panic (effectively off)

控制日志中是否记录导致数据库出现错误的SQL语句。

合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、 NOTICE、WARNING、ERROR、 LOG、FATAL和PANIC,

每个级别都包含排在它后面的所有级别。默认值是ERROR。只有超级用户才能修改这个参数。

log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements

# and their durations, > 0 logs only

# statements running at least this number

# of milliseconds

确定当超过 milliseconds 就对语句进行log记录。(这个比较好 thw)

如果 -1 不记录任何记录。如果是 0 是全部记录。如是 5000 记录了 查过5秒的sql 语句

- What to Log -

debug_print_parse = off

debug_print_rewritten = off

debug_print_plan = off

debug_pretty_print = on

这些参数(上面debug_print_ 几个参数的共同描述)控制数据库是否输出运行时的调试信息。这些参数的默认值是off。这些参数可以被任何用户设置

log_checkpoints = off

控制是否及记录检查点操作信息。默认值是off。这个参数只能在postgresql.conf文件中被设置。必须重启数据库才能生效

log_connections = off

控制是否及记录客户端连接请求信息。默认值是off。这个参数只能在postgresql.conf文件中被设置。必须重启数据库才能生效

log_disconnections = off

控制是否记录客户端结束连接信息。默认值是off。这个参数只能在postgresql.conf文件中被设置

log_duration = off

控制是否记录每个完成的SQL语句的执行时间。只有超级用户才能修改这个参数。

默认值是off。对于使用扩展协议与数据库通信的客户端,会记载Parse、Bind和Execute的执行时间。

log_error_verbosity = default # terse, default, or verbose messages

控制每条日志信息的详细程度。合法的取值是TERSE、DEFAULT和VERBOSE(每个取值都比它前面的取值提供更详细的信息)。

只有超级用户才能修改这个参数。默认值是DEFAULT。

log_hostname = off

控制是否及记录客户端的主机名。默认值是off。如果设为on,可能会影响数据库的性能,因为解析主机名可能需要一定的时间。

这个参数只能在postgresql.conf文件中被设置。这个参数只能在postgresql.conf文件中被设置。

log_line_prefix = '' # special values:

# %a = application name

# %u = user name

# %d = database name

# %r = remote host and port

# %h = remote host

# %p = process ID

# %t = timestamp without milliseconds

# %m = timestamp with milliseconds

# %i = command tag

# %e = SQL state

# %c = session ID

# %l = session line number

# %s = session start timestamp

# %v = virtual transaction ID

# %x = transaction ID (0 if none)

# %q = stop here in non-session

# processes

# %% = '%'

# e.g. '<%u%%%d> '

控制每条日志信息的前缀格式。默认值是空串。它的格式类似c语言中printf函数的format字符串。

这个参数只能在postgresql.conf文件中被设置。

转义序列

含义

%u 用户名

%d 数据库名

%r 客户端机器名或IP地址,还有客户端端口

%h 客户端机器名或IP地址

%p 进程ID

%t 带微秒的时间

%m 不带微秒的时间

%i 命令标签: 会话当前执行的命令类型

%c 会话ID

%l 每个会话的日志编号,从1开始

%s 进程启动时间

%v 虚拟事务ID (backendID/localXID)

%x 事务ID (0表示没有分配事务ID)

%q 不产生任何输出。如果当前进程是backend进程,忽略这个转义序列,继续处理后面的转义序列。如果当前进程不是backend进程,

忽略这个转义序列和它后面的所有转义序列。

%% 字符%

这个是我整理的(thw) log_line_prefix = 'timestamp:%t \r\n remote host and port:%r \r\n user name:%u \r\n application name:%a \r\n database name:%d \r\n process ID:%p \r\n command tag:%i \r\n SQL state:%e \r\n session start timestamp:%s \r\n' # special values:

log_lock_waits = off # log lock waits >= deadlock_timeout

如果一个会话等待某个类型的锁的时间超过deadlock_timeout的值,该参数决定是否在数据库日志中记录这个信息。

默认值是off。只有超级用户才能修改这个参数。

log_statement = 'none' # none, ddl, mod, all

控制记录哪种SQL语句的执行信息。有效的取值是none、ddl、mod和all。默认值是none。

ddl包括所有数据定义语句,如CREATE、 ALTER和DROP语句。

mod包括所有ddl语句和更新数据的语句,例如INSERT、UPDATE、DELETE、TRUNCATE、 COPY FROM、PREPARE和 EXECUTE。

All包括所有的语句。只有超级用户才能修改这个参数。

mod 这个参数就挺好用的(thw)。(但系统有大量的插入,更新操作就比较麻烦了。一定要注意)

log_temp_files = -1 # log temporary files equal or larger

# than the specified size in kilobytes;

# -1 disables, 0 logs all temp files

控制是否记录临时文件的删除信息。单位是KB。0表示记录所有临时文件的删除信息。

正整数表示只记录大小比log_temp_files的值大的临时文件的删除信息。

-1表示不记录任何临时文件删除信息。默认值是-1。这个参数可以在任何时候被设置

log_timezone = '(defaults to server environment setting)'

设置数据库日志文件在写日志文件时使用的时区。默认值是unknown,意识是使用操作系统的时区。

这个参数只能在postgresql.conf文件中被设置。

------------------------------------------------------------------------------

RUNTIME STATISTICS

------------------------------------------------------------------------------

- Query/Index Statistics Collector -

track_activities = on

是否收集每个会话的当前正在执行的命令的统计数据,包括命令开始执行的时间。

默认值是on。只有超级用户才能修改这个参数。

track_counts = on

是否收集数据库活动的统计数据。默认值是on。只有超级用户才能修改这个参数。

track_functions = none # none, pl, all

track_function:表示是否开启函数的调用次数和调用耗时统计

track_activity_query_size = 1024 # (change requires restart)

track_activity_query_size:设置用于跟踪每一个活动会话的当前执行命令的字节数,默认值为1024,只能在数据库启动后设置。

update_process_title = on

stats_temp_directory = 'pg_stat_tmp'

- Statistics Monitoring -

log_parser_stats = off

log_planner_stats = off

log_executor_stats = off

log_statement_stats = off

这些参数决定是否在数据库的运行日志里记载每个SQL语句执行的统计数据。

如果log_statement_stats的值是on,其它的三个参数的值必须是off。

所有的这些参数的默认值都是off。log_statement_stats报告整个语句的统计数据,

log_parser_stats记载数据库解析器的统计数据,log_planner_stats报告数据库查询优化器的统计数据,

log_executor_stats报告数据库执行器的统计数据。只有超级用户才能修改这些参数

------------------------------------------------------------------------------

AUTOVACUUM PARAMETERS

------------------------------------------------------------------------------

autovacuum = on # Enable autovacuum subprocess? 'on'

# requires track_counts to also be on.

1

是否开启自动vacuum , analyze

2

控制是够打开数据库的自动垃圾收集功能。默认值是on。如果autovacuum被设为on,

参数track_counts(参考本章10.9)也要被设为on,自动垃圾收集才能正常工作。

注意,即使这个参数被设为off,如果事务ID回绕即将发生,数据库会自动启动一个垃圾收集操作。

这个参数只能在文件 postgresql.conf中被设置。

测试:当把autovacuum = off 之后

create table t_1 ( i int)

表中记录 中有 100w数据

只有一条 是 2

其他 都是1

建立索引

--------------------------------------------------------------------------

没有进行分析

Bitmap Heap Scan on public.t_1 (cost=129.73..6595.25 rows=6881 width=4)

Output: i

Recheck Cond: (t_1.i = 1)

-> Bitmap Index Scan on ddddddd (cost=0.00..128.01 rows=6881 width=0)

Index Cond: (t_1.i = 1)

当 where t_1.i = 1 时 他也是走索引的,看来pg如果没有统计信息的时候,默认是基于规则的。

---------------------------------------------------------------------------

进行了手动分析

Seq Scan on public.t_1 (cost=0.00..23293.21 rows=1376211 width=4)

Output: i

Filter: (t_1.i = 1)

当 where t_1.i = 1 时就没有走索引。看来还是比较智能的

Index Scan using ddddddd on public.t_1 (cost=0.00..9.21 rows=46 width=4)

Output: i

Index Cond: (t_1.i = 2)

---------------------------------------------------------------------------

log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and

# their durations, > 0 logs only

# actions running at least this number

# of milliseconds.

1

阀值,用于度量是否需要记录下autovacuum的动作到log里面.(-1表示禁止,0表示记录所有)

2

单位是毫秒。如果它的值为0,所有的垃圾搜集操作都会被记录在数据库运行日志中,

如果它的值是-1,所有的垃圾收集操作都不会被记录在数据库运行日志中。

如果把它的值设为250毫秒,只要自动垃圾搜集发出的VACUUM和ANALYZE命令的执行时间超过250毫秒,

VACUUM和ANALYZE命令的相关信息就会被记录在数据库运行日志中。默认值是-1。这个参数只能在 postgresql.conf中被设置。

autovacuum_max_workers = 3 # max number of autovacuum subprocesses

# (change requires restart)

用于指定整个数据库机器同一时间点允许的autovacuum后台进程(不包括lanucher进程)

autovacuum_naptime = 1min # time between autovacuum runs

两个autovacuum或autoanalyze允许周期间的间隔时间。

autovacuum_vacuum_threshold = 50 # min number of row updates before

# vacuum

阀值条件1:最小触发vacuum的度量值(计数器记录update,delete的tuples)

autovacuum_analyze_threshold = 50 # min number of row updates before

# analyze

阀值条件1:最小触发analyze的度量值(计数器记录insert,update,delete的tuples)

autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum

阀值条件2:当前reltuples乘以autovacuum_vacuum_scale_factor

autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze

阀值条件2:当前reltuples乘以autovacuum_analyze_scale_factor

autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum

# (change requires restart)

autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for

# autovacuum, in milliseconds;

# -1 means use vacuum_cost_delay

autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for

# autovacuum, -1 means use

# vacuum_cost_limit

例子:

每一轮autovacuum,autoanalyze后,相应的计数器将归零。

假设x为update的tuples计数值,y为delete的tuples计数值.

假设a为update的tuples计数值,b为delete的tuples计数值,c为insert的tuples计数值.

何时发生autoanalyze ?

(a+b+c) > (0.1*reltuples + 50)

何时发生autovacuum ?

(x+y) > (0.2*reltuples + 50)

注意:

比较时取的是当前的reltuples,当先发生autoanalyze之后,reltuples可能会发生变化,

如reltuples变小,从而导致不满足条件的autovacuum有可能变成满足条件。

------------------------------------------------------------------------------

CLIENT CONNECTION DEFAULTS

------------------------------------------------------------------------------

- Statement Behavior -

search_path = '"$user",public' # schema names

设置模式搜索路径。它的值由一个或多个模式名构成,不同的模式名用逗号隔开。默认值是'"$user", public',$user表示与当前会话用户名同名的模式名,

如果这样的模式不存在,$user将被忽略。

系统表所在的模式pg_catalog,如果出现在search_path中,它会按指定的顺序被搜索。如果它没有出现在search_path中,

则总是排在search_path中指定的所有模式前面被搜索。

当前会话如果存在存放临时表的模式,可以使用别名pg_tmp将它列在搜索路径中,例如,'"$user", public, pg_tmp'。

如果存放临时表的模式没有出现在搜索路径中,则它会作为第一个搜索对象,排在pg_catalog和search_path中所有模式的前面。

注意,系统只会在存放临时表的模式中搜索表、视图、序列对象和数据类型这样的数据库对象,

不会在里面搜索函数或运算符这样的数据库对象。

default_tablespace = '' # a tablespace name, '' uses the default

设置默认表空间。默认值是空串

temp_tablespaces = '' # a list of tablespace names, '' uses

# only default tablespace

设置默认的存放临时对象的表空间。默认值是空串。它的值由一个或多个表空间组成,不同的值用逗号隔开。

check_function_bodies = on

设置是否验证CREATE FUNCTION.命令中指定的函数体。默认值是on。

关闭这个选项可以在从dump文件中恢复函数定义信息时避免系统报错,因为一个正在恢复的函数可能会引用尚未恢复的函数。

default_transaction_isolation = 'read committed'

默认的事务隔离级别。合法的取值是"read uncommitted"、

"read committed"、"repeatable read”和"serializable"。 默认值是read committed

default_transaction_read_only = off

default_transaction_deferrable = off

设置每个新创建的事务是否是只读的。默认值是off。只读事务只能修改临时表。详细信息参考SQL命令SET TRANSACTION

session_replication_role = 'origin'

控制与复制有关的触发器和规则的行为。可能的取值是origin、replica和local,默认值是origin。

statement_timeout = 0 # in milliseconds, 0 is disabled

设置语句执行的超时值。如果一个语句执行的时间超过statement_timeout指定的值,

该语句就会被强行终止。如果它的值为0,则关闭超时特性。单位是毫秒,默认值是0。

最好不要在文件postgresql.conf中设置这个参数,因为它影响所有的会话。

vacuum_freeze_min_age = 50000000

vacuum_freeze_table_age = 150000000

bytea_output = 'hex' # hex, escape

xmlbinary = 'base64'

设置XML文档中二进制数据的编码类型。它的值可以是base64和hex。默认值是base64。、

xmloption = 'content'

设置在字符串和XML数据之间进行类型转换时使用的XML文档类型。它的值是DOCUMENT 或者CONTENT,默认值是CONTENT。

- Locale and Formatting -

datestyle = 'iso, ymd'

设置时间和日期值的显示格式。initdb会将这个参数初始化成与lc_time一致的值。

intervalstyle = 'postgres'

timezone = '(defaults to server environment setting)'

设置显示和解释时间类型数值时使用的时区

timezone_abbreviations = 'Default' # Select the set of available time zone

# abbreviations. Currently, there are

# Default

# Australia

# India

# You can create your own file in

# share/timezonesets/.

设置数据库接受的时区缩写值。默认值是Default,代表一些通用的时区缩写

extra_float_digits = 0 # min -15, max 3

控制浮点数显示时的有效的数值位的最大个数。float4类型的数的显示精度是6+ extra_float_digits,

float8类型的数的显示精度是15+ extra_float_digits。有效的取值范围是-15到2。默认值是0

client_encoding = sql_ascii # actually, defaults to database

# encoding

设置客户端的字符编码类型。默认值是数据库的字符编码类型。

These settings are initialized by initdb, but they can be changed.

lc_messages = 'zh_CN.UTF-8' # locale for system error message

# strings

lc_monetary = 'zh_CN.UTF-8' # locale for monetary formatting

设置货币值的显示格式。它影响to_char之类的函数的输出

lc_numeric = 'zh_CN.UTF-8' # locale for number formatting

lc_time = 'zh_CN.UTF-8' # locale for time formatting

default configuration for text search

default_text_search_config = 'pg_catalog.simple'

设定全文检索的配置信息,默认值是pg_catalog.simple。

- Other Defaults -

dynamic_library_path = '$libdir'

dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir',其中的:$libdir表示 PostgreSQL自己内置的共享库的路径,使用命令pg_config –pkglibdir可以找到这个路径。默认值是'$libdir'。如果它的值是空串,自动路径搜索将被关闭。

超级用户可以在任何时候修改这个参数,推荐在文件postgresql.conf中配置这个参数

local_preload_libraries = ''

------------------------------------------------------------------------------

LOCK MANAGEMENT

------------------------------------------------------------------------------

deadlock_timeout = 1s

设置死锁超时检测时间。单位是微秒,默认值是1000。

死锁检测是一个消耗许多 CPU资源的操作。这个参数的值不能太小。

在数据库负载比较大的情况下,应当增大这个参数的值。

max_locks_per_transaction = 64 # min 10

# (change requires restart)

Note: Each lock table slot uses ~270 bytes of shared memory, and there are

max_locks_per_transaction * (max_connections + max_prepared_transactions)

lock table slots.

这个参数控制每个事务能够得到的平均的对象锁的个数。默认值是64。

数据库在启动以后创建的共享锁表的最大可以保存 max_locks_per_transaction * (max_connections + max_prepared_transactions)个对象锁。

单个事务可以同时获得的对象锁的数目可以超过 max_locks_per_transaction的值,只要共享锁表中还有剩余空间。

max_pred_locks_per_transaction = 64 # min 10

# (change requires restart)

------------------------------------------------------------------------------

VERSION/PLATFORM COMPATIBILITY

------------------------------------------------------------------------------

- Previous PostgreSQL Versions -

array_nulls = on

backslash_quote = safe_encoding # on, off, or safe_encoding

有三种取值,分别是on、off和safe_encoding。on表示可以在字符串中用\'表示但引号。

off表示\只是一个普通字符,单个单引号必须用两个连续的单引号表示。safe_encoding与on的功能基本相同,

但它比on更安全,推荐使用safe_encoding。默认值是 safe_encoding。这个参数可以在任何时候被设置。

default_with_oids = off

该参数控制CREATE TABLE 和CREATE TABLE AS命令是否给新建的表添加一个系统列OID。

如果它的值是on,CREATE TABLE 和CREATE TABLE AS命令在没有指定WITH OIDS 和WITHOUT OIDS子句的情况下,

新建的表将包含系统列OID,同时SELECT INTO命令也会将系统列OID添加到新建的表中去。默认值是off

escape_string_warning = on

lo_compat_privileges = off

quote_all_identifiers = off

sql_inheritance = on

standard_conforming_strings = on

如果是on,系统会将sql命令中的字符串中的字符“\”作为普通的字符看待,而不是作为转义字符看待。

如果是off,系统会将sql命令中的字符“\”作为转义字符看待。默认值是off。这个参数可以在任何时候被设置

synchronize_seqscans = on

如果这个参数的值是是on,多个查询如果同时顺序扫描一个表中的同一个数据页,

系统只会发出一个IO操作来读取这个数据页,读出来的数据被多个查询共享,减少不必要的 IO操作,

提高系统执行的效率,但是不带 ORDER BY子句的查询产生的结果中数据行的顺序可能会发生改变。

如果值为off,这个特性将被关闭。默认值是on。

- Other Platforms and Clients -

transform_null_equals = off

------------------------------------------------------------------------------

ERROR HANDLING

------------------------------------------------------------------------------

exit_on_error = off # terminate session on any error?

restart_after_crash = on # reinitialize after backend crash?

------------------------------------------------------------------------------

CUSTOMIZED OPTIONS

------------------------------------------------------------------------------

custom_variable_classes = '' # list of custom variable class names

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广