网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

PostgreSQL问题分析1:时间线不一致

一、问题:requested timeline %u does not contain minimum recovery point %X/%X on timeline %u

成都创新互联是一家从事企业网站建设、网站建设、网站设计、行业门户网站建设、网页设计制作的专业网站建设公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点超过千家。

该日志在代码中的位置如下:

StartupXLOG:
    if (!XLogRecPtrIsInvalid(ControlFile->minRecoveryPoint) &&
        tliOfPointInHistory(ControlFile->minRecoveryPoint - 1, expectedTLEs) !=
        ControlFile->minRecoveryPointTLI)
        ereport(FATAL,
                (errmsg("requested timeline %u does not contain minimum recovery point %X/%X on timeline %u",
                        recoveryTargetTLI,
                        (uint32) (ControlFile->minRecoveryPoint >> 32),
                        (uint32) ControlFile->minRecoveryPoint,
                        ControlFile->minRecoveryPointTLI)));

二、分析

recoveryTargetTLI这个值是什么呢?

1、改值在启动恢复过程中变化如下:

StartupXLOG:
    ...
    if (ControlFile->minRecoveryPointTLI > ControlFile->checkPointCopy.ThisTimeLineID)
        recoveryTargetTLI = ControlFile->minRecoveryPointTLI;
    else
        recoveryTargetTLI = ControlFile->checkPointCopy.ThisTimeLineID;
    readRecoveryCommandFile();
    |-- for (item = head; item; item = item->next){
    |       ...
    |       else if (strcmp(item->name, "recovery_target_timeline") == 0){
    |           rtliGiven = true;
    |           if (strcmp(item->value, "latest") == 0)
    |               rtli = 0;
    |           else
    |               rtli = (TimeLineID) strtoul(item->value, NULL, 0);
    |       }
    |       ...
    |   }
    |   ...
    |   if (rtliGiven){
    |       if (rtli){
    |           recoveryTargetTLI = rtli;
    |           recoveryTargetIsLatest = false;
    |       }else{
    |           recoveryTargetTLI = findNewestTimeLine(recoveryTargetTLI);
    |           recoveryTargetIsLatest = true;
    |       }
    |-- }

首先,pg_control文件记录的最小恢复点时间线ControlFile->minRecoveryPointTLI会和pg_control文件记录的checkpoint的的时间线 ControlFile->checkPointCopy.ThisTimeLineID比较,recoveryTargetTLI取两者之间较大值。

然后readRecoveryCommandFile会读取recovery.cnf文件,如果是主机则没有recovery.cnf文件。recovery.cnf文件中recovery_target_timeline的值指定恢复到的时间线,如果是latest则时间线rtli为0否则为其指定值;如果rtli是指定值,则recoveryTargetTLI为指定值,否则从第一步获取的recoveryTargetTLI值+1开始,看是否有其对于的history文件,找到最大时间线对于的history文件,recoveryTargetTLI为该时间线。


网站题目:PostgreSQL问题分析1:时间线不一致
分享路径:http://bjjierui.cn/article/pjodpj.html

其他资讯