openGauss經驗總結

it智能化專欄 發佈 2022-12-27T01:48:49.725667+00:00

前言當人們一提到全量表,增量表,拉鍊表,流水錶,快照表等這些概念時,大家第一反應想到的就是傳統數據倉庫的使用。 那麼本文將從數據倉庫介入,簡單介紹一下openGauss設計中的全量表,增量表,拉鍊表,流水錶,快照表等。數據在同類型資料庫遷移或者數據備份時,需要進行數據導出導入。

前言

當人們一提到全量表,增量表,拉鍊表,流水錶,快照表等這些概念時,大家第一反應想到的就是傳統數據倉庫的使用。 那麼本文將從數據倉庫介入,簡單介紹一下openGauss設計中的全量表,增量表,拉鍊表,流水錶,快照表等。數據在同類型資料庫遷移或者數據備份時,需要進行數據導出導入。openGauss提供了gs_dump工具導出指定數據,gs_restore工具將其恢復到資料庫中。

主要內容:
一、認識數據倉庫和資料庫
二、了解openGauss的有哪些優勢和特點,以及其常見Sql語法
三、認識全量表,增量表,拉鍊表,流水錶,快照表的概念、特點以及其在openGauss中的實驗經驗總結。

openGauss資料庫邏輯備份與恢復

一、數據倉庫與資料庫

1、數據倉庫

數據倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH。數據倉庫,是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它是單個數據存儲,出於分析性報告和決策支持目的而創建。 為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制等。

數據倉庫特點

  • 數據倉庫是面向主題的:主題是企業較高層次上的信息系統中的數據綜合、歸類,並進行分析的對象。在邏輯意義上,他是對企業中某一個宏觀分析領域所涉及的分析對象。(以銀行金融行業為例,可有如:當事人、當事人資產、區域、行銷活動、協議、事件、機構、產品、財務、渠道等)
  • 數據倉庫是集成整合的:數據倉庫的數據是從各個分散的資料庫(含各種可以存儲數據的介質)中進行抽取整合而來(ETL)。
  • 數據倉庫的數據是隨著時間的變化而變化的:數據倉庫在整個運行過程中,其數據有新增的、有歷史歸檔的。
  • 數據倉庫的數據是不可修改的:數據倉庫的數據主要提供企業決策分析之用,所涉及的數據操作主要是數據查詢分析,一般情況下並不進行修改操作。

2、資料庫

資料庫(Database) 是一種邏輯概念,主要是存放大量數據的「倉庫」,是數據的集合,通過資料庫軟體來實現。資料庫由很多數據表、記錄、欄位、索引等多種元素組成。存放在其中的數據具有「永久存儲、有組織、可共享」等特點。

3、數據倉庫與資料庫的區別與關係

資料庫主要用於事務處理,數據倉庫主要用於數據分析。用途上的不同決定了這兩種架構的特點不同。在IT的架構體系中,資料庫是必須存在的,數據必須要有地方存儲。

資料庫與數據倉庫的區別實際講的是OLTP與OLAP的區別

OLTP是傳統的關係型資料庫的主要應用,主要是基本的、日常的事務處理。從數據角度主要以「增刪改」為主,同時關注的是事務的吞吐量(TPS),資料庫在設計原則上要符合3NF/BCNF,例如銀行交易系統、零售系統、火車售票系統等。

OLAP是數據倉庫的核心部心,數據倉庫是對於大量已經由OLTP形成的數據的一種分析型的資料庫,用於處理商業智能、決策支持等重要的決策信息。從資料庫角度主要是以「查詢」為主,關注的是其查詢響應速度(QPS),資料庫設計主要以星型/雪花模型為主。例如報表系統、CRM系統、金融風險預測預警系統、反洗錢系統、數據倉庫、數據集市等。

二、openGauss資料庫產品特點

1、openGauss簡介

openGauss 是一款全面友好開放,攜手夥伴共同打造的企業級開源關係型資料庫。

openGauss是一個資料庫管理系統。資料庫是結構化的數據集合。它可以是任何數據,購物清單、圖片庫或公司網絡中的大量信息。資料庫管理系統可以對資料庫進行統一的管理和控制,以保證資料庫的安全性和完整性。由於計算機非常擅長處理大量數據,因此資料庫管理系統可以作為獨立程序使用,也可以作為其他應用程式的一部分在計算中發揮著核心作用。


