使用 pg_options

注意:Massimo Dal Zotto 提供
可选的参数文件 data/pg_options 包含被后端用于控制跟踪信息和其他可调节参数的运行时选项.当后端收到一个 SIGHUP 信号后会重新读取这个文件的信息.这就让我们可以动态更改 Postgres 的运行时参数而不需要重新启动它.在这个文件中声明的选项可能是被追踪包使用的调试标志 (backend/utils/misc/trace.c)或者是后端用于控制其特性的一些数字参数.

在后端启动的时候所有 pg_options 都初始化为零.新的或者被改变了的选项将被所有新启动的后端读取.要令选项的更改对所有正在运行的后端都起做用,我们要向 postmaster 发送一个 SIGHUP 信号.该信号将自动发送给所有后端.我们也可以通过给指定的后端发送 SIGHUP 信号的方法来让更改只对某个后端生效.

pg_options 同样可以使用 Postgres 的 -T 开关来声明:

postgres options -T "verbose=2,query,hostlookup-"
这样,用于打印错误和调试信息的函数就可以利用 syslog(2) 功能了.向标准输出(stdout)或标准错误(stderr)打印的信息是带有时标和后端进程号前缀的字串:
#timestamp          #pid    #message
980127.17:52:14.173 [29271] StartTransactionCommand
980127.17:52:14.174 [29271] ProcessUtility: drop table t;
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
980127.17:52:14.186 [29286] Async_NotifyHandler
980127.17:52:14.186 [29286] Waking up sleeping backend process
980127.19:52:14.292 [29286] Async_NotifyFrontEnd
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
980127.19:52:14.466 [29286] Async_NotifyHandler done
这种格式改善了日志的可读性并且让人们可以弄明白某后端何时在做何事.同样这也让我们很容易写出简单的监控日志的 awk 或 perl 脚本来跟踪数据库错误或问题,或者计算交易时间统计数据.

向 syslog (系统日志)打印的信息使用了日志工具 LOG_LOCAL0.syslog的使用可以由 syslog 的 pg_option 控制.不幸的是,许多函数调用直接用 printf() 把它们的信息输出到标准输出(stdout)或标准错误(stderr)中去了,这样的输出不能重定向到 syslog 而且也不会有时标.我们的建议是所有对printf的调用都用宏 PRINTF 代替,所有向标准错误(stderr)的输出都用 EPRINTF 替换,这样我们就可以将所有输出都控制在统一的方法下.

pg_options 文件的格式如下:

# comment
option=integer_value  # set value for option
option                # set option = 1
option+               # set option = 1
option-               # set option = 0
注意 keyword 可以是定义在 backend/utils/misc/trace.c 里的选项名的缩写.
 
例 27-1. pg_options 文件

例如,我的 pg_options 文件包含下面的值:

verbose=2
query
hostlookup
showportnumber

可识别的选项

目前已经定义的选项是:
 
all
全局追踪标志,允许的值是:
0
追踪信息(一个一个)分别打开
1
打开所有追踪信息
-1
关闭所有追踪信息
verbose
冗长标志.允许的值是:
0
没有信息,这是缺省值.
1
打印消息信息.
2
打印更多消息信息.
query
查询追踪标志,允许的值是:
0
不打印查询.
1
在一行内打印压缩了的查询.
4
打印全部查询.
plan
打印查询规划.
parse
打印分析器输出.
rewritten
打印重写了的查询.
pretty_plan
漂亮地(?)打印查询规划.
pretty_parse
漂亮地(?)打印分析器输出.
pretty_rewritten
漂亮地(?)打印重写了的查询.
parserstats
打印分析器统计.
plannerstats
打印规划器统计信息.
executorstats
打印执行器统计信息.
shortlocks
当前没有使用但将来需要使用的特性.
locks
追踪锁.
userlocks
追踪用户锁.
spinlocks
追踪旋转锁.
notify
追踪通知函数.
malloc
目前未用.
palloc
目前未用.
lock_debug_oidmin
锁追踪的最小的关系对象标识(oid).
lock_debug_relid
oid,如果为非零,由锁追踪的关系.
lock_read_priority
目前未用.
deadlock_timeout
死锁检测计时器.
syslog
syslog 标志.允许的值是:
0
消息输出到标准输出/标准错误(stdout/stderr).
1
消息输出到标准输出/标准错误 (stdout/stderr)和 syslog.
2
消息只输出到 syslog.
hostlookup
打开在 ps_status 里的主机名查找.
showportnumber
在 ps_status 里显示端口号.
nofsync

 

 
 
 

以每用户为单位关闭 fsync.