openGauss資料庫原始碼解析系列文章——備份恢復機制:openGauss增量備份技術(上)

語言: CN / TW / HK

上篇圖文,我們分享了備份恢復機制—openGauss全量備份技術的精彩內容,本篇將詳細介紹備份恢復機制—openGauss增量備份技術的相關內容。

10.2 openGauss增量備份技術

全量備份每次備份都需要複製全部資料庫的檔案,備份時間和儲存空間的開銷都比較大。增量備份只備份自上次備份以來的資料改變,可以減少備份的開銷。

openGauss增量備份工具為gs_probackup。gs_probackup支援全量備份、增量備份、對備份元資料進行管理、設定備份的留存策略、合併增量備份、刪除過期備份,並且可備份外部目錄的內容,如指令碼檔案、配置檔案、日誌檔案、dump檔案等。

增量備份需要資料庫伺服器端的配合,在conf檔案中配置引數enable_cbm_tracking = on,啟動資料庫伺服器對髒頁資料修改的跟蹤。

增量備份的主要邏輯在gs_probackup工具中實現,一些備份原理和前面介紹的全量物理備份相似,下面主要介紹gs_probackup工具的程式碼實現邏輯。原始碼在src\bin\pg_probackup目錄下,gs_probackup是一個獨立的二進位制工具,有自己的主函式,主函式在pg_probackup.cpp檔案中。主函式是增量備份處理的一個框架,開始時呼叫pgBackupInit初始化當前備份的元資料資訊,然後呼叫init_config初始化例項的備份配置資訊,解析備份子命令和命令列引數,根據子命令呼叫子命令的處理函式進行處理。

10.2.1  gs_probackup子命令

gs_probackup支援的功能、子命令和處理函式如下。

(1) 列印gs_probackup版本,程式碼如下:

gs_probackup -V|--version
gs_probackup version
這個子命令沒有處理函式,直接列印顯示當前版本號。

(2) 顯示gs_probackup命令的幫助資訊。如果指定了gs_probackup的子命令,則顯示可用於此子命令的引數的詳細資訊。程式碼如下:

gs_probackup -?|--help

gs_probackup help [command]

處理函式為help_command和help_pg_probackup。

(3) 初始化備份路徑backup-path中的備份目錄,該目錄將儲存備份的內容。如果備份路徑backup-path已存在,則backup-path必須為空目錄。程式碼如下:

gs_probackup init -B backup-path [--help]

處理函式為do_init。

(4) 在備份路徑backup-path內初始化一個新的備份例項,並生成pg_probackup.conf配置檔案,該檔案儲存了指定資料目錄pgdata-path的gs_probackup設定。程式碼如下:

gs_probackup add-instance -B backup-path -D pgdata-path --instance=instance_name
[-E external-directories-paths]
[remote_options]
[--help]

處理函式為do_add_instance。

(5) 在備份路徑backup-path內刪除指定例項相關的備份內容,程式碼如下:

gs_probackup del-instance -B backup-path --instance=instance_name
[--help]

處理函式為do_delete_instance。

(6) 將指定的連線、壓縮、日誌等相關設定新增到pg_probackup.conf配置檔案中,或修改已設定的值,不要手動編輯pg_probackup.conf配置檔案。程式碼如下:

gs_probackup set-config -B backup-path --instance=instance_name
[-D pgdata-path] [-E external-directories-paths] [--restore-command=cmdline] [--archive-timeout=timeout]
[--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth]
[--compress-algorithm=compress-algorithm] [--compress-level=compress-level]
[-d dbname] [-h hostname] [-p port] [-U username]
[logging_options] [remote_options]
[--help]

處理函式為do_set_config。

(7) 將備份相關設定新增到backup.control配置檔案中,或修改已設定的值。程式碼如下:

gs_probackup set-backup -B backup-path --instance=instance_name -i backup-id
[--note=text] [pinning_options]
[--help]

處理函式為do_set_backup。

(8) 顯示位於備份目錄中的pg_probackup.conf配置檔案的內容。可以通過指定--format=json選項,以json格式顯示。預設情況下,顯示為純文字格式,程式碼如下:

