成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PostgreSQL備機checkpoint

? 數(shù)據(jù)庫異常關(guān)閉時,數(shù)據(jù)庫關(guān)閉時來不及或者沒機會做checkpoint,則需要從上一個一致性檢查的開始恢復(fù)。

站在用戶的角度思考問題,與客戶深入溝通,找到南召網(wǎng)站設(shè)計與南召網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋南召地區(qū)。

? ? PostgreSQL備機checkpoint是不能產(chǎn)生checkpoint WAL的,因為如果寫這樣類型的checkpoint的話,就會將接收的WAL打亂,那么日志將混亂,回放會出問題。

? ? 那么問題來了,備機支持checkpoint嗎?他的checkpoint怎么做的?

? ? PostgreSQL為了縮短恢復(fù)時間,備機上也支持checkpoint,即CreateRestartPoint。但是其pg_control文件的checkpoint記錄的位點是從主機傳過來WAL里面的checkpoint記錄位置。

1、備機回放

StartupXLOG
    do{
        ...
        RmgrTable[record->xl_rmid].rm_redo(xlogreader);//回放
        ...
        record = ReadRecord(xlogreader, InvalidXLogRecPtr, LOG, false);//讀取一個xlog
    } while (record != NULL);

2、回放函數(shù)

void
xlog_redo(XLogReaderState *record)
{
    ...
    else if (info == XLOG_CHECKPOINT_SHUTDOWN){
        ...
        memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
        ...
        RecoveryRestartPoint(&checkPoint);
    }else if (info == XLOG_CHECKPOINT_ONLINE){
        ...
        memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
        ...
        RecoveryRestartPoint(&checkPoint);
    }
    ...
}

3、RecoveryRestartPoint

static void
RecoveryRestartPoint(const CheckPoint *checkPoint)
{
    ...
    SpinLockAcquire(&XLogCtl->info_lck);
    XLogCtl->lastCheckPointRecPtr = ReadRecPtr;//ReadRecPtr為讀取checkpoint記錄后的位置
    XLogCtl->lastCheckPointEndPtr = EndRecPtr;
    XLogCtl->lastCheckPoint = *checkPoint;
    SpinLockRelease(&XLogCtl->info_lck);
}

4、ReadRecPtr賦值

ReadRecord
    for (;;)
    {
        char       *errormsg;

        record = XLogReadRecord(xlogreader, RecPtr, &errormsg);
        ReadRecPtr = xlogreader->ReadRecPtr;
        EndRecPtr = xlogreader->EndRecPtr;
        ...
    }

5、備機createcheckpoint

bool
CreateRestartPoint(int flags)
{

    LWLockAcquire(CheckpointLock, LW_EXCLUSIVE);

    /* Get a local copy of the last safe checkpoint record. */
    SpinLockAcquire(&XLogCtl->info_lck);
    lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;//checkpoint的位置來自XLogCtl->lastCheckPointRecPtr
    lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr;
    lastCheckPoint = XLogCtl->lastCheckPoint;
    SpinLockRelease(&XLogCtl->info_lck);

    ...

    if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) || lastCheckPoint.redo <= ControlFile->checkPointCopy.redo){
        //回放了最后一個checkpoint記錄后,備機再次手動執(zhí)行checkpoint命令
        UpdateMinRecoveryPoint(InvalidXLogRecPtr, true);
        if (flags & CHECKPOINT_IS_SHUTDOWN){
            LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
            ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY;
            ControlFile->time = (pg_time_t) time(NULL);
            UpdateControlFile();
            LWLockRelease(ControlFileLock);
        }
        LWLockRelease(CheckpointLock);
        return false;
    }
    ...
    LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
    if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY && ControlFile->checkPointCopy.redo < lastCheckPoint.redo){
        ControlFile->prevCheckPoint = ControlFile->checkPoint;
        ControlFile->checkPoint = lastCheckPointRecPtr;//checkpoint的位置
        ControlFile->checkPointCopy = lastCheckPoint;
        ControlFile->time = (pg_time_t) time(NULL);
        ...
        if (flags & CHECKPOINT_IS_SHUTDOWN)
            ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY;
        UpdateControlFile();
    }
    ...

    return true;
}

6、備機shutdown

void
ShutdownXLOG(int code, Datum arg)
{
    /*
     * Signal walsenders to move to stopping state.
     */
    WalSndInitStopping();

    /*
     * Wait for WAL senders to be in stopping state.  This prevents commands
     * from writing new WAL.
     */
    WalSndWaitStopping();

    if (RecoveryInProgress())//備機寫checkpoint
        CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
    else
    {
        /*
         * If archiving is enabled, rotate the last XLOG file so that all the
         * remaining records are archived (postmaster wakes up the archiver
         * process one more time at the end of shutdown). The checkpoint
         * record will go to the next XLOG file and won't be archived (yet).
         */
        if (XLogArchivingActive() && XLogArchiveCommandSet())
            RequestXLogSwitch(false);

        CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
    }
    ShutdownCLOG();
    ShutdownCommitTs();
    ShutdownSUBTRANS();
    ShutdownMultiXact();
}

7、總結(jié)

PostgreSQL備庫也可以寫檢查點,目的是避免每次重啟備庫都需要從上一個檢查點(由主庫產(chǎn)生,在WAL中回放出來的)APPLY后面所有的WAL。但是他記錄的checkpoint位點是從主庫傳過來的。這樣的話就有問題了,如果主機很長時間都沒有做checkpoint了,備機即使正常關(guān)閉,重啟時,也會從上一個checkpoint開始恢復(fù),這樣也會恢復(fù)很長時間;并且多次重啟也需要從上一次checkpoint開始重復(fù)恢復(fù)。

網(wǎng)頁名稱:PostgreSQL備機checkpoint
文章出自:http://jinyejixie.com/article42/pocgec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、定制網(wǎng)站搜索引擎優(yōu)化、品牌網(wǎng)站制作網(wǎng)站營銷、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
仙居县| 扶余县| 龙海市| 汪清县| 襄樊市| 庄浪县| 安吉县| 逊克县| 乐都县| 中西区| 桐梓县| 建德市| 镇宁| 普格县| 大洼县| 西乌| 柘城县| 大埔区| 乌审旗| 万宁市| 西乌珠穆沁旗| 天台县| 崇阳县| 民丰县| 临海市| 内江市| 个旧市| 沙雅县| 本溪| 酒泉市| 维西| 灯塔市| 门源| 前郭尔| 绥德县| 喀喇| 棋牌| 屏东县| 米易县| 南安市| 昌吉市|