PostgreSQL7.0手冊-開發者手冊 -62. pg_options
2019-09-08 23:34:07
供稿:網友
第六十二章. pg_options
注意:由 Massimo Dal Zotto 提供
參數文件 data/pg_options 包含被后端用于控制跟蹤信息和其他可調節參數的運行時選項.當后端收到一個 SIGHUP 信號后會重新讀取這個文件的信息.這就讓我們可以更改 Postgres 的運行時參數而不需要重新啟動它.在這個文件中聲明的選項可能是被追蹤包使用的調試標志(backend/utils/misc/trace.c)或者是后端用于控制其特性的一些數字參數.新的選項和參數必須在backend/utils/misc/trace.c和backend/include/utils/trace.h 里定義.
例如,假設我們想在文件 foo.c 里加入一個條件跟蹤信息和一個可調節的數字參數.我們所要做的是向文件 backend/include/utils/trace.h 里增加常量 TRACE_FOO 和 OPT_FOO_PARAM:
/* file trace.h */
enum pg_option_enum {
...
TRACE_FOO, /* trace foo functions */
OPT_FOO_PARAM, /* foo tunable parameter */
NUM_PG_OPTIONS /* must be the last item of enum */
};
和文件 backend/utils/misc/trace.c 里對應的行:
/* file trace.c */
static char *opt_names[] = {
...
"foo", /* trace foo functions */
"fooparam" /* foo tunable parameter */
};
兩個文件里的選項必須嚴格地按相同順序排列.在源文件 foo 里我們現在可以用下面的代碼代表新的標志:
/* file foo.c */
#include "trace.h"
#define foo_param pg_options[OPT_FOO_PARAM]
int
foo_function(int x, int y)
{
TPRINTF(TRACE_FOO, "entering foo_function, foo_param=%d", foo_param);
if (foo_param > 10) {
do_more_foo(x, y);
}
}
現有的要使用私有跟蹤標志的文件只須加入下面代碼就完成了修改:
#include "trace.h"
/* int my_own_flag = 0; -- removed */
#define my_own_flag pg_options[OPT_MY_OWN_FLAG]
在后端啟動的時候所有 pg_options 都初始化為零.如果我們需要一個不同的初始值,我們必須在 PostgresMain 開頭的地方增加一些初始化代碼.現在我們可以設置 foo_param 參數并且可以通過向文件 data/pg_options 里寫數值來打開 foo 追蹤:
# file pg_options
...
foo=1
fooparam=17
新的選項將被所有新啟動的后端讀?。钸x項的更改對所有正在運行的后端都起做用,我們要向postmaster 發送一個 SIGHUP 信號.該信號將自動發送給所有后端.我們也可以通過給指定的后端發送 SIGHUUP 信號的方法來讓更改只對某個后端生效.
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?。ㄏ到y日志)打印的信息使用了日志工具 LOG_LOCAL0.syslog的使用可以由 syslog 的 pg_option 控制.不幸的是,許多函數調用直接用 printf() 把它們的信息輸出到標準輸出(stdout)或標準錯誤(stderr)中去了,這樣的輸出不能重定向到 syslog 而且也不會有時標.我們的建議是所有對printf的調用都用宏 PRINTF 代替,所有向標準錯誤(stderr)的輸出都用 EPRINTF 替換,這樣我們就可以將所有輸出都控制在統一的方法下.
使用新 pg_options 的機制比定義新的后端開關的方法更方便是因為:
我們不必為我們想控制的每件事情都定義一個不同的開關.所有選項都作為關鍵字定義在一個存儲在數據目錄中的外部文件中。
我們不必為修改某幾個選項設置而重起Postgres.通常后端參數是為postmaster聲明,然后在后端啟動時傳遞到每個后端.現在這些選項是從文件中讀取的.
我們可以在后端運行的時候更改選項.因此我們可以在出現問題時才激活調試信息進行追蹤.我們同樣還可以對那些可調節的參數賦予不同的值進行嘗試.
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 里的選項名的縮寫.
請參考管理員手冊中關于運行時選項的章節獲取目前支持的選項的完整列表?!?
有一些現在正使用私有變量和選項開關的代碼已經修改為利用 pg_options 特性了,主要是在 postgres.c 里.我們建議可以把所有現存的代碼都改成這樣,所以我們可以去掉很多 Postgres 命令行上的開關而且我們可以有更容易調節的選項?。@些選項都是在同一個位置存放的.