gs_probackup show-config -B backup-path --instance=instance_name
[--format=plain|json]
[--help]

處理函式為do_show_config。

(9) 顯示備份目錄的內容。如果指定了instance_name和backup_id,則顯示該備份的詳細資訊。可以通過指定--format=json選項,以json格式顯示。預設情況下,備份目錄的內容顯示為純文字格式,程式碼如下:

gs_probackup show -B backup-path
[--instance=instance_name [-i backup-id]] [--archive] [--format=plain|json]
[--help]

處理函式為do_show。

(10) 建立指定例項的備份,程式碼如下:

gs_probackup backup -B backup-path --instance=instance_name -b backup-mode
[-D pgdata-path] [-C] [-S slot-name] [--temp-slot] [--backup-pg-log] [-j threads_num] [--progress]
[--no-validate] [--skip-block-validation] [-E external-directories-paths] [--no-sync] [--note=text]
[--archive-timeout=timeout]
[logging_options] [retention_options] [compression_options]
[connection_options] [remote_options] [pinning_options]
[--help]

處理函式為do_backup。

(11) 從備份目錄backup-path中的備份副本恢復指定例項。如果指定了恢復目標選項,gs_probackup將查詢最近的備份並將其還原到指定的恢復目標。否則,使用最近一次備份,程式碼如下:

gs_probackup restore -B backup-path --instance=instance_name
[-D pgdata-path] [-i backup_id] [-j threads_num] [--progress] [--force] [--no-sync] [--no-validate] [--skip-block-validation]
[--external-mapping=OLDDIR=NEWDIR] [-T OLDDIR=NEWDIR] [--skip-external-dirs] [-I incremental_mode]
[recovery_options] [remote_options] [logging_options]
[--help]

處理函式為do_restore_or_validate。

(12) 將指定的增量備份與其父完全備份之間的所有增量備份合併到父完全備份。父完全備份將接收所有合併的資料,而已合併的增量備份將作為冗餘被刪除。程式碼如下:

gs_probackup merge -B backup-path --instance=instance_name -i backup_id
[-j threads_num] [--progress] [logging_options]
[--help]

處理函式為do_merge。

(13) 刪除指定備份,或刪除不滿足當前保留策略的備份,程式碼如下:

gs_probackup delete -B backup-path --instance=instance_name
[-i backup-id | --delete-expired | --merge-expired | --status=backup_status]
[--delete-wal] [-j threads_num] [--progress]
[--retention-redundancy=retention-redundancy] [--retention-window=retention-window]
[--wal-depth=wal-depth] [--dry-run]
[logging_options]
[--help]

處理函式為do_delete,do_retention和do_delete_status。

(14) 驗證恢復資料庫所需的所有檔案是否存在且未損壞。如果未指定instance_name,gs_probackup將驗證備份目錄中的所有可用備份。如果指定instance_name而不指定任何附加選項,gs_probackup將驗證此備份例項的所有可用備份。如果指定了instance_name並且指定backup-id或恢復目標相關選項,gs_probackup將檢查是否可以使用這些選項恢復資料庫。程式碼如下:

gs_probackup validate -B backup-path
[--instance=instance_name] [-i backup-id]
[-j threads_num] [--progress] [--skip-block-validation]
[--recovery-target-time=time | --recovery-target-xid=xid | --recovery-target-lsn=lsn | --recovery-target-name=target-name]
[--recovery-target-inclusive=boolean] [--recovery-target-timeline=timeline]
[logging_options]
[--help]

處理函式為do_validate_all和do_restore_or_validate。

gs_probackup在執行各個子命令處理函式之前,需要解析各個命令的命令列引數,gs_probackup支援的命令列引數如表1所示。

表1  命令列引數

引數

類別

描述

Command

通用引數

gs_probackup除version和help以外的子命令:init、add-instance、del-instance、set-config、set-backup、show-config、show、backup、restore、merge、delete、validate

-?, --help

通用引數

顯示gs_probackup命令列引數的幫助資訊,然後退出。子命令中只能使用--help,不能使用-?

-V, --version

通用引數