openGauss的SQL部分代表 「結構化查詢語言」。SQL是最常用的用於訪問和處理資料庫的標準計算機語言。根據您的編程環境,您可以直接輸入SQL、將SQL語句嵌入到以另一種語言編寫的代碼中,或者使用包含SQL語法的特定語言 API。openGauss支持標準的SQL92/SQL99/SQL2003/SQL2011規範。

2、openGauss的優點

openGauss資料庫具有高性能、高可用、高安全、易運維、全開放的優點:

1、高性能
1)提供了面向多核架構的並發控制技術結合鯤鵬硬體優化,在兩路鯤鵬下TPCC Benchmark達成性能150萬tpmc。


3)提供Sql-bypass智能快速引擎技術。

2、高可用
1)支持主備同步,異步以及級聯備機多種部署模式。
2)數據頁CRC校驗,損壞數據頁通過備機自動修復。
3)備機並行恢復,10秒內可升主提供服務。

3、高安全
1)支持全密態計算,訪問控制、加密認證、資料庫審計、動態數據脫敏等安全特 性,提供全方位端到端的數據安全保護。

4、易運維
2)基於AI的智能參數調優和索引推薦,提供AI自動參數推薦。
3)慢SQL診斷,多維性能自監控視圖,實施掌控系統的性能表現。
4)提供在線自學習的SQL時間預測。

5、全開放
1)採用木蘭寬鬆許可證協議,允許對代碼自由修改,使用,引用。
2)資料庫內核能力全開放。
3)提供豐富的夥伴認證,培訓體系和高校課程。
4)openGauss相比其他開源資料庫主要有多存儲模式,NUMA化內核結構和高可用等產品特點。


創建表

CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT exists ] table_name 
    ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
        | table_constraint
        | LIKE source_table [ like_option [...] ] }
        [, ... ])
    [ AUTO_INCREMENT [ = ] value ]
    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ COMPRESS | NOCOMPRESS ]
    [ TABLESPACE tablespace_name ]
[ COMMENT {=| } 'text' ];
1234567891011

注意:
1)列存表的表級約束只支持PARTIAL CLUSTER KEY,不支持主外鍵等表級約束。
2)列存表的欄位約束只支持NULL、NOT NULL和DEFAULT常量值。

創建臨時表(示例)

CREATE TEMPORARY TABLE bank_card
(
b_number NCHAR(30) PRIMARY KEY
, b_type NCHAR(20)
,b_c_id INT NOT NULL
);
123456

創建分區表

CREATE TABLE [ IF NOT EXISTS ] partition_table_name 
( [ 
   { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] 
   | table_constraint 
   | LIKE source_table [ like_option [...] ] } [, ... ] 
] ) 
   [ WITH ( {storage_parameter = value} [, ... ] ) ] 
   [ COMPRESS | NOCOMPRESS ] 
   [ TABLESPACE tablespace_name ] 
   PARTITION BY { 
      {RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] 
( partition_less_than_item [, ... ] )} | 
      {RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] 
( partition_start_end_item [, ... ] )} | 
      {LIST | HASH (partition_key)(PARTITION partition_name [VALUES (list_values_clause)] opt_table_space )} 
   } [ { ENABLE | DISABLE } ROW MOVEMENT ];
12345678910111213141516

示例:

create table partition_table
(
u_id VARCHAR(10)
,money varchar(10)
,start_dt  varchar(10)
,end_dt varchar(10)
)
partition by RANGE (end_dt)
(PARTITION P1 VALUES LESS THAN('20221012'),
PARTITION P2 VALUES LESS THAN(MAXVALUE)
);

123456789101112

常用欄位類型
INTEGER、DECIMAL、FLOAT、CHAR(n)、varchar(n)、DATE、SMALLDATETIME、TIME、TIMESTAMP

邏輯操作符,常用的邏輯操作符有AND、OR和NOT,他們的運算結果有三個值,分別為TRUE、FALSE和NULL,其中NULL代表未 知。他們運算優先級順序為:NOT>AND>OR。

表關聯
內連接(inner join),內連接的關鍵字為inner join,其中inner可以省略。使用內連接,連接執行順序必然遵 循語句中所寫的表的順序。

