訂閱
糾錯(cuò)
加入自媒體

技術(shù)文章:PostgreSQL pg_resetwal處理機(jī)制

2021-05-26 17:09
yzsDBA
關(guān)注

pg_resetwal的參數(shù)

ControlFile結(jié)構(gòu)及pg_resetwal參數(shù)影響的字段

static struct option long_options[] = {    {"commit-timestamp-ids", required_argument, NULL, 'c'},    {"pgdata", required_argument, NULL, 'D'},    {"epoch", required_argument, NULL, 'e'},    {"force", no_argument, NULL, 'f'},    {"next-wal-file", required_argument, NULL, 'l'},    {"multixact-ids", required_argument, NULL, 'm'},    {"dry-run", no_argument, NULL, 'n'},    {"next-oid", required_argument, NULL, 'o'},    {"multixact-offset", required_argument, NULL, 'O'},    {"next-transaction-id", required_argument, NULL, 'x'},    {"wal-segsize", required_argument, NULL, 1},    {NULL, 0, NULL, 0}  };

介紹

PG11允許用戶在線修改WAL段文件大小。以往版本需要重新編譯,并且不同--wal-segsize設(shè)置的PG相互不兼容。這個(gè)值范圍1—1024,為2的平方且單位M。當(dāng)改變大小時(shí)建議和-l參數(shù)一起使用,設(shè)置下一個(gè)WAL文件名,防止重復(fù)使用之前的名字。下一個(gè)段文件名要比當(dāng)前已存在的都要大,

該工具會(huì)將WAL目錄下日志全部刪除,并生成一個(gè)新WAL段文件。該文件名起名規(guī)則:

1、-l指定的段文件名解析出段號(hào)minXlogSegNo

2、FindEndOfXLOG掃描WAL目錄下所有文件得到最大的文件號(hào):

1)newXlogSegNo為pg_control文件中記錄的ckp所屬段號(hào)

2)若目錄下由比這個(gè)號(hào)大的,則更新newXlogSegNo為該段號(hào)

3)該段號(hào)轉(zhuǎn)換成WAL長(zhǎng)度后,除以新段文件大小得到新段文件段號(hào)newXlogSegNo,將之+1作為新段文件的段號(hào)

3、原pg_control文件中的ckp作為CHECKPOINT記錄寫入新段文件里面。該段文件僅寫這一個(gè)WAL,后面的大小全部清0。

4、新pg_control文件的checkpoint位置為該文件中CHECKPOINT記錄位置。

5、這個(gè)工具比較危險(xiǎn),慎用。

6、在主備環(huán)境中,備機(jī)啟動(dòng)不起來(lái),且日志損壞時(shí),主機(jī)數(shù)據(jù)量非常大,全量重新拷貝又耗費(fèi)時(shí)間特別長(zhǎng),此時(shí)可以嘗試使用這個(gè)工具:

1)比較備機(jī)和主機(jī)的pg_control文件的checkpoint位置,若備機(jī)和主機(jī)記錄的checkpoint位置相等,則可以執(zhí)行pg_resetwal,這樣重新啟動(dòng)后可以正常構(gòu)建流復(fù)制,數(shù)據(jù)也不會(huì)丟

2)若備機(jī)的checkpoint小,使用這個(gè)pg_control文件進(jìn)行pg_resetwal可能重啟后構(gòu)建不起來(lái)流復(fù)制。使用主機(jī)的pg_control文件進(jìn)行pg_resetwal,重啟后可構(gòu)建流復(fù)制,但丟數(shù)據(jù)

3)若備機(jī)的checkpoint大,使用這個(gè)pg_control文件進(jìn)行pg_resetwal,可能重啟后構(gòu)建不起來(lái)流復(fù)制,即使構(gòu)建起來(lái)也丟數(shù)據(jù)。使用主機(jī)的pg_control文件進(jìn)行pg_resetwal,應(yīng)該也可以正常。

4)備機(jī)的時(shí)間線文件需要清理

流程

pg_control文件的更新,然后調(diào)用KillExistingXLOG刪除pg_wal目錄下的所有WAL文件:

      while(errno = 0, (xlde = readdir(xldir)) 。 NULL){              if(IsXLogFileName(xlde->d_name) || IsPartialXLogFileName(xlde->d_name)){                     snprintf(path,sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);                     if(unlink(path) < 0){                            pg_log_error("couldnot delete file "%s": %m", path);                            exit(1);                     }              }       }

調(diào)用函數(shù)KillExistingArchiveStatus刪除archive_status目錄下.ready,.done和.partial.ready、.partial.done文件:

      while(errno = 0, (xlde = readdir(xldir)) 。 NULL){              if(strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN&&                     (strcmp(xlde->d_name+ XLOG_FNAME_LEN, ".ready") == 0 ||                      strcmp(xlde->d_name + XLOG_FNAME_LEN,".done") == 0 ||                     strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.ready") == 0 ||                      strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.done") == 0))              {                     snprintf(path,sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);                     if(unlink(path) < 0){                            pg_log_error("couldnot delete file "%s": %m", path);                            exit(1);                     }              }       }

最后調(diào)用函數(shù)WriteEmptyXLOG創(chuàng)建一個(gè)新WAL段文件,并僅寫入一個(gè)checkpoint記錄,其中checkpoint記錄來(lái)自ControlFile結(jié)構(gòu)。

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)