列印gs_probackup版本,然後退出

-B backup-path, --backup-path=backup-path

通用引數

備份的路徑。

系統環境變數:$BACKUP_PATH

-D pgdata-path, --pgdata=pgdata-path

通用引數

資料目錄的路徑。

系統環境變數:$PGDATA

--instance =instance_name

通用引數

例項名

-i backup-id, --backup-id=backup-id

通用引數

備份的唯一標識

--format=format

通用引數

指定顯示備份資訊的格式,支援plain和json格式。

預設值:plain

--status =backup_status

通用引數

刪除指定狀態的所有備份

-j threads_num, --threads=threads_num

通用引數

設定備份、還原、合併程序的並行執行緒數

--archive

通用引數

顯示WAL歸檔資訊

--progress

通用引數

顯示進度

--note=text

通用引數

給備份新增note

-b backup-mode, --backup-mode=backup-mode

備份引數

指定備份模式,支援FULL和PTRACK。

FULL:建立全量備份,全量備份包含所有資料檔案

PTRACK:建立PTRACK增量備份

-C, --smooth-checkpoint

備份引數

將檢查點在一段時間內完成。預設情況下,gs_probackup會嘗試儘快完成檢查點

-S slot-name, --slot=slot-name

備份引數

指定WAL流處理的複製槽

--temp-slot

備份引數

在備份的例項中為WAL流處理建立一個臨時物理複製槽,它確保在備份過程中,所有所需的WAL段仍然是可用的。預設的slot名為pg_probackup_slot,可通過選項--slot/-S更改

--backup-pg-log

備份引數

將日誌目錄包含到備份中。此目錄通常包含日誌訊息,預設情況下不包含日誌目錄

-E external-directories-paths, --external-dirs=external-directories-paths

備份引數

將指定的目錄包含到備份中。此選項對於備份位於資料目錄外部的指令碼、SQL轉儲和配置檔案很有用。如果要備份多個外部目錄,請在UNIX上用冒號分隔它們的路徑,如-E /tmp/dir1:/tmp/dir2

--skip-block-validation

備份引數

關閉塊級校驗,加快備份速度

--no-validate

備份引數

在完成備份後跳過自動驗證

--no-sync

備份引數

不將備份檔案同步到磁碟

--archive-timeout=timeout

備份引數

以秒為單位設定流式處理的超時時間。

預設值:300

-I, --incremental-mode=none|checksum|lsn

恢復引數

若PGDATA中可用的有效頁沒有修改,則重新使用他們。

預設值:none

--external-mapping=OLDDIR=NEWDIR

恢復引數

在恢復時,將包含在備份中的外部目錄從OLDDIR重新定位到NEWDIR目錄。OLDDIR和NEWDIR都必須是絕對路徑。如果路徑中包含“=”,則使用反斜槓轉義。此選項可為多個目錄多次指定

-T OLDDIR=NEWDIR, --tablespace-mapping=OLDDIR=NEWDIR

恢復引數

在恢復時,將表空間從OLDDIR重新定位到NEWDIR目錄。OLDDIR和NEWDIR必須都是絕對路徑。如果路徑中包含“=”,則使用反斜槓轉義。多個表空間可以多次指定此選項。此選項必須和--external-mapping一起使用

--skip-external-dirs

恢復引數

跳過備份中包含的使用--external-dirs選項指定的外部目錄。這些目錄的內容將不會被恢復

--skip-block-validation

恢復引數

跳過塊級校驗,以加快驗證速度。在恢復之前的自動驗證期間,將僅做檔案級別的校驗

--no-validate

恢復引數

跳過備份驗證

--force

恢復引數

允許忽略備份的無效狀態。如果出於某種原因需要從損壞的或無效的備份中恢復資料,可以使用此標誌。請謹慎使用

--recovery-target=immediate|latest

恢復目標引數

恢復目標引數:如果配置了連續的WAL歸檔,則可以和restore命令一起使用這些引數,定義何時停止恢復。

immediate:當達到指定備份的一致性狀態後,停止恢復;如果省略-i/--backup_id引數,則恢復到最新的可用的備份之後,停止恢復。