左外連接 (LEFT JOIN), 又稱左連接,是指以左邊的表為基礎表進行查詢。 根據指定連接條件關聯右表,獲取基礎表以及和條件匹 配的右表數據,未匹配條件的右表對應的欄位位置填上 NULL。

右外連接(RIGHT JOIN), 又稱右連接,是指以右邊的表為基礎表,在內連接的基礎 上也查詢右邊表中有記錄,而左邊的表中沒有記錄的數據 (左邊用NULL值填充)。

全外連接(FULL JOIN),又稱全連接,是指除了返回兩個表中滿足連接條件的 記錄,還會返回兩個表中不滿足連接條件的所有其它 行(不匹配的另外一邊用NULL值填充)。

4、小結

數據倉庫表的設計與實現,其都離不開最基本的SQL操作,以openGauss資料庫為例,涉及如上(臨時表的創建使用、分區表的創建使用、常用數據類型、表關聯、邏輯操作等等)。

三、全量表,增量表,拉鍊表,流水錶,快照表基本概念及部分實現

1、全量表

全量表,顧名思義是存儲了全部數據的表,全量表存儲的是截至到目前最新狀態的全部記錄,記錄更新周期內的全量數據,無論數據是否有變化都需要記錄。

每天所有的最新狀態的數據:
1)存儲的是截至到目前最新狀態的全部記錄,有無變化,都要上報
2)每次上報的數據都是所有的數據(變化的 + 沒有變化的)
3)沒有分區,所有數據存儲在一個分區中,比如:今天是11號,那麼全量表裡面包含的數據是截至10號的所有數據,每次往全量表裡面寫數據都會覆蓋之前的數據,所以全量表不記錄歷史的數據情況,只有截止到當前最新的、全量的數據。

全量表範例:

SQL實現(openGauss)邏輯:假設T1是初始化的原表,T2是第二天跑批過來的最新狀態的全量表,即全刪全插。

Truncate table T1;
Insert into T1 select * from T2;
12

–得到最新狀態的全量數據(T3)

SELECT * FROM T1;
1

2、增量表

增量表,記錄更新周期內的新增數據,即在原表中數據的基礎上新增本周期內產生的新數據,沒變化的數據不會被記錄;

增量表的特徵:
1)增量表是相對於全量表而言的,增量表是每次把新增的數據追加到原表中;
2)記錄每次增加的量,而不是總量(只報變化量,無變化不用報);
3)存在分區,增量表中每次新增的數據單獨存儲在一個分區中,歷史分區中的數據記錄不發生變化。

增量表範例:
增量表,就是記錄每天新增數據的表。比如:從9號到10號新增了哪些數據,改變了哪些數據,這些都會存儲在增量表在10號的分區裡面(下表中的create_dt 可作為分區欄位)。

SQL實現(openGauss)邏輯:假設T1是初始化的原表,T2是第二天跑批過來的新增數據,即直接累加即可。

Insert into T1 SELECT * FROM  T2; 
1

–得到T3

SELECT * FROM T1;
1

–可根據分區欄位獲取對應增量數據

SELECT * FROM T1 WHERE create_dt=『20221010』;
1

3、拉鍊表

拉鍊表儲存了某個主體的一整套連續動作的信息。與快照表類似,但拉鍊表儲存的是在快照表的基礎上去除了重複狀態的數據。他是一種維護歷史狀態,以及最新狀態數據的一種表,記錄數據從開始一直到當前狀態所有變化的信息。

拉鍊表的特徵
1)記錄一個事物從開始,一直到當前狀態的所有變化的信息;
2)每次上報的都是歷史記錄的最終狀態,是記錄在當前時刻的歷史總量;
3)當前記錄存的是當前時間之前的所有歷史記錄的最後變化量(總量);
4)存量一般設計成拉鍊表(月報 - 常用、日報);
5)關鏈時間可以是3000年,9999年等比較大的年份;

拉鍊表的適用場景
當數據量較大,表中某些欄位有變化,但變化頻率不是很高,而業務需求又需要統計這種變化狀態,如果每天存儲一份全量數據,不僅浪費存儲空間,且不便於業務統計;這時,拉鍊表的作用就體現出來了,既節省空間,又滿足需求。

