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

PostgreSQL時間線(timeline)和History File的用法

 更新時間:2020年12月30日 15:51:51   作者:foucus、  
這篇文章主要介紹了PostgreSQL時間線(timeline)和History File的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

說明:

在pg中,當我們進行了基于時間點的還原(PITR)后,數(shù)據(jù)庫會啟用新的時間線并繼續(xù)進行操作。

但是,當我們進行基于時間點的還原后如果發(fā)現(xiàn)又出現(xiàn)錯誤,想要繼續(xù)還原數(shù)據(jù)庫該如何操作呢?如何還原到原先舊的時間線呢?

我們可以使用recovery_target_timeline參數(shù)來指定數(shù)據(jù)庫還原到某一個時間線上。如果你還不清楚這個參數(shù)該如何使用,或者說壓根不知道時間線是啥,那么請繼續(xù)往下看。

PostgreSQL 時間線:

每當我們在數(shù)據(jù)庫中完成一個事務時,所做的操作都會記錄到$PGDATA/pg_wal目錄下的wal日志文件中。

wal日志文件一般都是下面這種格式:

000000010000000000000001

當一個wal日志被寫滿后,便會創(chuàng)建新的wal日志000000010000000000000002,以此類推。

該文件中前8位,即:00000001表示的便是數(shù)據(jù)庫的時間線。

從控制文件中也可以看到:

-bash-4.1$-> pg_controldata |grep TimeLineID
Latest checkpoint's TimeLineID: 1
Latest checkpoint's PrevTimeLineID: 1

每當我們進行基于時間點的還原后,時間線便會加1,并創(chuàng)建一個名為NewTimelineID.history的新文件。這個文件是干什么用的我們后面會介紹。

recovery_target_timeline是一個參數(shù),它可以幫助我們將集群帶入歷史記錄中的任何時間線,只要有效的基本備份和所有存檔日志都到位。

我們來看看下面的例子:

首先,重新初始化一個新的數(shù)據(jù)庫集群。

-bash-4.1$-> ls pg_wal
000000010000000000000001 archive_status

然后創(chuàng)建一張表并插入數(shù)據(jù)。

bill=# create table timeline(tid int, remarks varchar(1000));
CREATE TABLE
bill=# insert into timeline values('1','This is timeline id 1');
INSERT 0 1
bill=# checkpoint;
CHECKPOINT
bill=# select pg_switch_wal();
pg_switch_wal
---------------
0/15D4B70
(1 row)

剛剛插入的數(shù)據(jù)便記錄在000000010000000000000001的wal日志中。

當wal日志寫到000000010000000000000005時,進行一次完整的備份,接著再產生一些新的wal日志。

-bash-4.1$ ls -rlt
total 147460
-rw------- 1 postgres postgres 16777216 Nov 22 13:03 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Nov 22 13:03 000000010000000000000002
-rw------- 1 postgres postgres 16777216 Nov 22 13:03 000000010000000000000003
-rw------- 1 postgres postgres 16777216 Nov 22 13:05 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Nov 22 13:05 000000010000000000000005
-rw------- 1 postgres postgres 337 Nov 22 13:05 000000010000000000000005.00000028.backup
-rw------- 1 postgres postgres 16777216 Nov 22 13:06 000000010000000000000006
-rw------- 1 postgres postgres 16777216 Nov 22 13:06 000000010000000000000007

可以看到,現(xiàn)在最新的wal日志是000000010000000000000008

接著插入一條新的數(shù)據(jù)。

bill=# insert into timeline values('1','This is timeline id 1 after basebackup');
INSERT 0 1
bill=# checkpoint;
CHECKPOINT
-bash-4.1$ pg_waldump 000000010000000000000008 | grep INSERT
rmgr: Heap len (rec/tot): 54/ 214, tx:
487, lsn: 0/08000110, prev 0/080000D8, desc: INSERT off 2 flags 0x00,
blkref #0: rel 1663/13530/16384 blk 0 FPW

然后再產生幾個wal日志,現(xiàn)在的情況如下:

-bash-4.1$ ls -rlt
total 311308
-rw------- 1 16777216 Nov 22 13:03 000000010000000000000001
-rw------- 1 16777216 Nov 22 13:03 000000010000000000000002
-rw------- 1 16777216 Nov 22 13:03 000000010000000000000003
-rw------- 1 16777216 Nov 22 13:05 000000010000000000000004
-rw------- 1 16777216 Nov 22 13:05 000000010000000000000005
-rw------- 1 337 Nov 22 13:05 000000010000000000000005.00000028.backup
-rw------- 1 16777216 Nov 22 13:06 000000010000000000000006
-rw------- 1 16777216 Nov 22 13:06 000000010000000000000007
-rw------- 1 16777216 Nov 22 13:07 000000010000000000000008
-rw------- 1 16777216 Nov 22 13:07 000000010000000000000009
-rw------- 1 16777216 Nov 22 13:09 00000001000000000000000A