latest:持續進行恢復,直到應用了所有存檔中的所有可用的WAL段。

--recovery-target的預設值取決於要恢復的備份的WAL傳輸方式,STREAM流備份為immediate,歸檔模式為latest

--recovery-target-timeline=timeline

恢復目標引數

指定要恢復到的timeline。預設情況下,使用指定備份的timeline

--recovery-target-lsn=lsn

恢復目標引數

指定要恢復到的lsn

--recovery-target-name=target-name

恢復目標引數

指定要將資料恢復到的已命名的儲存點

--recovery-target-time=time

恢復目標引數

指定要恢復到的時間

--recovery-target-xid=xid

恢復目標引數

指定要恢復到的事務ID

--recovery-target-inclusive=boolean

恢復目標引數

當該引數指定為true時,恢復目標將包括指定的內容。

當該引數指定為false時,恢復目標將不包括指定的內容。

該引數必須和--recovery-target-name、--recovery-target-time、--recovery-target-lsn或--recovery-target-xid一起使用

--recovery-target-action=pause|promote|shutdown

恢復目標引數

指定恢復至目標時,伺服器應執行的操作

--restore-command=cmdline

恢復目標引數

指定恢復相關的命令。

例如:--restore-command='cp /mnt/server/archivedir/%f "%p"'

--retention-redundancy=retention-redundancy

備份留存引數

備份留存相關引數:可以和backup和delete命令一起使用這些引數。指定在資料目錄中留存的完整備份數。必須為正整數。0表示禁用此設定。

預設值:0

--retention-window=retention-window

備份留存引數

指定留存的天數。必須為正整數。0表示禁用此設定。

預設值:0

--wal-depth=wal-depth

備份留存引數

每個時間軸上必須留存的執行PITR能力的最新有效備份數。必須為正整數。0表示禁用此設定。

預設值:0

--delete-wal

備份留存引數

從任何現有的備份中刪除不需要的WAL檔案

--delete-expired

備份留存引數

刪除不符合pg_probackup.conf配置檔案中定義的留存策略的備份

--merge-expired

備份留存引數

將滿足留存策略要求的最舊的增量備份與其已過期的父備份合併

--dry-run

備份留存引數

顯示所有可用備份的當前狀態,不刪除或合併過期備份

--ttl=interval

備份留存引數

指定從恢復時間開始計算,備份要留存的時間量。必須為正整數。0表示取消備份固定。

支援的單位:ms,s,min,h,d(預設為s)。例如:--ttl=30d。

將某些備份從已建立的留存策略中排除,可以和backup和set-backup命令一起使用這些引數

--expire-time=time

備份留存引數

指定備份留存失效的時間戳。必須是ISO-8601標準的時間戳。

例如:--expire-time='2020-01-01 00:00:00+03'

--log-level-console=log-level-console

日誌引數

日誌級別:verbose、log、info、warning、error和off。設定要傳送到控制檯的日誌級別。每個級別都包含其後的所有級別。級別越高,傳送的訊息越少。指定off級別表示禁用控制檯日誌記錄。

預設值:info

--log-level-file=log-level-file

日誌引數

設定要傳送到日誌檔案的日誌級別。每個級別都包含其後的所有級別。級別越高,傳送的訊息越少。指定off級別表示禁用日誌檔案記錄。

預設值:off

--log-filename=log-filename

日誌引數

指定要建立的日誌檔案的檔名。檔名可以使用strftime模式,因此可以使用%-escapes指定隨時間變化的檔名。

例如,如果指定了“pg_probackup-%u.log”模式,則pg_probackup為每週的每一天生成單獨的日誌檔案,其中%u替換為相應的十進位制數字,即pg_probackup-1.log表示星期一;pg_probackup-2.log表示星期二,以此類推。

如果指定了--log-level-file引數啟用日誌檔案記錄,則該引數有效。

預設值:"pg_probackup.log"

--error-log-filename=error-log-filename

日誌引數

指定僅用於error日誌的日誌檔名。指定方式與--log-filename引數相同。此引數用於故障排除和監視

--log-directory=log-directory

