21.3. 使用 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 的消息带有包含后端 pid 的时间戳前缀:
#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 文件的格式如下:
#commentoption=integer_value# set value foroptionoption# setoption= 1option+ # setoption= 1option- # setoption= 0
注意 keyword 也可以是
backend/utils/misc/trace.c 中定义的选项名的缩写。
例 21.1. pg_options 文件
例如,我的 pg_options 文件包含以下值:
verbose=2
query
hostlookup
showportnumber
21.3.1. 可识别的选项
当前定义的选项有:
- all
全局跟踪标志。允许的值有:
- 0
单独启用各跟踪消息
- 1
启用所有跟踪消息
- -1
禁用所有跟踪消息
- verbose
详尽程度标志。允许的值有:
- 0
无消息。这是默认值。
- 1
打印信息性消息。
- 2
打印更多信息性消息。
- query
查询跟踪标志。允许的值有:
- 0
不打印查询。
- 1
在一行内打印压缩的查询。
- 4
打印完整查询。
- plan
打印查询计划。
- parse
打印解析器输出。
- 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 中显示端口号。
- notifyunlock
notify 之后解锁 pg_listener。
- notifyhack
从 pg_listener 中移除重复元组。