在數據倉庫的數據模型設計過程中,經常會遇到這樣的需求:
1)數據量比較大;
2)表中的部分欄位會被update,例如:用戶的地址、產品的描述信息、訂單的狀態等等;
3)業務需要:a.查看某一個時間點或者時間段的歷史快照信息,比如:查看某一個訂單在歷史某一個時間點的狀態;b.統計訂單信息的變化頻次,比如:查看某一個用戶在過去某一段時間內,更新過幾次等等;
4)信息變化的比例和頻率不是很大。

此時,如果對張表每天都保留一份全量,那麼每次全量中會保存很多不變的信息,這對存儲是極大的浪費;拉鍊表,既能滿足反應數據的歷史狀態,又能最大程度地節省存儲空間。

拉鍊表的優缺點
優點:保留了數據的歷史信息;節省存儲空間;
缺點:同步和回滾邏輯複雜;

拉鍊表範例:

SQL實現(openGauss)邏輯:
通過主鍵關聯(歷史數據和新增數據關聯):
1、關聯上的,比對非主鍵欄位:
1)如果非主鍵欄位值完全一致,則只更新比對上的歷史數據的結束日期為當前日期(關鏈);
2)如果非主鍵欄位值存在任意一個欄位不一致,則更新比對上的歷史數據的結束日期為當期日期(關鏈),然後將新數據insert,其開始日期取當前日期,結束日期set end_dt=『30001231』(開鏈);
2、未關聯上的:
1)如果供數是全量給,則歷史數據全部關聯,如果供數是增量給,則歷史數據不更新。
2)新增數據直接insert into開鏈(其開始日期去當前日期,結束日期set end_dt=『30001231』)。

4、流水錶

流水錶,對於表的每一個修改都會記錄,可以用於反映實際記錄的變更。

流水錶的特徵:
1)流水錶是存儲了所有修改記錄的表。
2)流水錶是每天的交易形成的歷史;

區別於拉鍊表:
流水錶與拉鍊表也有些類似,拉鍊表通常是對帳戶信息的歷史變動進行處理保留的結果,流水錶是每天的交易形成的歷史;流水錶用於統計業務相關情況,拉鍊表用於統計帳戶及客戶的情況。

5、快照表

快照表就是截至過去某個時間點的所有數據,關注更多的是過去某個時間點的狀態,即:快照表主要存儲的是歷史狀態的表。每次快照的數據單獨儲存在一個分區中。

快照表的場景:
快照表用來存儲截止過去某個時間點的所有數據,比如:一些用戶特徵的表、標籤表、訂單狀態表等多存儲於快照表中,其實快照表也有所區分,本質是一段時間內數據的記錄。

為解決全量表無法查詢歷史數據的情況,引入了快照表。快照表是有時間分區的,每個分區裡的數據都是分區時間對應的前一天的所有全量數據,比如:當前數據表有3個分區,8號、9號、10號。其中,8號分區裡面的數據就是從歷史到7號的所有數據,9號分區裡面的數據就是從歷史到8號的所有數據,以此類推。

快照表的特徵:
按照時間分區進行數據存儲;

快照表的優缺點:
優點:可實現對歷史數據的查詢;
缺點:數據量大時,由於每個分區都存儲了許多重複數據,非常浪費存儲空間。

6、全量表、增量表、拉鍊表及快照表的使用建議

1)總體而言,在數據量不是很大的情況下是可以優先考慮使用全量表進行數據存儲,該方法簡單,但會很耗資源。
2)一般,建議使用增量表進行存儲,畢竟目前大多數公司的數據量都很大,且數據量都在不斷增長。
3)當遇到歷史狀態需要保存的時候就需要使用快照表和拉鍊表了。

7、小結

全量表、增量表、拉鍊表、流水錶以及快照表都是相對於傳統數據倉庫(或者數據集市)而言的, 但其一定是基於資料庫產品而實現的。 不同資料庫產品,其SQL的實現略有不同,但這些表的邏輯概念一定是相同的。另外, 一般企業的業務系統都會有歷史數據,所以在考慮設計表時,也要考慮到歷史數據的歸檔或初始化的問題。

四、openGauss資料庫邏輯備份與恢復

gs_dump