如下圖所示:

此時,在我插入第二條數(shù)據(jù)前,我想要把數(shù)據(jù)還原到000000010000000000000007這個點。

因此我在postgresql.conf文件中將恢復目標lsn設置為“ 0/07000060”。

接著進行還原,當我們還原之后,數(shù)據(jù)庫切換到了新的時間線。

除此之外還有哪些改變呢?

恢復結束是指數(shù)據(jù)庫打開進行寫入的點。

創(chuàng)建了新的時間線的 history file文件,如00000002.history。

前一個時間線上的部分WAL文件已被新時間線的ID復制。

檢查點記錄寫在新的時間線上。

日志中會記錄下列信息:

LOG: starting point-in-time recovery to WAL location (LSN) "0/7000060"
LOG: restored log file "000000010000000000000005" from archive
LOG: redo starts at 0/5000028
LOG: consistent recovery state reached at 0/5000138
LOG: database system is ready to accept read only connections
LOG: restored log file "000000010000000000000006" from archive
LOG: restored log file "000000010000000000000007" from archive
LOG: recovery stopping after WAL location (LSN) "0/7000060"
LOG: pausing at the end of recovery
HINT: Execute pg_wal_replay_resume() to promote.

此時,PostgreSQL已在wal日志7處分支到新的時間線,并開始創(chuàng)建時間線ID為2的新wal日志。我們可以下wal日志目錄下看到00000002.history文件。

該文件是可讀文件,內容大致為:

1<parentTLI> 0/70000D8 <switchpoint> after LSN 0/7000060<reason>
parentTLI  ID of the parent timeline
switchpoint XLogRecPtr of the WAL location where the switch happened
reason  human-readable explanation of why the timeline was changed

接下來,我向wal日志00000002000000000000000A (0/A000060)中插入新的數(shù)據(jù)。

bill=# insert into timeline values('2','This is timeline id 2 correct');
INSERT 0 1

以及另一個wal日志00000002000000000000000D(0/D000000)中插入另一條數(shù)據(jù)。

bill=# insert into timeline values('2','This is timeline id 2 wrong at 0/D000000');
INSERT 0 1

這個時候,我在00000002000000000000000D的wal日志中執(zhí)行了錯誤的操作,想要回退到時間線2的00000002000000000000000C處,那么我要如何操作呢,如果像前面一樣只指定lsn那么怎么保證不會回退到時間線1中呢?

這個時候我們便可以通過指定recovery_target_timeline來實現(xiàn)。

在postgresql.conf文件中添加:

recovery_target_timeline = '2'
recovery_target_lsn = '0/0C000060'

接著,啟動數(shù)據(jù)庫,可以看到日志中:

