重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
PostgreSQL中怎么控制文件在初始化時(shí)生成,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)是專業(yè)的桓仁網(wǎng)站建設(shè)公司,桓仁接單;提供成都網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行桓仁網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
控制文件是在初始化時(shí)生成,記錄PG運(yùn)行過程中的關(guān)鍵信息,大致分為以下幾類。
初始化時(shí)自動(dòng)生成,運(yùn)行過程中不允許修改,例如系統(tǒng)標(biāo)識符;
允許用戶在初始化時(shí)一次性定制,不再允許修改,例如WAL段尺寸;
記錄創(chuàng)建數(shù)據(jù)庫的編譯時(shí)信息,例如catalog版本,啟動(dòng)此數(shù)據(jù)庫的程序也必須具有相同屬性;
實(shí)時(shí)信息,比如檢查點(diǎn)記錄,崩潰中重啟能夠知道從哪里開始恢復(fù)。
1、初始化時(shí)傳遞給postgres
參數(shù)
這個(gè)過程這里不多講,initdb使用 postgres --boot -x1
啟動(dòng)數(shù)據(jù)庫程序,進(jìn)入bootstrap
模式:
if (argc > 1 && strcmp(argv[1], "--boot") == 0) AuxiliaryProcessMain(argc, argv); /* does not return */
這段代碼在 main(int argc, char *argv[])
函數(shù)中,以前的文章提到過它。
AuxiliaryProcessMain
中的參數(shù)解析:
case 'x': MyAuxProcType = atoi(optarg); break;
這里取得輔助進(jìn)程的類型,其它參數(shù)遇到的時(shí)候再講。
2、輔助進(jìn)程定義
typedef enum { NotAnAuxProcess = -1, CheckerProcess = 0, BootstrapProcess, ... NUM_AUXPROCTYPES /* Must be last! */ } AuxProcType;
可知,initdb啟動(dòng)了一個(gè) BootstrapProcess
進(jìn)程。
3、初始化時(shí)自動(dòng)生成參數(shù)(系統(tǒng)標(biāo)識符)
繼續(xù)往下看會(huì)看到 BootStrapXLOG
的調(diào)用(src/backend/access/transam/xlog.c
),系統(tǒng)標(biāo)識符在這里邊生成并最終寫入磁盤:
void BootStrapXLOG(void) { ... gettimeofday(&tv, NULL); sysidentifier = ((uint64) tv.tv_sec) << 32; sysidentifier |= ((uint64) tv.tv_usec) << 12; sysidentifier |= getpid() & 0xFFF; ... ControlFile->system_identifier = sysidentifier; ... WriteControlFile(); ...
4、用戶定制參數(shù)
initdb
有參數(shù) --wal-segsize=SIZE
,在啟動(dòng)時(shí) postgres
時(shí)用 'X' 傳入:
postgres —boot -x1 -X %u
這地方稍微別扭的地方是initdb和postgres兩個(gè)程序的X
參數(shù)含義竟然不一致,好在是內(nèi)部實(shí)現(xiàn),使用者并不需要知道。
啟動(dòng)時(shí),參數(shù) X
賦值給 wal_segment_size
:
case 'X': { int WalSegSz = strtoul(optarg, NULL, 0); ... SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL, PGC_S_OVERRIDE); } break;
隨后,在 WriteControlFile
中記入控制文件:
ControlFile->xlog_seg_size = wal_segment_size;
5、編譯時(shí)選項(xiàng)
函數(shù) WriteControlFile
寫入控制文件
ControlFile->pg_control_version = PG_CONTROL_VERSION; ControlFile->catalog_version_no = CATALOG_VERSION_NO; ControlFile->maxAlign = MAXIMUM_ALIGNOF; ControlFile->floatFormat = FLOATFORMAT_VALUE; ControlFile->blcksz = BLCKSZ; ControlFile->relseg_size = RELSEG_SIZE; ...
6、實(shí)時(shí)信息
系統(tǒng)在運(yùn)行過程中更新 ControlFile
,然后在某些節(jié)點(diǎn)寫入磁盤(調(diào)用 UpdateControlFile
),比如CheckPoint時(shí),可以看到像系統(tǒng)標(biāo)識符這類信息是不會(huì)變的。
7、校驗(yàn)
寫入和更新時(shí)都會(huì)計(jì)算CRC,也寫入控制文件內(nèi),
/* Contents are protected with a CRC */ INIT_CRC32C(ControlFile->crc); COMP_CRC32C(ControlFile->crc, (char *) ControlFile, offsetof(ControlFileData, crc)); FIN_CRC32C(ControlFile->crc);
讀取文件時(shí)校驗(yàn)它保證完整性:
/* Now check the CRC. */ INIT_CRC32C(crc); COMP_CRC32C(crc, (char *) ControlFile, offsetof(ControlFileData, crc)); FIN_CRC32C(crc); if (!EQ_CRC32C(crc, ControlFile->crc)) ereport(FATAL, (errmsg("incorrect checksum in control file")));
看完上述內(nèi)容,你們掌握PostgreSQL中怎么控制文件在初始化時(shí)生成的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!