最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL實(shí)戰(zhàn)之啟動恢復(fù)讀取checkpoint記錄失敗的條件詳解

 更新時間:2018年08月06日 10:01:16   作者:yzs  
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)戰(zhàn)之啟動恢復(fù)讀取checkpoint記錄失敗的條件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、首先讀取ControlFile->checkPoint指向的checkpoint

2、如果讀取失敗,slave直接abort退出,master再次讀取ControlFile->prevCheckPoint指向的checkpoint

StartupXLOG->
 |--checkPointLoc = ControlFile->checkPoint;
 |--record = ReadCheckpointRecord(xlogreader, checkPointLoc, 1, true):
 |-- if (record != NULL){
   ...
  }else if (StandbyMode){
   ereport(PANIC,(errmsg("could not locate a valid checkpoint record")));
  }else{
   checkPointLoc = ControlFile->prevCheckPoint;
   record = ReadCheckpointRecord(xlogreader, checkPointLoc, 2, true);
   if (record != NULL){
    InRecovery = true;//標(biāo)記下面進(jìn)入recovery
   }else{
    ereport(PANIC,(errmsg("could not locate a valid checkpoint record")));
   }
  }

一、那么什么條件下讀取的checkpoint記錄record==NULL?

1、ControlFile->checkPoint % XLOG_BLCKSZ < SizeOfXLogShortPHD
2、ReadRecord(xlogreader, ControlFile->checkPoint, LOG, true)返回NULL
3、ReadRecord讀到的record!=NULL && record->xl_rmid != RM_XLOG_ID
4、ReadRecord讀到的record!=NULL && info != XLOG_CHECKPOINT_SHUTDOWN && info != XLOG_CHECKPOINT_ONLINE
5、ReadRecord讀到的record!=NULL && record->xl_tot_len != SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint)

二、ReadRecord函數(shù)返回NULL的條件

ReadRecord(xlogreader, ControlFile->checkPoint, LOG, true)
 |--record = XLogReadRecord(xlogreader, ControlFile->checkPoint, &errormsg);
 |-- 2.1 record==NULL && !StandbyMode
 |-- 2.2 record!=NULL && !tliInHistory(xlogreader->latestPageTLI, expectedTLEs)
 /*-----
 note:只要讀取了一頁xlog,就會賦值為該頁第一個記錄的時間線
 XLogReaderValidatePageHeader
  -->xlogreader->latestPageTLI=hdr->xlp_tli;
 ------*/

三、XlogReadRecord讀取checkpoint返回NULL的條件?

XLogReadRecord(xlogreader, ControlFile->checkPoint, &errormsg)
    targetPagePtr = ControlFile->checkPoint - (ControlFile->checkPoint % XLOG_BLCKSZ);
    targetRecOff = ControlFile->checkPoint % XLOG_BLCKSZ;
    readOff = ReadPageInternal(state,targetPagePtr, Min(targetRecOff + SizeOfXLogRecord, XLOG_BLCKSZ));
    pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf);
    record = (XLogRecord *) (state->readBuf + RecPtr % XLOG_BLCKSZ);
    total_len = record->xl_tot_len;
    -------------
    1、readOff < 0
    2、0< targetRecOff < pageHeaderSize
    3、(((XLogPageHeader) state->readBuf)->xlp_info & XLP_FIRST_IS_CONTRECORD) && targetRecOff == pageHeaderSize
       page頭有跨頁的record并且checkpoint定位的偏移正好在頁頭尾部
    4、targetRecOff <= XLOG_BLCKSZ - SizeOfXLogRecord &&
       !ValidXLogRecordHeader(state, ControlFile->checkPoint, state->ReadRecPtr, record,randAccess)
       ---(record->xl_tot_len < SizeOfXLogRecord || record->xl_rmid > RM_MAX_ID || record->xl_prev != state->ReadRecPtr)
    5、targetRecOff > XLOG_BLCKSZ - SizeOfXLogRecord && total_len < SizeOfXLogRecord
    6、total_len > state->readRecordBufSize && !allocate_recordbuf(state, total_len)
       一旦該記錄損壞,total_len的長度非常大的話,就需要allocate_recordbuf擴(kuò)展state->readbuf,可能因此分配失敗abort
       記錄的checksum需要等待全部讀取完整記錄后才校驗(yàn)
    -------------

三、ReadPageInternal返回的readOff返回小于0的條件

ReadPageInternal(state,targetPagePtr, Min(targetRecOff + SizeOfXLogRecord, XLOG_BLCKSZ))

    1、第一次read wal文件,readLen = state->read_page:讀取第一頁。readLen < 0

    2、readLen>0 && !XLogReaderValidatePageHeader(state, targetSegmentPtr, state->readBuf)
    --

    3、讀取checkpoint所在頁readLen = state->read_page: readLen < 0

    4、readLen > 0 && readLen <= SizeOfXLogShortPHD

    5、!XLogReaderValidatePageHeader(state, pageptr, (char *) hdr)

四、XLogPageRead何時返回值<0 ?

/*
 1、WaitForWALToBecomeAvailable open失敗
 2、lseek 失敗 && !StandbyMode
 3、read失敗 && !StandbyMode
 4、校驗(yàn)page頭失敗 && !StandbyMode
 如果是StandbyMode,則會重新retry->WaitForWALToBecomeAvailable,切換日志源進(jìn)行open
 */
 !WaitForWALToBecomeAvailable(targetPagePtr + reqLen,private->randAccess,1,targetRecPtr)//open
 |-- return -1
 readOff = targetPageOff;
 if (lseek(readFile, (off_t) readOff, SEEK_SET) < 0){
  !StandbyMode:: return -1
 }
 if (read(readFile, readBuf, XLOG_BLCKSZ) != XLOG_BLCKSZ){
  !StandbyMode:: return -1
 }
 XLogReaderValidatePageHeader(xlogreader, targetPagePtr, readBuf)
 !StandbyMode:: return -1

