您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)PostgreSQL如何初始定義及初始化,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
配置參數(shù)(或者叫GUC變量,grand unified configuration)常見的就是出現(xiàn)在 postgresql.conf
中的設(shè)置項,更多信息可查看文檔 19. Server Configuration
,我主要講他們在代碼中是如何設(shè)置和發(fā)揮作用。
主要講不同類型的初始定義。
1、不同類型對應(yīng)的結(jié)構(gòu)體
除了前篇提到的通用結(jié)構(gòu)體,每個類型都有自己的定義,例如布爾型:
struct config_bool { struct config_generic gen; /* constant fields, must be set correctly in initial value: */ bool *variable; bool boot_val; GucBoolCheckHook check_hook; GucBoolAssignHook assign_hook; GucShowHook show_hook; /* variable fields, initialized at runtime: */ bool reset_val; void *reset_extra; };
所有類型結(jié)構(gòu)體的第一個成員都是名為gen的 config_generic 結(jié)構(gòu)體,再比如整型:
struct config_int { struct config_generic gen; /* constant fields, must be set correctly in initial value: */ ...
這樣的代碼設(shè)計在PG里隨處可見,可以理解為類似C++的繼承,在使用過程中可以根據(jù)gen成員的值知道一個結(jié)構(gòu)體指針實際對應(yīng)的類型,比如:
struct config_generic *conf; ... conf = guc_variables[varnum]; ... /* now get the type specific attributes */ switch (conf->vartype) { case PGC_BOOL: { struct config_bool *lconf = (struct config_bool *) conf; ... /* boot_val */ values[12] = pstrdup(lconf->boot_val ? "on" : "off"); ...
讀到一個 config_generic
結(jié)構(gòu)體成員 vartype 是 PGC_BOOL,既可以知道它實際指向的是一個 config_bool 類型結(jié)構(gòu)體。
2、配置參數(shù)初始定義(src/backend/utils/misc/guc.c
)
布爾型配置參數(shù)定義為結(jié)構(gòu)體數(shù)組 ConfigureNamesBool:
static struct config_bool ConfigureNamesBool[] = { { {"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD, gettext_noop("Enables the planner's use of sequential-scan plans."), NULL }, &enable_seqscan, true, NULL, NULL, NULL }, ...
第一部分是 gen 成員定義,分別是上篇提到的:配置參數(shù)名、所處上下文、分類、短描述、長描述,它們的值分別為:enable_seqscan、PGC_USERSET(允許普通用戶設(shè)置)、QUERY_TUNING_METHOD(Query Tuning / Planner Method Configuration)、等等。
其他類型也都各有自己的定義數(shù)組:
static struct config_int ConfigureNamesInt[] = static struct config_real ConfigureNamesReal[] =
等等,不再贅述。
每個參數(shù)都有一個成員boot_val
,啟動時的初始值,它的類型跟參數(shù)一致,比如config_bool中是bool,而config_int中是int。上例中 enable_seqscan 的初始值是 true,這個值跟postgresql.conf中的默認值一致。
3、啟動時的類型初始化
函數(shù) build_guc_variables()
for (i = 0; ConfigureNamesInt[i].gen.name; i++) { struct config_int *conf = &ConfigureNamesInt[i]; conf->gen.vartype = PGC_INT; num_vars++; }
在這里賦予參數(shù)類型,每個數(shù)組容納不同類型參數(shù),不需要在定義時挨個指定,只定義前幾個成員的值即可。
所有不同類型的參數(shù)指針放在同一個數(shù)組中,并按名字排序。
4、啟動時的值初始化
類型初始化函數(shù)在 InitializeGUCOptions()
中調(diào)用,隨后馬上為每個參數(shù)調(diào)用 InitializeOneGUCOption
。
以字符串參數(shù)為例
if (conf->boot_val != NULL) newval = guc_strdup(FATAL, conf->boot_val); else newval = NULL; if (!call_string_check_hook(conf, &newval, &extra, PGC_S_DEFAULT, LOG)) elog(FATAL, "failed to initialize %s to \"%s\"", conf->gen.name, newval ? newval : ""); if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; conf->gen.extra = conf->reset_extra = extra;
這里很簡單,就是以 boot_val 初始化其他成員。
大家肯定注意到結(jié)構(gòu)體里還有三個hook的定義,這里用到了兩個,有興趣可以自行了解。
5、環(huán)境變量對配置的影響
見函數(shù) InitializeGUCOptionsFromEnvironment
,這里不再展開,回頭跟SET
命令或者配置文件的讀取一起講。
上邊是數(shù)據(jù)庫進程啟動時(包括后端進程的啟動)配置參數(shù)初始化,寫得很粗,可能有遺漏。
上述就是小編為大家分享的PostgreSQL如何初始定義及初始化了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。