文章目錄
一、簡介
Greenplum數據庫支持並行和非並行方法來備份和還原數據庫。並行操作可擴展,而與系統中段的數量無關,因爲段主機各自將數據同時寫入本地磁盤存儲中。對於非並行備份和還原操作,必須通過網絡將數據從網段發送到主服務器,主服務器將所有數據寫入其存儲中。除了將I/O限制在一臺主機之外,非並行備份還要求主服務器具有足夠的本地磁盤存儲空間來存儲整個數據庫。
1.1 使用gpbackup和gprestore的並行備份
gpbackup 和 gprestore 是Greenplum數據庫備份和還原實例,採用MVCC機制來保障備份的數據,庫級一致性。避免原來需要鎖pg_class exclusive的問題。需要鎖定元數據(catelog AccessShareLock),同時對備份對象加AccessShareLock鎖,不允許drop已有的表,Alter已有的表結構,truncate已有表等操作(只允許AccessShareLock不衝突的操作)。但是可以在備份啓動並加載完所有的accessshare lock後新增表以及對新增的表做任何DDL DML操作。
1.2 使用pg_dump進行非並行備份
PostgreSQL的 pg_dump 和 pg_dumpall 非並行備份可用於在master主機上創建單個轉儲文件,其中包含來自所有活動段的所有數據。
PostgreSQL非並行備份僅應在特殊情況下使用。它們比使用Greenplum備份要慢得多,因爲所有數據都必須通過master數據庫。另外,通常情況下,master主機的磁盤空間不足,無法保存整個分佈式Greenplum數據庫的備份。
pg_restore 需要由創建的壓縮轉儲文件 pg_dump/ pg_dumpall。開始還原之前,應該修改 CREATE TABLE 轉儲文件中的語句以包含Greenplum DISTRIBUTED 子句。如果不包括DISTRIBUTED子句,Greenplum數據庫分配默認值,該值可能不是最佳值。
要使用並行備份文件執行非並行還原,可以將備份文件從每個段主機複製到主服務器主機,然後通過master服務器加載它們。
備份Greenplum數據庫數據的另一種非並行方法是使用 複製到 SQL命令,用於將表的全部或部分從數據庫複製到master主機上的文本文件中。
二、安裝
2.1 gpbackup&gprestore
需要從Pivotal Network下載適用於的Greenplum數據庫版本和OS平臺的最新Pivotal Greenplum Backup and Restore軟件發行版。
將安裝包上傳至master節點進行安裝
gppkg -i pivotal_greenplum_backup_restore-1.17.0-1-gp6-rhel-x86_64.gppkg
2.2 pg_dump&pg_restore
postgres軟件自帶,無需單獨安裝。
三、gpbackup&gprestore
3.1 要求和限制
gpbackup 和 gprestore 與以下Greenplum數據庫版本兼容:
- Pivotal Greenplum數據庫4.3.22及更高版本
- Pivotal Greenplum數據庫5.5.0及更高版本
- Pivotal Greenplum數據庫6.0.0及更高版本
gpbackup和 gprestore 有以下限制:
-
如果在父分區表上創建索引, gpbackup不會在父級的子分區表上備份相同的索引,因爲在子級上創建相同的索引會導致錯誤。如果是交換分區,gpbackup不會檢測到交換分區上的索引是從新的父表繼承的。在這種情況下,gpbackup 備份衝突 create index 語句,在還原備份集時會導致錯誤。
-
可以執行多個 gpbackup實例,但每次執行都需要不同的時間戳。
-
當前數據庫對象過濾僅限於schemas和tables。
-
備份分區表時,其中一些或所有葉分區與根分區處於不同的數據庫中,葉分區表定義將作爲元數據備份。即使備份操作指定應排除包含葉分區的數據庫,也會發生這種情況。在這種情況下,要控制爲此類型的分區表備份的數據,需要使用–leaf-partition-data 選項
- 如果–leaf-partition-data 未指定,則即使備份操作指定應排除葉分區數據庫,也將備份葉分區數據。
- 如果 --leaf-partition-data 被指定,則如果備份操作指定應排除葉分區模式,則不備份葉分區數據。僅備份葉分區表的元數據。
-
如果使用 gpbackup --single-data-file 選項以將表備份合併到每個段的單個文件中,則無法使用以下命令執行並行還原操作 gprestore (無法設置 --job 大於1的值)。
-
不能使用 --exclude-table-file 與 --leaf-partition-data。儘管可以在使用以下命令指定的文件中指定葉分區名稱–exclude-table-file, gpbackup 忽略分區名稱。
-
執行gpbackup備份數據庫同時運行DDL命令可能會導致 gpbackup失敗,以確保備份集內的一致性。例如,如果在備份操作開始後刪除了表,gpbackup 退出並顯示錯誤消息 。錯誤:關係< schema.table >不存在。
由於表鎖定問題,在備份操作期間刪除表時,gpbackup可能會失敗。gpbackup生成要備份的表列表,並獲取表上的訪問共享鎖。如果表上持有獨佔鎖,則gpbackup將在釋放現有鎖後獲取訪問共享鎖。如果gpbackup嘗試獲取表上的鎖時該表不再存在,則gpbackup將退出並顯示錯誤消息。
對於在備份過程中可能會刪除的表,可以使用 gpbackup 表過濾選項,例如 --exclude-table 或者-exclude-schema。
-
使用 gpbackup創建的備份只能還原到具有與源羣集相同數量的段實例的Greenplum數據庫羣集。如果執行gpexpand 將分段添加到羣集,在擴展完成後無法還原在開始擴展之前所做的備份。
3.2 備份的對象
下表列出了備份和還原對象 gpbackup和 gprestore。將使用指定的數據庫備份數據庫對象–dbname選項。默認情況下,也會備份全局對象(Greenplum數據庫系統對象),但是僅當包含–with-globals對於 gprestore
數據庫(用於指定的數據庫 --dbname) | 全局(要求 --with-globals 恢復選項) |
---|---|
[Schemas) | Databases |
Procedural language extensions | Database-wide configuration parameter settings (GUCs) |
Sequences | Resource group definitions |
Comments | Resource queue definitions |
Tables | Roles |
Indexes | GRANT assignments of roles to databases |
Owners | |
Writable External Tables (DDL only) | |
Readable External Tables (DDL only) | |
Functions | |
Aggregates | |
Casts | |
Types | |
Views | |
Materialized Views (DDL only) | |
Protocols | |
Triggers. (While Greenplum Database does not support triggers, any trigger definitions that are present are backed up and restored.) | |
Rules | |
Domains | |
Operators, operator families, and operator classes | |
Conversions | |
Extensions | |
Text search parsers, dictionaries, templates, and configurations |
注意:這些數據庫不包含在備份中。
- gp_toolkit
- information_schema
- pg_aoseg
- pg_bitmapindex
- pg_catalog
- pg_toast *
- pg_temp *
當還原到現有數據庫時,當存在public數據庫,gprestore將對象還原到public數據庫。當還原到新數據庫(使用–create db選項)時,gprestore在使用create database命令創建數據庫時自動創建public數據庫。該命令使用包含公共數據庫的template0數據庫。
3.3 備份
-dbname database_name
需要。指定要備份的數據庫。
-backupdir 目錄
可選的。將所有必需的備份文件(元數據文件和數據文件)複製到指定的目錄。必須將目錄指定爲絕對路徑(不是相對路徑)。如果不提供此選項,則會在$ MASTER_DATA_DIRECTORY / backups / YYYYMMDD / YYYYMMDDhhmmss / 目錄中的Greenplum Database主機上創建元數據文件 。段主機在<seg_dir> / backups / YYYYMMDD / YYYYMMDDhhmmss /目錄中創建CSV數據文件 。指定自定義備份目錄時,會將文件複製到備份目錄的子目錄中的這些路徑。
-data只
可選的。僅將表數據備份到CSV文件中,但不備份重新創建表和其他數據庫對象所需的元數據文件。
-debug
可選的。在操作期間顯示詳細的調試消息。
-exclude-schema schema_name
可選的。指定要從備份中排除的數據庫模式。可以多次指定此選項以排除多個模式。無法將此選項與-include-模式選項。
-exclude-table-file file_name
可選的。指定包含要從備份中排除的表列表的文本文件。文本文件中的每一行都必須使用該格式定義一個表 <模式名稱> <表名>。該文件不得包含尾隨行。如果表或模式名稱使用小寫字母,數字或下劃線字符以外的任何字符,則必須在雙引號中包含該名稱。
不能結合使用此選項 -leaf分區數據。雖然可以在指定的文件中指定葉子分區名稱 -exclude表文件, gpbackup 忽略分區名稱。
-include-schema schema_name
可選的。指定要包括在備份中的數據庫模式。可以多次指定此選項以包含多個模式。如果指定此選項,則後續未包含的任何模式-include-模式備份集中省略了選項。無法將此選項與 -exclude-模式選項。
-include-table-file file_name
可選的。指定包含要包括在備份中的表列表的文本文件。文本文件中的每一行都必須使用該格式定義一個表 <模式名稱> <表名>。該文件不得包含尾隨行。如果表或模式名稱使用小寫字母,數字或下劃線字符以外的任何字符,則必須在雙引號中包含該名稱。備份集中將省略此文件中未列出的任何表。
可以選擇指定表葉子分區名稱來代替表名稱,以便在備份中僅包含特定葉子分區 -leaf分區數據 選項。
--leaf-partition-data
可選的。對於分區表,爲每個葉子分區創建一個數據文件,而不是爲整個表創建一個數據文件(默認值)。使用此選項還可以指定要包含在備份中的單個葉子分區 -include表文件選項。不能結合使用此選項-exclude表文件。
--metadata-only
可選的。僅創建重新創建數據庫對象所需的元數據文件(DDL),但不備份實際的表數據。
--no-compression
可選的。不要壓縮表數據CSV文件。
--quiet
可選的。禁止所有非警告,非錯誤日誌消息。
-verbose
可選的。打印詳細日誌消息。
--version
可選的。打印版本號並退出。
--with-stats
可選的。在備份集中包含查詢計劃統計信息。
3.3.1 全量備份
要執行數據庫以及Greenplum Database系統元數據的完整備份:
[gpadmin@node1 gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Starting backup of database gpdw
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Backup Timestamp = 20200514000143
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Backup Database = gpdw
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Gathering table state information
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Gathering additional table metadata
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting partition definitions
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting storage information
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting child partitions with altered schema
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514000143/gpbackup_20200514000143_metadata.sql
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Writing global database metadata
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Global database metadata backup complete
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Writing pre-data metadata
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Pre-data metadata backup complete
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Writing post-data metadata
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Post-data metadata backup complete
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 34s
20200514:00:02:18 gpbackup:gpadmin:node1:026445-[INFO]:-Data backup complete
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514000143/gpbackup_20200514000143_report will not be sent
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Backup completed successfully
上面的命令在指定目錄會創建一個包含全局和特定於數據庫的元數據的文件,否則默認目錄的Greenplum數據庫主主機上的如下目錄。
$MASTER_DATA_DIRECTORY/backup/<YYYYMMDD>/<YYYYMMDDHHMMSS>/
[gpadmin@node1 gpseg-1]$ ll /data/backup/gpseg-1/backups/20200514/20200514000143/
總用量 20
-r--r--r-- 1 gpadmin gpadmin 660 5月 14 00:02 gpbackup_20200514000143_config.yaml
-r--r--r-- 1 gpadmin gpadmin 2765 5月 14 00:01 gpbackup_20200514000143_metadata.sql
-r--r--r-- 1 gpadmin gpadmin 1823 5月 14 00:02 gpbackup_20200514000143_report
-r--r--r-- 1 gpadmin gpadmin 4467 5月 14 00:02 gpbackup_20200514000143_toc.yaml
段節點也會在相同的目錄生成備份文件,每個段都將用於備份的每個表的數據存儲在單獨的壓縮CSV文件中, 否則會在如下目錄
seg datadir/backups/<YYYYMMDD>/<YYYYMMDDHHMMSS>/
[root@node2 ~]# ll /data/backup/gpseg1/backups/20200514/20200514000143/
總用量 386352
-rw------- 1 gpadmin gpadmin 20 5月 14 00:01 gpbackup_1_20200514000143_24649.gz
-rw------- 1 gpadmin gpadmin 395617108 5月 14 00:02 gpbackup_1_20200514000143_24652.gz
注意:備份實例化視圖不會備份實例化視圖數據。僅備份實例化視圖定義。
3.3.2 增量備份
gpbackup 和 gprestore支持創建追加優化表的增量備份以及從增量備份還原。僅當表已更改時,增量備份纔會備份所有指定的堆表,並備份追加優化的表(包括追加優化的,面向列的表)。例如,如果追加優化表的一行已更改,則將備份該表。對於分區的附加優化表,僅備份更改的葉子分區。
當追加優化表或表分區中已更改的數據總量與自上次備份以來未更改的數據相比較小時,增量備份將非常有效。
僅當上次完全備份或增量備份之後對錶執行了以下操作之一時,增量備份纔會備份追加優化的表:
- ALTER TABLE
- DELETE
- INSERT
- TRUNCATE
- UPDATE
- DROP and then re-create the table
增量備份集包括以下備份:
- 完整備份。這是增量備份所基於的完整備份。
- 增量備份集,用於從完整備份開始捕獲對數據庫的更改。
基於全備插入一條數據,執行增量備份
使用以下命令創建了增量備份:
[gpadmin@node1 gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data --incremental
20200514:00:10:27 gpbackup:gpadmin:node1:026900-[INFO]:-Starting backup of database gpdw
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Backup Timestamp = 20200514001027
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Backup Database = gpdw
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Gathering table state information
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Gathering additional table metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting partition definitions
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting storage information
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting child partitions with altered schema
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514001027/gpbackup_20200514001027_metadata.sql
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing global database metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Global database metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing pre-data metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Pre-data metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing post-data metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Post-data metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Basing incremental backup off of backup with timestamp = 20200514000143
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 34s
20200514:00:11:02 gpbackup:gpadmin:node1:026900-[INFO]:-Data backup complete
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514001027/gpbackup_20200514001027_report will not be sent
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Backup completed successfully
在該示例中,完整備份具有時間戳20200514000143,20200514001027是增量備份。
[gpadmin@node1 gpseg-1]$ gpbackup_manager list-backups
timestamp date database type object filtering plugin duration date deleted
20200514001027 Thu May 14 2020 00:10:27 gpdw incremental 00:00:35
20200514000143 Thu May 14 2020 00:01:43 gpdw full 00:00:35
要基於最新的增量備份創建新的增量備份,必須包含相同的內容。
–backup-dir 選項作爲增量備份以及選項
-葉分區數據 和
增加的
gpbackup --dbname mytest --backup-dir / mybackup --leaf-partition-data --incremental
可以指定 --from-timestamp選項以基於現有的增量或完整備份創建增量備份。
[gpadmin@node1 gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data --incremental --from-timestamp 20200514001027
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Starting backup of database gpdw
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Backup Timestamp = 20200514001813
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Backup Database = gpdw
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Gathering table state information
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Gathering additional table metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting partition definitions
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting storage information
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting child partitions with altered schema
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514001813/gpbackup_20200514001813_metadata.sql
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing global database metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Global database metadata backup complete
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing pre-data metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Pre-data metadata backup complete
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing post-data metadata
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Post-data metadata backup complete
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Basing incremental backup off of backup with timestamp = 20200514001027
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 35s
20200514:00:18:49 gpbackup:gpadmin:node1:027308-[INFO]:-Data backup complete
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514001813/gpbackup_20200514001813_report will not be sent
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Backup completed successfull
[gpadmin@node1 gpseg-1]$ gpbackup_manager list-backups
timestamp date database type object filtering plugin duration date deleted
20200514001813 Thu May 14 2020 00:18:13 gpdw incremental 00:00:36
20200514001027 Thu May 14 2020 00:10:27 gpdw incremental 00:00:35
20200514000143 Thu May 14 2020 00:01:43 gpdw full 00:00:35
3.4 恢復
使用 gprestore從備份集還原,必須使用 --timestamp 選項以指定確切的時間戳記值(YYYYMMDDHHMMSS) 恢復。 如果數據庫在羣集中不存在,則選擇–create-db,如果備份指定–backup-dir,則恢復時也需要指定 --backup-dir 。gprestore默認情況下不嘗試還原Greenplum系統的全局元數據。如果需要,請使用–with-globals。默認gprestore使用1個連接來還原表數據和元數據。如果的備份集很大,則可以通過增加並行連接數–jobs 來提高還原性能。
[gpadmin@node1 gpseg-1]$ psql postgres
psql (9.4.24)
Type "help" for help.
postgres=# drop user dbdream;
DROP ROLE
postgres=# drop tablespace space1;
DROP TABLESPACE
postgres=# drop tablespace space2;
DROP TABLESPACE
postgres=# drop tablespace space3;
DROP TABLESPACE
postgres=# \q
[gpadmin@node1 gpseg-1]$ dropdb gpdw
[gpadmin@node1 gpseg-1]$ gprestore --backup-dir /data/backup/ --timestamp 20200514001813 --create-db --with-globals -jobs 8
20200514:00:24:01 gprestore:gpadmin:node1:027722-[INFO]:-Restore Key = 20200514001813
20200514:00:24:02 gprestore:gpadmin:node1:027722-[INFO]:-Restoring global metadata
Global objects restored: 25 / 25 [=====================================================] 100.00% 2s
20200514:00:24:04 gprestore:gpadmin:node1:027722-[INFO]:-Global database metadata restore complete
20200514:00:24:05 gprestore:gpadmin:node1:027722-[INFO]:-Restoring pre-data metadata
Pre-data objects restored: 10 / 10 [===================================================] 100.00% 0s
20200514:00:24:05 gprestore:gpadmin:node1:027722-[INFO]:-Pre-data metadata restore complete
Tables restored: 2 / 2 [============================================================] 100.00% 2m57s
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Data restore complete
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Restoring post-data metadata
Post-data objects restored: 1 / 1 [====================================================] 100.00% 0s
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Post-data metadata restore complete
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Email containing gprestore report /data/backup/gpseg-1/backups/20200514/20200514001813/gprestore_20200514001813_20200514002401_report will not be sent
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Restore completed successfully
[gpadmin@node1 gpseg-1]$ psql
psql (9.4.24)
Type "help" for help.
gpdw=# select count(*) from t1;
count
-------
2
(1 row)
gpdw=# select count(*) from t2;
count
-----------
110000000
(1 row)
注意:不能使用 gpbackup 選項 --single-data-file執行並行還原操作gprestore 如果備份合併表將每個段備份到單個文件。
恢復視圖不會還原實例化視圖數據。僅還原實例化視圖定義。要用數據填充實例化視圖,請使用刷新材料視圖。刷新實例化視圖時,實例化視圖定義引用的表必須可用。gprestore 日誌文件列出了已還原的實例化視圖以及 刷新材料視圖 用於用數據填充實例化視圖的命令。
從增量備份還原時, gprestore 還列出了還原操作中使用的備份 gprestore 日誌文件。
在還原操作期間, gprestore 如果完全備份或其他所需的增量備份不可用,則顯示錯誤。
要創建增量備份或從增量備份集還原數據,需要完整的備份集。歸檔增量備份時,必須歸檔完整的備份集。必須歸檔在主數據庫和所有段上創建的所有文件。
每一次 gpbackup 運行時,該實用程序將備份信息添加到歷史文件 gpbackup_history.yaml在Greenplum數據庫主數據目錄中。該文件包括備份選項和其他備份信息。
如果不指定 --from-timestamp 創建增量備份時選擇 gpbackup使用具有一組一致選項的最新備份。該實用程序將檢查備份歷史記錄文件,以找到具有一致選項集的備份。如果該實用程序找不到具有一致選項集的備份,或者歷史文件不存在,gpbackup 顯示一條消息,指出必須先創建完整備份,然後才能創建增量文件。
如果指定 --from-timestamp 創建增量備份時選擇 gpbackup 確保正在創建的備份的選項與指定備份的選項一致。
gpbackup 選項 --with-stats不必要求備份集中的所有備份都相同。但是,要使用gprestore 選項 --with-stats 要還原統計信息,指定的備份必須已使用 --with-stats 創建備份時。
可以從備份集中的任何備份執行還原操作。但是,增量備份中捕獲的更改晚於用於還原數據庫數據的備份時,將無法還原。
從增量備份集還原時, gprestore 檢查備份,並從備份集中的附錄優化表的最新版本中還原每個附錄優化表,並從最新備份中還原堆表。
增量備份集,完整備份和關聯的增量備份必須位於單個設備上。例如,備份集中的備份必須全部在文件系統上或必須全部在Data Domain系統上。
警告:對Greenplum數據庫段配置的更改會使增量備份無效。更改段配置(添加或刪除段實例)之後,必須先創建完整備份,然後才能創建增量備份。
3.5 備份信息
執行備份操作時,gpbackup會將備份信息附加到Greenplum數據庫主數據目錄中的gpbackup_history.yaml文件中。該文件包含備份時間戳、有關備份選項的信息以及增量備份的備份集信息。此文件未由gpbackup備份。
當使用–incremental選項運行gpbackup時,gpbackup使用文件中的信息來查找增量備份的匹配備份,而不指定–from timesamp選項來指示要用作增量備份集中最新備份的備份。
[gpadmin@node1 gpseg-1]$ cat gpbackup_history.yaml
backupconfigs:
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: true
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns: []
- timestamp: "20200514001027"
tablefqns: []
- timestamp: "20200514001813"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514001813"
endtime: "20200514001849"
withstatistics: false
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: true
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns: []
- timestamp: "20200514001027"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514001027"
endtime: "20200514001102"
withstatistics: false
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: false
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514000143"
endtime: "20200514000218"
withstatistics: false
3.6 返回碼
在gpbackup或者 gprestore完成後返回的狀態碼含義
- 0 –備份或還原已完成,沒有任何問題
- 1 –備份或還原已完成,但非致命錯誤。
- 2 –備份或還原失敗,並出現致命錯誤。
3.7 篩選備份或還原的內容
gpbackup 備份指定數據庫中的所有數據庫和表,除非使用數據庫級或表級過濾器選項排除或包括單個數據庫或表對象。
模式級別選項是 --include-schema 或者–exclude-schema
$ gpbackup --dbname gpdw --include-schema test
$ gpbackup --dbname gpdw --include-table-file /home/gpadmin/table-list.txt
可以結合 -include模式 與 --exclude-table 要麼 --exclude-table-file進行備份。這個例子使用 --include模式 與 --exclude-table 備份除單個表以外的其他模式。
$ gpbackup --dbname gpdw --include-schema test --exclude-table mydata.addresses
不能結合 --include模式 與 --include-table 要麼 --include-table-file,並且無法合併 -排除模式 使用任何表過濾選項,例如 --exclude-table 要麼 --include-table。
使用時 --include-table 要麼 --include-table-file 從屬對象不會自動備份或還原,必須顯式指定所需的從屬對象。例如,如果備份或還原視圖或實例化視圖,則還必須指定該視圖或實例化視圖使用的表。如果備份或還原使用順序的表,則還必須指定順序。
3.7.1 葉分區過濾
gpbackup爲段上的每個表創建一個文件。可以指定–leaf-partition-data選項可爲分區表的每個葉分區創建一個數據文件,而不是單個文件。還可以通過在要包括的文本文件中列出葉分區名稱來篩選到特定葉分區的備份。例如,考慮使用以下語句創建的表:
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( PARTITION Jan17 START (date '2017-01-01') INCLUSIVE ,
PARTITION Feb17 START (date '2017-02-01') INCLUSIVE ,
PARTITION Mar17 START (date '2017-03-01') INCLUSIVE ,
PARTITION Apr17 START (date '2017-04-01') INCLUSIVE ,
PARTITION May17 START (date '2017-05-01') INCLUSIVE ,
PARTITION Jun17 START (date '2017-06-01') INCLUSIVE ,
PARTITION Jul17 START (date '2017-07-01') INCLUSIVE ,
PARTITION Aug17 START (date '2017-08-01') INCLUSIVE ,
PARTITION Sep17 START (date '2017-09-01') INCLUSIVE ,
PARTITION Oct17 START (date '2017-10-01') INCLUSIVE ,
PARTITION Nov17 START (date '2017-11-01') INCLUSIVE ,
PARTITION Dec17 START (date '2017-12-01') INCLUSIVE
END (date '2018-01-01') EXCLUSIVE );
NOTICE: CREATE TABLE will create partition "sales_1_prt_jan17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_feb17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_mar17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_apr17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_may17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_jun17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_jul17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_aug17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_sep17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_oct17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_nov17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_dec17" for table "sales"
要僅備份一年最後一個季度的數據,請首先創建一個文本文件,該文件列出這些葉分區名稱而不是完整的表名稱:
public.sales_1_prt_oct17
public.sales_1_prt_nov17
public.sales_1_prt_dec17
然後使用 --include-table-file
每個葉分區生成一個數據文件的選項:
$ gpbackup --dbname gpdw --include-table-file last-quarter.txt --leaf-partition-data
當指定 --leaf-partition-data,gpbackup備份分區表時,每個葉分區生成一個數據文件。例如,此命令爲每個葉分區生成一個數據文件:
$ gpbackup --dbname gpdw --include-table public.sales --leaf-partition-data
備份葉分區時,葉分區數據與整個分區表的元數據一起備份。
注意:不能使用–exclude-table-file 與選項 -葉分區數據。儘管可以在使用以下命令指定的文件中指定葉分區名稱–exclude-table-file, gpbackup 忽略分區名稱。
3.7.2 gprestore過濾
使用gpbackup創建備份集後,可以使用gprestore–include schema和–include table file選項篩選要從備份集中還原的架構和表。這些選項的工作方式與gpbackup對應選項相同,但有以下限制:
試圖還原的表在數據庫中不能已存在。
如果嘗試還原備份集中不存在的架構或表,則不會執行gprestore。
如果使用–include schema選項,gprestore將無法還原依賴於多個架構的對象。
如果使用–include table file選項,gprestore不會創建角色或設置表的所有者。該實用程序還原表索引和規則。觸發器也會還原,但Greenplum數據庫不支持。
使用–include table file指定的文件不能包含葉分區名稱,當使用gpbackup指定此選項時可以這樣做。如果在備份集中指定了葉分區,請指定分區表以還原葉分區數據。
當還原包含來自分區表的某些葉分區的數據的備份集時,分區表將與葉分區的數據一起還原。例如,使用gpbackup選項創建備份——include table file,文本文件列出分區表的一些葉分區。還原備份將創建分區表,並僅還原文件中列出的葉分區的數據。
3.8 備份文件
警告:全部gpbackup元數據文件是使用只讀權限創建的。切勿刪除或修改元數據文件gpbackup 備份集。這樣做會使備份文件無法正常工作。
完整備份集 gpbackup 包括多個元數據文件,支持文件和CSV數據文件,每個文件都有創建備份的時間戳。
默認情況下,元數據和支持文件存儲在Greenplum數據庫master主機的$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDHHMMSS/目錄中。如果指定自定義備份目錄,則將同一文件路徑創建爲備份目錄的子目錄。下表描述了元數據和支持文件的名稱和內容。
3.8.1 gpbackup元數據文件
文件名 | 描述 |
---|---|
gpbackup_ _metadata.sql | 包含全局和特定於數據庫的元數據: DDL用於Greenplum數據庫集羣中全局的對象,而不是集羣中特定數據庫所擁有的對象。 備份數據庫中對象的DDL(指定爲 --dbname)在還原實際數據之前必須創建的對象,以及在 還原數據之後必須創建的對象的DDL 。 全局對象包括: Tablespaces Databases Database-wide configuration parameter settings (GUCs) Resource group definitions Resource queue definitions Roles GRANT assignments of roles to databases Note: Global metadata is not restored by default. You must include the --with-globals option to the gprestore command to restore global metadata. Database-specific objects that must be created before to restoring the actual data include: Session-level configuration parameter settings (GUCs) Schemas Procedural language extensions Types Sequences Functions Tables Protocols Operators and operator classes Conversions Aggregates Casts Views Materialized Views Note: Materialized view data is not restored, only the definition. Constraints Database-specific objects that must be created after restoring the actual data include: Indexes Rules Triggers. (While Greenplum Database does not support triggers, any trigger definitions that are present are backed up and restored.) |
gpbackup_ _toc.yaml | 包含用於在_predata.sql和_postdata.sql文件中定位對象DDL的元數據 。該文件還包含表名和OID,這些表名和OID用於在每個段上創建的CSV數據文件中定位相應的表數據。 |
gpbackup_ _報告 | 包含有關備份操作的信息,該信息用於填充備份完成後發送的電子郵件通知(如果已配置)。 |
gpbackup_ _config.yaml | 包含有關特定備份任務執行的元數據,包括:gpbackup 版數據庫名稱Greenplum數據庫版本其他選項設置,例如 -無壓縮, -壓縮級別, -僅元數據, -僅數據和 --with-stats。 |
gpbackup_history.yaml | 包含有關使用以下命令創建備份時使用的選項的信息 gpbackup,以及有關增量備份的信息。存儲在Greenplum數據庫主數據目錄中的Greenplum數據庫主主機上。該文件不由備份 gpbackup。 |
3.8.2 段數據文件
默認情況下,每個段都爲該段上備份的每個表創建一個壓縮的CSV文件。可以選擇指定-單個數據文件選項,以便在每個段上創建一個數據文件。文件存儲在 <seg_dir> / backups / YYYYMMDD / YYYYMMDDHHMMSS /中。
如果指定自定義備份目錄,則段數據文件將作爲備份目錄的子目錄複製到同一文件路徑。如果包括 -葉分區數據 選項, gpbackup 爲分區表的每個葉分區創建一個數據文件,而不是爲文件創建一個表。
每個數據文件使用文件名格式 gpbackup_ <content_id> _ _ .gz,其中:
- <content_id>是該段的內容ID。
- 是其的時間戳 gpbackup 操作。
- 是表的對象ID。元數據文件 gpbackup_ _toc.yaml引用此 在數據庫中查找特定表的數據。
可以選擇使用(1-9)指定gzip壓縮級別 -壓縮級別 選項,或完全禁用壓縮 -無壓縮。如果未指定壓縮級別, gpbackup 默認情況下使用壓縮級別1。
四、pgdump&pgrestore
在Greenplum中,我們可以使用 gp_restore 或者 gpdbrestore 對數據庫進行並行恢復,但是並行恢復要求要恢復的新集羣與備份集羣擁有同樣的配置(節點實例數量)。但是如果我們的新集羣節點數與原集羣不一樣怎麼辦?還能使用原備份文件嗎?答案是肯定的,但是由於節點數量不一樣了,我們只能通過Master節點進行非並行備份。
數據庫的導入導出是最常用的功能之一,每種數據庫都提供有這方面的工具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysqldump,而PostgreSQL提供的對應工具爲pg_dump和pg_restore。
pg_dump是用於備份PostgreSQL數據庫的工具。它可以在數據庫正在使用的時候進行完整一致的備份,並不阻塞其它用戶對數據庫的訪問。
轉儲格式可以是一個腳本或者歸檔文件。轉儲腳本的格式是純文本,包含許多SQL命令,這些SQL命令可以用於重建該數據庫並將之恢復到保存腳本時的狀態。可以使用 psql從這樣的腳本中恢復。它們甚至可以用於在其它機器甚至是其它硬件體系的機器上重建數據庫,通過對腳本進行一些修改,甚至可以在其它SQL數據庫產品上重建數據庫。
歸檔文件格式必須和pg_restore一起使用重建數據庫。它們允許pg_restore對恢復什麼東西進行選擇,甚至是在恢復之前對需要恢復的條目進行重新排序。歸檔文件也是可以跨平臺移植的。
pg_dump 把一個數據庫轉儲爲純文本文件或者是其它格式.
用法: pg_dump [選項]... [數據庫名字]
一般選項:
-f, --file=FILENAME output file or directory name
-F, --format=c|d|t|p output file format (custom, directory, tar, plain text)
-v, --verbose 詳細模式
-Z, --compress=0-9 被壓縮格式的壓縮級別
--lock-wait-timeout=TIMEOUT 在等待表鎖超時後操作失敗
--help 顯示此幫助信息, 然後退出
--versoin 輸出版本信息, 然後退出
控制輸出內容選項:
-a, --data-only 只轉儲數據,不包括模式
-b, --blobs 在轉儲中包括大對象
-c, --clean 在重新創建之前,先清除(刪除)數據庫對象
-C, --create 在轉儲中包括命令,以便創建數據庫
-E, --encoding=ENCODING 轉儲以ENCODING形式編碼的數據
-n, --schema=SCHEMA 只轉儲指定名稱的模式
-N, --exclude-schema=SCHEMA 不轉儲已命名的模式
-o, --oids 在轉儲中包括 OID
-O, --no-owner 在明文格式中, 忽略恢復對象所屬者
-s, --schema-only 只轉儲模式, 不包括數據
-S, --superuser=NAME 在轉儲中, 指定的超級用戶名
-t, --table=TABLE 只轉儲指定名稱的表
-T, --exclude-table=TABLE 只轉儲指定名稱的表
-x, --no-privileges 不要轉儲權限 (grant/revoke)
--binary-upgrade 只能由升級工具使用
--column-inserts 以帶有列名的INSERT命令形式轉儲數據
--disable-dollar-quoting 取消美元 (符號) 引號, 使用 SQL 標準引號
--disable-triggers 在只恢復數據的過程中禁用觸發器
--inserts 以INSERT命令,而不是COPY命令的形式轉儲數據
--no-security-labels do not dump security label assignments
--no-tablespaces 不轉儲表空間分配信息
--no-unlogged-table-data do not dump unlogged table data
--quote-all-identifiers quote all identifiers, even if not key words
--serializable-deferrable wait until the dump can run without anomalies
--use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替ALTER OWNER 命令來設置所有權
聯接選項:
-h, --host=主機名 數據庫服務器的主機名或套接字目錄
-p, --port=端口號 數據庫服務器的端口號
-U, --username=名字 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME do SET ROLE before dump
如果沒有提供數據庫名字, 那麼使用 PGDATABASE 環境變量的數值.
pg_restore 從一個歸檔中恢復一個由 pg_dump 創建的 PostgreSQL 數據庫.
用法:
pg_restore [選項]... [文件名]
一般選項:
-d, --dbname=名字 連接數據庫名字
-f, --file=文件名 輸出文件名
-F, --format=c|d|t backup file format (should be automatic)
-l, --list 打印歸檔文件的 TOC 概述
-v, --verbose 詳細模式
--help 顯示此幫助信息, 然後退出
--version 輸出版本信息, 然後退出恢復控制選項:
-a, --data-only 只恢復數據, 不包括模式
-c, --clean 在重新創建數據庫對象之前需要清除(刪除)數據庫對象
-C, --create 創建目標數據庫
-e, --exit-on-error 發生錯誤退出, 默認爲繼續
-I, --index=名稱 恢復指定名稱的索引
-j, --jobs=NUM 可以執行多個任務並行進行恢復工作
-L, --use-list=文件名 從這個文件中使用指定的內容表排序輸出
-n, --schema=NAME 在這個模式中只恢復對象
-O, --no-owner 忽略恢復對象所屬者
-P, --function=名字(參數) 恢復指定名字的函數
-s, --schema-only 只恢復模式, 不包括數據
-S, --superuser=NAME 使用指定的超級用戶來禁用觸發器
-t, --table=NAME 恢復指定命字的表
-T, --trigger=NAME 恢復指定命字的觸發器
-x, --no-privileges 跳過處理權限的恢復 (grant/revoke)
-1, --single-transaction 作爲單個事務恢復
--disable-triggers 在只恢復數據的過程中禁用觸發器
--no-data-for-failed-tables 沒有恢復無法創建表的數據
--no-security-labels do not restore security labels
--no-tablespaces 不恢復表空間的分配信息
--use-set-session-authorization 使用 SESSION AUTHORIZATION 命令代替ALTER OWNER命令來設置對象所有權
聯接選項:
-h, --host=主機名 數據庫服務器的主機名或套接字目錄
-p, --port=端口號 數據庫服務器的端口號
-U, --username=名字 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME 在恢復前執行SET ROLE操作
如果沒有提供輸入文件名, 則使用標準輸入.
pg_dump進行單個數據庫的備份,而pg_dumpall備份一個給出的集羣中的每個數據庫,同時還確保保留象用戶和組這樣的全局數據狀態。