LOG: database system was interrupted; last known up at 2020-11-22 13:05:01 IST
LOG: restored log file "<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">00000002.history</span>" from archive
cp: cannot stat `/u02/archivelogs/00000003.history': No such file or directory
LOG: starting point-in-time recovery to WAL location (LSN) "0/C000060"
LOG: restored log file "00000002.history" from archive
LOG: restored log file "<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">000000010000000000000005</span>" from archive
LOG: redo starts at 0/5000028
LOG: consistent recovery state reached at 0/5000138
LOG: database system is ready to accept read only connections
LOG: restored log file "000000010000000000000006" from archive
LOG: restored log file "000000020000000000000007" from archive
LOG: restored log file "000000020000000000000008" from archive
LOG: restored log file "000000020000000000000009" from archive
LOG: restored log file "00000002000000000000000A" from archive
LOG: restored log file "00000002000000000000000B" from archive
LOG: restored log file "<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">00000002000000000000000C</span>" from archive
LOG: recovery stopping after WAL location (LSN) "<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">0/C000060</span>"
LOG: pausing at the end of recovery
HINT: Execute pg_wal_replay_resume() to promote.
..
LOG: redo done at 0/C000060
LOG: last completed transaction was at log time 2020-11-22 13:15:29.696929+05:30

然后查詢該表驗證:

bill=# select * from timeline;
 tid | remarks
-----+-------------------------------
 1 | This is timeline id 1
 2 | This is timeline id 2 correct
(2 rows)

此時可以看到新建了00000003.history文件,該文件內容如下:

-bash-4.1$ cat 00000003.history
1 0/70000D8 after LSN 0/7000060
2 0/C0000D8 after LSN 0/C000060

我們不難發(fā)現(xiàn):

history file這個文件中記錄的就是這個時間線是從哪個WAL位置開始生成的。

補充:PostgreSQL promote過程 和 一主多備 時間線 無縫對接 詳解

PostgreSQL的physical standby數(shù)據(jù)庫的promote過程,數(shù)據(jù)庫會在pg_xlog目錄產生3個文件。

例如將備庫1 promote,它將在pg_xlog目錄產生如下文件:

A.partial (xlog) 
NEWTL_A (xlog)
NEWTL.history (history file)

例如備庫1當前已接收到的XLOG位置是 00000001000000000000002D 文件中的某個位置 0/2D15D7D0,現(xiàn)在promote它 。

將會在pg_xlog目錄中產生3個文件:

00000001000000000000002D.partial
00000002000000000000002D 
 (00000001000000000000002D.partial 的內容會拷貝到 00000002000000000000002D)
00000002.history
  1 0/2D15D7D0 no recovery target specified

假設還有一個備庫叫備庫2,備庫2如何能順利的對接到已激活的備庫1呢?

有個前提條件

備庫2在TL1這條時間線上,還沒有接收到00000001000000000000002D 這個文件。

把00000002.history拷貝到備庫2的pg_xlog。

備庫2會在應用完00000001000000000000002C后請求下一個時間線的 00000002000000000000002D 文件。

這樣就能完美對接。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • Debian中PostgreSQL數(shù)據(jù)庫安裝配置實例

    Debian中PostgreSQL數(shù)據(jù)庫安裝配置實例

    這篇文章主要介紹了Debian中PostgreSQL數(shù)據(jù)庫安裝配置實例,一個簡明教程,需要的朋友可以參考下
    2014-06-06
  • PostgreSQL管理工具phpPgAdmin入門指南

    PostgreSQL管理工具phpPgAdmin入門指南

    phpPgAdmin是用PHP開發(fā)的一個基于web的PostgreSQL數(shù)據(jù)庫管理工具。和MySql時代的PHPMyAdmin類似。本文介紹了phpPgAdmin安裝和使用方法,需要的朋友可以參考下
    2014-03-03
  • pgsql 實現(xiàn)用戶自定義表結構信息獲取

    pgsql 實現(xiàn)用戶自定義表結構信息獲取

    這篇文章主要介紹了pgsql 實現(xiàn)用戶自定義表結構信息獲取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL更新表時時間戳不會自動更新的解決方法

    PostgreSQL更新表時時間戳不會自動更新的解決方法

    這篇文章主要為大家詳細介紹了PostgreSQL更新表時時間戳不會自動更新的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 如何解決PostgreSQL執(zhí)行語句長時間卡著不動不報錯也不執(zhí)行的問題

    如何解決PostgreSQL執(zhí)行語句長時間卡著不動不報錯也不執(zhí)行的問題

    某日開發(fā)同事上報一sql性能問題,一條查詢好似一直跑不出結果,查詢了n小時,還未返回結果,這篇文章主要給大家介紹了關于如何解決PostgreSQL執(zhí)行語句長時間卡著不動不報錯也不執(zhí)行問題的相關資料,需要的朋友可以參考下
    2024-02-02
  • 查詢PostgreSQL中所有表邏輯外鍵的方法

    查詢PostgreSQL中所有表邏輯外鍵的方法

    本文介紹了如何查詢PostgreSQL中所有表的邏輯外鍵,并指導您如何先刪除再重新建立這些外鍵,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友一起看看吧
    2023-08-08
  • PostgreSQL 安裝和簡單使用

    PostgreSQL 安裝和簡單使用

    ostgreSQL是現(xiàn)在比較流行的數(shù)據(jù)庫之一,這個起源于伯克利(BSD)的數(shù)據(jù)庫研究計劃目前已經衍生成一項國際開發(fā)項目,并且有非常廣泛的用戶。
    2009-08-08
  • PostgreSQL截取字符串到指定字符位置詳細示例

    PostgreSQL截取字符串到指定字符位置詳細示例

    這篇文章主要給大家介紹了關于PostgreSQL截取字符串到指定字符位置的相關資料,PostgreSQL數(shù)據(jù)庫拼接字符串函數(shù)是一種非常重要的函數(shù),使用它可以方便地將不同的字符串進行拼接操作,從而得到我們需要的結果,需要的朋友可以參考下
    2023-07-07
  • 基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容

    基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容

    這篇文章主要介紹了基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Postgresql和mysql的區(qū)別及說明

    Postgresql和mysql的區(qū)別及說明

    這篇文章主要介紹了Postgresql和mysql的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

柳河县| 锡林郭勒盟| 乌兰县| 莒南县| 巴塘县| 古丈县| 莲花县| 堆龙德庆县| 东莞市| 龙山县| 买车| 左云县| 大英县| 琼海市| 临猗县| 安化县| 宽甸| 林甸县| 德令哈市| 平邑县| 海安县| 马关县| 伊宁市| 海晏县| 广南县| 龙山县| 广水市| 诸城市| 马鞍山市| 安阳市| 通化市| 肇州县| 黄浦区| 武夷山市| 延寿县| 白水县| 上蔡县| 阿城市| 柯坪县| 宣城市| 姚安县|