gs_dump是openGauss用於導出資料庫相關信息的工具,用戶可以自定義導出一個資料庫或其中的對象(模式、表、視圖等),回收站對象除外。支持導出的資料庫可以是默認資料庫postgres,也可以是自定義資料庫。gs_dump工具在進行數據導出時,其他用戶可以訪問openGauss資料庫(讀或寫),支持導出完整一致的數據。pg_dump只備份資料庫集群中的某個資料庫的數據,它不會導出角色和表空間相關的信息,因為這些信息是整個資料庫集群共用的,不屬於某個單獨的資料庫。
gs_dump支持將資料庫信息導出至純文本格式的SQL腳本文件或其他歸檔文件中。還可以用於openGauss與PostgreSQL之間的遷移。

gs_dumpall

gs_dumpall是openGauss用於導出所有資料庫相關信息工具,導出特點和gs_dump非常相似,導出openGauss資料庫的所有數據,包括默認資料庫postgres的數據、自定義資料庫的數據以及openGauss所有資料庫公共的全局對象。gs_dumpall在導出openGauss所有資料庫時分為兩部分:

  • gs_dumpall自身對所有資料庫公共的全局對象進行導出,包括有關資料庫用戶和組、表空間以及屬性(例如,適用於資料庫整體的訪問權限)信息。
  • gs_dumpall通過調用gs_dump來完成openGauss中各資料庫的SQL腳本文件導出,該腳本文件包含將資料庫恢復為其保存時的狀態所需要的全部SQL語句。
    以上兩部分導出的結果為純文本格式的SQL腳本文件,使用gsql運行該腳本文件可以恢復openGauss資料庫。

gs_restore

gs_restore是openGauss提供的針對gs_dump導出數據的導入工具。通過此工具可將由gs_dump生成的導出文件進行導入。主要功能包含:

導入到資料庫:如果連接參數中指定了資料庫,則數據將被導入到指定的資料庫中。其中,並行導入必須指定連接的密碼。導入時生成列會自動更新,並像普通列一樣保存。

導入到腳本文件:如果未指定導入資料庫,則創建包含重建資料庫所必須的SQL語句腳本並寫入到文件或者標準輸出。等效於直接使用gs_dump導出為純文本格式。

使用示例

注意:gs_dump和gs_restore工具需要由作業系統用戶omm執行。

準備環境和數據

環境:CentOS 7.6 + openGauss 3.1.0 極簡版

建用戶和資料庫

[omm@pekphisprb70593 ~]$ gsql -d postgres  
CREATE USER dumpuser identified by 'Gauss_234'; 
GRANT ALL PRIVILEGES TO dumpuser ; 
CREATE DATABASE dumpdb with owner dumpuser ENCODING 'utf8' template = template0;  
1234

建表

create table test1 (id integer,name varchar(20),salary float,time date,addr varchar(200),primary key(id)) ;
insert into test1 values (1,'zhangsan',2000.00,'2018-06-01 00:00:00','beijing');
insert into test1 values (2,'李四',2000.89,'2018-06-01 00:00:00','西安');
insert into test1 values (3,'Bob',2000,'2018-06-02 00:00:00','南京');

create table if not exists test2(id int primary key);

create table public.test3(id int primary key,name varchar(20));
insert into public.test3 values (1234567,'Kevin');


[omm@hecs-1105531 ~]$ cd /home/omm/
[omm@hecs-1105531 ~]$ mkdir dump
12345678910111213

gs_dump導出

通用參數說明:

-f, –file=FILENAME

將輸出發送至指定文件或目錄。如果省略該參數,則使用標準輸出。如果輸出格式為(-F c/-F d/-F t)時,必須指定-f參數。如果-f的參數值含有目錄,要求當前用戶對該目錄具有讀寫權限,並且不能指定已有目錄。

-F, –format=c|d|t|p

選擇輸出格式。格式如下:

p|plain:輸出一個文本SQL腳本文件(默認)。

c|custom:輸出一個自定義格式的歸檔,並且以目錄形式輸出,作為gs_restore輸入信息。該格式是最靈活的輸出格式,因為能手動選擇,而且能在恢復過程中將歸檔項重新排序。該格式默認狀態下會被壓縮。

d|directory:該格式會創建一個目錄,該目錄包含兩類文件,一類是目錄文件,另一類是每個表和blob對象對應的數據文件。

t|tar:輸出一個tar格式的歸檔形式,作為gs_restore輸入信息。tar格式與目錄格式兼容;tar格式歸檔形式在提取過程中會生成一個有效的目錄格式歸檔形式。但是,tar格式不支持壓縮且對於單獨表有8GB的大小限制。此外,表數據項的相應排序在恢復過程中不能更改。