日誌引數

指定建立日誌檔案的目錄。必須是絕對路徑。此目錄會在寫入第一條日誌時建立。

預設值:$BACKUP_PATH/log

--log-rotation-size=log-rotation-size

日誌引數

指定單個日誌檔案的最大值。如果達到此值,則啟動gs_probackup命令後,日誌檔案將迴圈,但help和version命令除外。0表示禁用基於檔案大小的迴圈。

支援的單位:KB、MB、GB、TB(預設為KB)。

預設值:0

--log-rotation-age=log-rotation-age

日誌引數

單個日誌檔案的最大生命週期。如果達到此值,則啟動gs_probackup命令後,日誌檔案將迴圈,但help和version命令除外。$BACKUP_PATH/log/log_rotation目錄下儲存最後一次建立日誌檔案的時間。0表示禁用基於時間的迴圈。

支援的單位:ms,s,min,h,d(預設為min)。

預設值:0

-d dbname, --pgdatabase=dbname

連線引數

指定要連線的資料庫名稱。該連線僅用於管理備份程序,因此您可以連線到任何現有的資料庫。如果命令列、PGDATABASE環境變數或pg_probackup.conf配置檔案中沒有指定此引數,則gs_probackup會嘗試從PGUSER環境變數中獲取該值。如果未設定PGUSER變數,則從當前使用者名稱獲取。系統環境變數:$PGDATABASE

-h hostname, --pghost=hostname

連線引數

指定執行伺服器的系統的主機名。如果該值以斜槓開頭,則被用作UNIX域套接字的路徑。

系統環境變數:$PGHOST。

預設值:local socket

-p port, --pgport=port

連線引數

指定伺服器正在偵聽連線的TCP埠或本地UNIX域套接字副檔名。

系統環境變數:$PGPORT。

預設值:5432

-U username, --pguser=username

連線引數

指定所連線主機的使用者名稱。

系統環境變數:$PGUSER

-w, --no-password

連線引數

不出現輸入密碼提示。如果主機要求密碼認證並且密碼沒有通過其他形式給出,則連線嘗試將會失敗。該選項在批量工作和不存在使用者輸入密碼的指令碼中很有幫助

-W, --password

連線引數

強制出現輸入密碼提示

--compress-algorithm=compress-algorithm

壓縮引數

可以和backup命令一起使用這些引數,指定用於壓縮資料檔案的演算法。

compress-algorithm取值包括zlib、pglz和none。如果設定為zlib或pglz,此選項將啟用壓縮。預設情況下,壓縮功能處於關閉狀態。

預設值:none

--compress-level=compress-level

壓縮引數

compress-level指定壓縮級別。取值範圍:0~9。

0表示無壓縮;

1表示壓縮比最小,處理速度最快;

9表示壓縮比最大,處理速度最慢;

可與--compress-algorithm選項一起使用。

預設值:1

--remote-proto=protocol

遠端模式引數

通過SSH遠端執行gs_probackup操作的相關引數。可以和add-instance、set-config、backup、restore命令一起使用這些引數。

指定用於遠端操作的協議。目前只支援SSH協議。取值包括:

SSH:通過SSH啟用遠端備份模式,這是預設值。

none:顯式禁用遠端模式。

如果指定了--remote-host引數,可以省略此引數

--remote-host=destination

遠端模式引數

指定要連線的遠端主機的IP地址或主機名

--remote-port=port

遠端模式引數

指定要連線的遠端主機的埠號。

預設值:22

--remote-user=username

遠端模式引數

指定SSH連線的遠端主機使用者。如果省略此引數,則使用當前發起SSH連線的使用者。

預設值:當前使用者

--remote-path=path

遠端模式引數

指定gs_probackup在遠端系統的安裝目錄。

預設值:當前路徑

--ssh-options=ssh_options

遠端模式引數

指定SSH命令列引數的字串。

例如:--ssh-options='-c cipher_spec -F configfile'

以上內容為備份恢復機制:openGauss增量備份技術的部分內容,由於此部分內容較多,下篇圖文將接著分享“openGauss增量備份技術”的其餘內容,敬請期待!