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增量備份技術”的其餘內容,敬請期待!