輸出一個tar格式的歸檔形式,也可以作為gsql輸入信息。
-c, –clean

在將創建資料庫對象的指令輸出到備份文件之前,先將清理(刪除)資料庫對象的指令輸出到備份文件中。(如果目標資料庫中沒有任何對象,gs_restore工具可能會輸出一些提示性的錯誤信息)

該選項只對文本格式有意義。針對歸檔格式,可以調用gs_restore時指定選項。

-C, –create

備份文件以創建資料庫和連接到創建的資料庫的命令開始。(如果命令腳本是這種方式執行,可以先指定任意資料庫用於執行創建資料庫的命令,數據不會恢復到指定的資料庫中,而是恢復到創建的資料庫中。)

該選項只對文本格式有意義。針對歸檔格式,可以在調用gs_restore時指定選項。

-E, –encoding=ENCODING

以指定的字符集編碼創建轉儲。默認情況下,以資料庫編碼創建轉儲。(得到相同結果的另一個辦法是將環境變量「PGCLIENTENCODING」設置為所需的轉儲編碼。)

-n, –schema=SCHEMA

只轉儲與模式名稱匹配的模式,此選項包括模式本身和所有它包含的對象。如果該選項沒有指定,所有在目標資料庫中的非系統模式將會被轉儲。寫入多個-n選項來選擇多個模式。此外,根據gsql的\d命令所使用的相同規則,模式參數可被理解成一個pattern,所以多個模式也可以通過在該pattern中寫入通配符來選擇。使用通配符時,注意給pattern打引號,防止shell擴展通配符。

更多參數說明參考官網文檔。

導出為文本格式:
執行gs_dump,導出dumpdb 資料庫全量信息,導出的DUMPDB_backup.sql文件格式為純文本格式。這種的可以編輯,但是不建議。

[omm@hecs-1105531 ~]$ gs_dump -U dumpuser -W Gauss_234 -f /home/omm/dump/DUMPDB_backup.sql -p 5432 dumpdb -F p
gs_dump[port='5432'][dumpdb][2022-12-07 15:25:09]: The total objects number is 439.
gs_dump[port='5432'][dumpdb][2022-12-07 15:25:09]: [100.00%] 439 objects have been dumped.
gs_dump[port='5432'][dumpdb][2022-12-07 15:25:09]: dump database dumpdb successfully
gs_dump[port='5432'][dumpdb][2022-12-07 15:25:09]: total time: 1493  ms
12345

導出為歸檔格式
執行gs_dump,導出dumpdb資料庫全量信息,導出的DUMPDB_backup.tar文件格式為tar格式。

[omm@hecs-1105531 dump]$ gs_dump -U dumpuser -W Gauss_234 -f /home/omm/dump/DUMPDB_backup.tar -p 5432 dumpdb -F t
gs_dump[port='5432'][dumpdb][2022-12-07 15:54:45]: The total objects number is 439.
gs_dump[port='5432'][dumpdb][2022-12-07 15:54:45]: [100.00%] 439 objects have been dumped.
gs_dump[port='5432'][dumpdb][2022-12-07 15:54:45]: dump database dumpdb successfully
gs_dump[port='5432'][dumpdb][2022-12-07 15:54:45]: total time: 1452  ms
12345

執行gs_dump,導出dumpdb資料庫全量信息,導出的DUMPDB_backup.dmp文件格式為自定義歸檔格式。

[omm@hecs-1105531 dump]$ gs_dump -U dumpuser -W Gauss_234 -f /home/omm/dump/DUMPDB_backup.dmp -p 5432 dumpdb -F c
gs_dump[port='5432'][dumpdb][2022-12-08 09:37:18]: The total objects number is 439.
gs_dump[port='5432'][dumpdb][2022-12-08 09:37:18]: [100.00%] 439 objects have been dumped.
gs_dump[port='5432'][dumpdb][2022-12-08 09:37:18]: dump database dumpdb successfully
gs_dump[port='5432'][dumpdb][2022-12-08 09:37:18]: total time: 1463  ms
12345

導出指定schema下面的表
執行gs_dump,導出dumpdb資料庫的表(或視圖、或序列、或外表)對象,例如表test1。