五、WaitForWALToBecomeAvailable何時返回false?

--XLOG_FROM_ARCHIVE | XLOG_FROM_PG_WAL
    1、先XLogFileReadAnyTLI open日志:
        1、遍歷時間線列表里的每一個時間線,從最新的開始
        2、當(dāng)讀取checkpoint的時候,source是XLOG_FROM_ANY
        3、先找歸檔的日志進(jìn)行open;如果open失敗再找WAL日志進(jìn)行open
        4、如果都沒有open成功,則向前找時間線,open前一個時間線segno和文件號相同的文件進(jìn)行open
        5、open成功后expectedTLEs被賦值為當(dāng)前時間線列表的所有值
    2、如果open失敗,則切換日志源:XLOG_FROM_ARCHIVE | XLOG_FROM_PG_WAL -> XLOG_FROM_STREAM
    3、切換日志源后,XLOG_FROM_ARCHIVE | XLOG_FROM_PG_WAL 則:
       slave && promote :return false
       !StandbyMode:return false
    --XLOG_FROM_STREAM
    1、!WalRcvStreaming()即receiver進(jìn)程掛了,切換日志源
    2、CheckForStandbyTrigger()切換日志源
    3、XLOG_FROM_STREAM->XLOG_FROM_ARCHIVE

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 淺談PostgreSQL表分區(qū)的三種方式

    淺談PostgreSQL表分區(qū)的三種方式

    隨著使用時間的增加,數(shù)據(jù)庫中的數(shù)據(jù)量也不斷增加,因此數(shù)據(jù)庫查詢越來越慢。加速數(shù)據(jù)庫的方法很多,如添加特定的索引,將日志目錄換到單獨(dú)的磁盤分區(qū),調(diào)整數(shù)據(jù)庫引擎的參數(shù)等。本文即將介紹的數(shù)據(jù)庫表分區(qū)即能達(dá)到此效果
    2021-06-06
  • PostgreSQL聚合函數(shù)的分組排序使用示例

    PostgreSQL聚合函數(shù)的分組排序使用示例

    這篇文章主要為大家介紹了PostgreSQL聚合函數(shù)的分組排序使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 如何為PostgreSQL的表自動添加分區(qū)

    如何為PostgreSQL的表自動添加分區(qū)

    這篇文章主要介紹了如何為PostgreSQL的表自動添加分區(qū),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • PostgreSql 導(dǎo)入導(dǎo)出sql文件格式的表數(shù)據(jù)實(shí)例

    PostgreSql 導(dǎo)入導(dǎo)出sql文件格式的表數(shù)據(jù)實(shí)例

    這篇文章主要介紹了PostgreSql 導(dǎo)入導(dǎo)出sql文件格式的表數(shù)據(jù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PotgreSQL?基于時間點(diǎn)恢復(fù)過程

    PotgreSQL?基于時間點(diǎn)恢復(fù)過程

    本篇文章介紹?PostgreSQL?基于時間點(diǎn)恢復(fù)(point-in-time-recover)需要的條件及恢復(fù)過程,屬于操作說明,對PotgreSQL?時間點(diǎn)恢復(fù)相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • PostgreSQL如何修改默認(rèn)端口號

    PostgreSQL如何修改默認(rèn)端口號

    文章主要內(nèi)容是關(guān)于在升級PostgreSQL過程中遇到的問題,以及解決這些問題的方法,升級過程中,由于端口號設(shè)置不正確,導(dǎo)致psql連接到舊版本的服務(wù)器,從而引發(fā)語法錯誤,解決方法是在連接數(shù)據(jù)庫時指定正確的端口號,或者修改默認(rèn)端口號
    2024-12-12
  • 解決postgresql 數(shù)據(jù)庫 update更新慢的原因

    解決postgresql 數(shù)據(jù)庫 update更新慢的原因

    這篇文章主要介紹了解決postgresql 數(shù)據(jù)庫 update更新慢的原因,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 解決postgresql 序列跳值的問題

    解決postgresql 序列跳值的問題

    這篇文章主要介紹了解決postgresql 序列跳值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 用PostgreSQL數(shù)據(jù)庫做地理位置app應(yīng)用

    用PostgreSQL數(shù)據(jù)庫做地理位置app應(yīng)用

    項(xiàng)目中用到了postgreSQL中的earthdistance()函數(shù)功能計(jì)算地球上兩點(diǎn)之間的距離,中文的資料太少了,我找到了一篇 英文的、講的很好的文章,特此翻譯,希望能夠幫助到以后用到earthdistance的同學(xué)
    2014-03-03
  • postgreSQL數(shù)據(jù)庫默認(rèn)用戶postgres常用命令分享

    postgreSQL數(shù)據(jù)庫默認(rèn)用戶postgres常用命令分享

    這篇文章主要介紹了postgreSQL數(shù)據(jù)庫默認(rèn)用戶postgres常用命令分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

云南省| 甘南县| 石棉县| 丰镇市| 黄平县| 连南| 高邑县| 枣庄市| 南岸区| 沙坪坝区| 富裕县| 高清| 刚察县| 平山县| 印江| 阿勒泰市| 布尔津县| 简阳市| 崇仁县| 天长市| 迁西县| 泌阳县| 黄石市| 京山县| 莆田市| 普洱| 清丰县| 江油市| 兴化市| 全州县| 浏阳市| 霍邱县| 琼结县| 科尔| 安龙县| 综艺| 张家港市| 永新县| 叙永县| 金阳县| 安岳县|