亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL中怎么控制文件在初始化時生成

發布時間:2021-06-21 17:44:47 來源:億速云 閱讀:150 作者:Leah 欄目:大數據

PostgreSQL中怎么控制文件在初始化時生成,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

控制文件是在初始化時生成,記錄PG運行過程中的關鍵信息,大致分為以下幾類。

  • 初始化時自動生成,運行過程中不允許修改,例如系統標識符;

  • 允許用戶在初始化時一次性定制,不再允許修改,例如WAL段尺寸;

  • 記錄創建數據庫的編譯時信息,例如catalog版本,啟動此數據庫的程序也必須具有相同屬性;

  • 實時信息,比如檢查點記錄,崩潰中重啟能夠知道從哪里開始恢復。

1、初始化時傳遞給postgres參數

這個過程這里不多講,initdb使用 postgres --boot -x1 啟動數據庫程序,進入bootstrap 模式:

	if (argc > 1 && strcmp(argv[1], "--boot") == 0)
		AuxiliaryProcessMain(argc, argv);	/* does not return */

這段代碼在 main(int argc, char *argv[]) 函數中,以前的文章提到過它。

AuxiliaryProcessMain 中的參數解析:

	case 'x':
		MyAuxProcType = atoi(optarg);
		break;

這里取得輔助進程的類型,其它參數遇到的時候再講。

2、輔助進程定義

typedef enum
{
	NotAnAuxProcess = -1,
	CheckerProcess = 0,
	BootstrapProcess,
...
	NUM_AUXPROCTYPES			/* Must be last! */
} AuxProcType;

可知,initdb啟動了一個 BootstrapProcess 進程。

3、初始化時自動生成參數(系統標識符)

繼續往下看會看到 BootStrapXLOG 的調用(src/backend/access/transam/xlog.c),系統標識符在這里邊生成并最終寫入磁盤:

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、用戶定制參數

initdb 有參數 --wal-segsize=SIZE,在啟動時 postgres 時用 'X' 傳入:

postgres —boot -x1 -X %u

這地方稍微別扭的地方是initdb和postgres兩個程序的X參數含義竟然不一致,好在是內部實現,使用者并不需要知道。

啟動時,參數 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、編譯時選項

函數 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、實時信息

系統在運行過程中更新 ControlFile,然后在某些節點寫入磁盤(調用 UpdateControlFile),比如CheckPoint時,可以看到像系統標識符這類信息是不會變的。

7、校驗

寫入和更新時都會計算CRC,也寫入控制文件內,

	/* Contents are protected with a CRC */
	INIT_CRC32C(ControlFile->crc);
	COMP_CRC32C(ControlFile->crc,
				(char *) ControlFile,
				offsetof(ControlFileData, crc));
	FIN_CRC32C(ControlFile->crc);

讀取文件時校驗它保證完整性:

	/* 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")));

看完上述內容,你們掌握PostgreSQL中怎么控制文件在初始化時生成的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

百色市| 潮州市| 体育| 江川县| 青阳县| 杭州市| 广宁县| 明光市| 沁水县| 中西区| 余姚市| 乌鲁木齐县| 和龙市| 哈尔滨市| 梁平县| 文山县| 岱山县| 惠东县| 阿克苏市| 林西县| 康平县| 莱西市| 泰安市| 济阳县| 鹤岗市| 唐山市| 大连市| 法库县| 离岛区| 阿克陶县| 昌黎县| 灵武市| 来宾市| 利辛县| 大宁县| 丹寨县| 资兴市| 淳安县| 沙坪坝区| 武义县| 赤壁市|