[omm@hecs-1105531 dump]$ gs_dump -U dumpuser -W Gauss_234 -f /home/omm/dump/test1_bkp.sql -t public.test1 -p 5432 dumpdb
gs_dump[port='5432'][dumpdb][2022-12-07 16:01:28]: The total objects number is 423.
gs_dump[port='5432'][dumpdb][2022-12-07 16:01:28]: [100.00%] 423 objects have been dumped.
gs_dump[port='5432'][dumpdb][2022-12-07 16:01:28]: dump database dumpdb successfully
gs_dump[port='5432'][dumpdb][2022-12-07 16:01:28]: total time: 1024  ms
12345

gs_dumpall導出

使用gs_dumpall一次導出openGauss的所有資料庫

[omm@hecs-1105531 dump]$ gs_dumpall -f  /home/omm/dump/bkpall.sql -p 5432
gs_dump[port='5432'][dbname='dumpdb'][2022-12-07 16:12:17]: The total objects number is 439.
gs_dump[port='5432'][dbname='dumpdb'][2022-12-07 16:12:17]: [100.00%] 439 objects have been dumped.
gs_dump[port='5432'][dbname='dumpdb'][2022-12-07 16:12:17]: dump database dbname='dumpdb' successfully
gs_dump[port='5432'][dbname='dumpdb'][2022-12-07 16:12:17]: total time: 1243  ms
gs_dump[port='5432'][dbname='finance'][2022-12-07 16:12:18]: The total objects number is 459.
gs_dump[port='5432'][dbname='finance'][2022-12-07 16:12:19]: [100.00%] 459 objects have been dumped.
gs_dump[port='5432'][dbname='finance'][2022-12-07 16:12:19]: dump database dbname='finance' successfully
gs_dump[port='5432'][dbname='finance'][2022-12-07 16:12:19]: total time: 1798  ms
gs_dump[port='5432'][dbname='mydb'][2022-12-07 16:12:20]: The total objects number is 621.
gs_dump[port='5432'][dbname='mydb'][2022-12-07 16:12:20]: [100.00%] 621 objects have been dumped.
gs_dump[port='5432'][dbname='mydb'][2022-12-07 16:12:20]: dump database dbname='mydb' successfully
gs_dump[port='5432'][dbname='mydb'][2022-12-07 16:12:20]: total time: 1905  ms
gs_dump[port='5432'][dbname='newdb'][2022-12-07 16:12:22]: The total objects number is 432.
gs_dump[port='5432'][dbname='newdb'][2022-12-07 16:12:22]: [100.00%] 432 objects have been dumped.
gs_dump[port='5432'][dbname='newdb'][2022-12-07 16:12:23]: dump database dbname='newdb' successfully
gs_dump[port='5432'][dbname='newdb'][2022-12-07 16:12:23]: total time: 2070  ms
gs_dump[port='5432'][dbname='opengauss_db'][2022-12-07 16:12:25]: The total objects number is 611.
gs_dump[port='5432'][dbname='opengauss_db'][2022-12-07 16:12:25]: [100.00%] 611 objects have been dumped.
gs_dump[port='5432'][dbname='opengauss_db'][2022-12-07 16:12:25]: dump database dbname='opengauss_db' successfully
gs_dump[port='5432'][dbname='opengauss_db'][2022-12-07 16:12:25]: total time: 2529  ms
gs_dump[port='5432'][dbname='postgres'][2022-12-07 16:12:27]: The total objects number is 430.
gs_dump[port='5432'][dbname='postgres'][2022-12-07 16:12:27]: [100.00%] 430 objects have been dumped.
gs_dump[port='5432'][dbname='postgres'][2022-12-07 16:12:27]: dump database dbname='postgres' successfully
gs_dump[port='5432'][dbname='postgres'][2022-12-07 16:12:27]: total time: 1576  ms
gs_dump[port='5432'][dbname='school'][2022-12-07 16:12:29]: The total objects number is 449.
gs_dump[port='5432'][dbname='school'][2022-12-07 16:12:29]: [100.00%] 449 objects have been dumped.
gs_dump[port='5432'][dbname='school'][2022-12-07 16:12:29]: dump database dbname='school' successfully
gs_dump[port='5432'][dbname='school'][2022-12-07 16:12:29]: total time: 1933  ms
gs_dumpall[port='5432'][2022-12-07 16:12:29]: dumpall operation successful
gs_dumpall[port='5432'][2022-12-07 16:12:29]: total time: 13342  ms
[omm@hecs-1105531 dump]$ ll bkpall.sql
-rw------- 1 omm dbgrp 183028 Dec  7 16:12 bkpall.sql
123456789101112131415161718192021222324252627282930313233

gs_restore導入

工具通用參數:

-d, –dbname=NAME

連接資料庫dbname並直接導入到該資料庫中。
-a, –data-only

只導入數據,不導入模式(數據定義)。gs_restore的導入是以追加方式進行的。

-c, –clean

在重新創建資料庫對象前,清理(刪除)已存在於將要還原的資料庫中的資料庫對象。

-C, –create

導入到資料庫之前會先使用CREATE DATABASE創建資料庫(指定該選項後,-d指定的資料庫僅用以執行CREATE DATABASE命令,所有數據將被導入到創建的資料庫中)。

-e, –exit-on-error

當發送SQL語句到資料庫時如果出現錯誤,請退出。默認狀態下會繼續,且在導入後會顯示一系列錯誤信息。
更多參數說明參考官網文檔。

下面我們將之前導出的備份文件進行導入。
在此之前,對於導出的單個資料庫,需要新建一個空的資料庫進行恢復。

[omm@hecs-1105531 dump]$ gsql -d postgres
openGauss=# create database new_dmpdb1;
openGauss=# create database new_dmpdb2;
openGauss=# create database new_dmpdb3;
openGauss=# \q
12345

執行gs_restore,將導出的DUMPDB_backup.tar文件(tar格式)導入到new_dmpdb2資料庫。
成功時顯示如下:

[omm@hecs-1105531 dump]$ gs_restore /home/omm/dump/DUMPDB_backup.tar -p 5432 -d new_dmpdb2;
start restore operation ...
table test1 complete data imported !
table test2 complete data imported !
table test3 complete data imported !
Finish reading 15 SQL statements!
end restore operation ...
restore operation successful
total time: 37  ms
123456789

恢復指定表數據
執行gs_restore,使用自定義歸檔格式的DUMPDB_backup.dmp文件來導入PUBLIC模式下表test1。
成功時顯示如下:

[omm@hecs-1105531 dump]$ gs_restore /home/omm/dump/DUMPDB_backup.dmp -p 5432 -d new_dmpdb1 -n public -t test1
start restore operation ...
table test1 complete data imported !
Finish reading 15 SQL statements!
end restore operation ...
restore operation successful
total time: 12  ms
1234567

注意,gs_restore默認是以追加的方式進行數據導入。為避免多次導入造成數據異常,在進行導入時,建議使用「-c」 參數,在重新創建資料庫對象前,清理(刪除)已存在於將要還原的資料庫中的資料庫對象。

使用gsql 導入純文本格式
gsql是openGauss提供在命令行下運行的資料庫連接工具,可以通過此工具連接伺服器並對其進行操作和維護,除了具備操作資料庫的基本功能,gsql還提供了若干高級特性,便於用戶使用。這裡我們使用他的「執行SQL語句」能力完成導入。
執行gsql ,使用純文本格式DUMPDB_backup.sql文件來導入dumpdb 下全部信息。執行信息如下:

[omm@hecs-1105531 dump]$ gsql -d new_dmpdb3 -U dumpuser -f /home/omm/dump/DUMPDB_backup.sql
Password for user dumpuser:根據提示輸入密碼
12

查看結果

實驗結束。

需要注意的是,邏輯備份只能基於備份時刻進行數據轉儲,所以恢復時也只能恢復到備份時保存的數據。例如,T1時刻啟動gs_dump導出A資料庫,那麼導出數據結果將會是T1時刻A資料庫的數據狀態,T1時刻之後對A資料庫的修改不會被導出。所以建議在業務空閒期間操作。對於故障點和備份點之間的數據,邏輯備份無能為力,邏輯備份適合備份那些很少變化的數據。如果通過邏輯備份進行全庫恢復,通常需要重建資料庫,導入備份數據來完成,恢復時間較長,通常不被採用,而使用物理備份恢復。由於邏輯備份具有平台無關性,所以更為常見的是邏輯備份被作為一個數據遷移及移動的主要手段。

關鍵字: