1、寫在前面
MogDB集成了PG和OpenGauss,也支持大量的插件,這些插件功能也非常常用,這個筆記測試下個人覺得在實際工作中會用到的功能。
2、dolphin和orafce兼容插件
dolphn和orafce主要是兼容mysql和oracle,就我們公司而言,目前的客戶數據庫用的最多的是Oracle和Mysql,我們公司主要是服務于金融和泛金融行業,這兩年在監管部門和國際關系的大背景下,金融和泛金融行業的信創比例也在逐步提高。因此現在很多客戶也都在對國產數據庫進行調研和測試。
在做可行性分析的時候對應用程序的工作量評估又是一個很大的占比。既在盡可能少的修改應用的前提下,保證數據庫的高性能、高可用、高安全。
1、安裝orafce
插件下載地址:插件的下載地址:https://www.mogdb.io/downloads/mogdb/
把下載的文件放到/opt/mogdb/data/tool/script/static/目錄下:($GPHOME/script/static)。
[omm@pkt_mogdb1 static]$ gs_install_plugin_local --orafce SUCCESS: orafce |
在數據庫中創建orafce
MogDB=# create extension orafce; ERROR: could not load library "orafce.so": /opt/mogdb/data/app/lib/postgresql/orafce.so: undefined symbol: _Z22gstrace_tryblock_entryPi |
創建報錯,咨詢群里老師是因為MogDB版本和Plugins版本不一致,經檢查發現我的MogDB是3.0.0,而Plugins當前默認的下載版本是3.0.1。重新去官網下載MogDB對應版本的插件包。
當前默認的是v3.0.1需要點擊完整版本才可以選擇3.0.0版本,重新下載3.0.0,
2、重新安裝orafce
[omm@pkt_mogdb1 static]$ gs_install_plugin_local --orafce --force SUCCESS: orafce |
查看插件信息,通過提示翻譯一下:支持部分函數以及rdbms包
db_mogdb=> select * from pg_catalog.pg_available_extensions; orafce | 3.17 | | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS |
使用omm初始用戶登錄db_mogdb數據庫
[omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_mogdb db_mogdb=# create extension orafce; CREATE EXTENSION |
插件已經創建成功,查看schema列表:\dn
可以看到多了oracle的模式以及很多個dbms_*的模式。每個模式下面都用存儲過程實現了oracle的功能。
可以切換到不同的模式來查看兼容了oracle的那些內容。
例如:切換到oracle模式下,查看提供了那些視圖
db_mogdb=# SET search_path TO oracle db_mogdb=# \dv |
3、安裝dolphn插件包
[omm@pkt_mogdb1 static]$ gs_install_plugin_local --dolphin --force #使用omm初始數據庫用戶登錄db_mogdb數據庫創建 [omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_mogdb db_mogdb=# CREATE EXTENSION dolphin; ERROR: please create extension "dolphin" with B type DBCOMPATIBILITY |
提示錯誤:在創建dolphin插件的時候,數據庫需要指定兼容類型為B。
select datname,datcompatibility from pg_database ORDER BY datname;
當前數據庫db_mogdb的兼容類型為A,不符合要求,重新創建一個數據庫,兼容類型的枚舉值如下:
指定兼容的數據庫的類型。 取值范圍:A、B、C、PG。分別表示兼容Oracle、MYsql、TD和POSTGRES |
創建兼容Mysql的數據庫
CREATE DATABASE db_mysql DBCOMPATIBILITY 'B'; #登錄db_mysql數據庫 [omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_mysql #重新創建 db_mysql=# CREATE EXTENSION dolphin; ERROR: Can't create dolphin extension lib is not in shared_preload_libraries |
報錯,提示lib不存在與shared_preload_libraries,遇到報錯,先查詢官網有沒有相應提示。
官網中說:此參數用于聲明一個或者多個在服務器啟動的時候預先裝載的共享庫,多個庫名稱之間用逗號分隔,那就從MogDB插件路徑中找到相應的包,然后配置到參數里重啟一下。
dolphin.so等插件安裝完成以后默認會安裝在cd $GAUSSHOME/lib/postgresql中。
配置shared_preload_libraries
#先檢查當前參數設置 gs_guc check -N all -I all -c "shared_preload_libraries" |
#配置參數 gs_guc set -N all -I all -c "shared_preload_libraries='/opt/mogdb/data/app/lib/postgresql/dolphin.so'" #重啟數據庫 [omm@pkt_mogdb1 data]$ gs_om -t restart |
注:參數設置章節請參考《筆記-日志管理》http://m.sunline.cc/db/465480
啟動的時候報錯,提示節點2不存在so文件,因為我的環境是主從環境,設置shared_preload_libraries參數的時候指定了所有節點,需要先把這個包里的文件都復制過去。
scp orafce.so dolphin.so omm@10.80.9.250:/opt/mogdb/data/app/lib/postgresql
重新啟動
[omm@pkt_mogdb1 postgresql]$ gs_om -t restart
重新創建插件
db_mysql=# CREATE EXTENSION dolphin; CREATE EXTENSION |
成功了。
查看一下當前模式并沒有像orafce那樣創建了很多schema
查看兼容說明:只兼容以下內容
Timestamp On Update
SQL Mode(Strice Mode, Full group by)
用戶鎖
nsert函數
3、pg_bulkload數據導入插件
之前在測試數據導入gs_loader時候,gs_loader類似于oracle的sqlloader,但是在此版本不支持,pg_bulkload正好可以補充這一功能。允許將外部格式化的文本文件導入到MogDB中。
1、安裝pg_bulkload插件包
gs_install_plugin_local --pg_bulkload --force [omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_mysql gsql ((MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. db_mysql=# CREATE EXTENSION pg_bulkload; CREATE EXTENSION |
2、測試從Mysql中導出一個表
select * from dump_tables_mysql into outfile 'D:\workspace\mysql8\data\dump_tables_mysql.dat' fields terminated by '|' lines terminated by '\n'; |
表中有600萬條數據。
把文件上傳到服務器
3、導入數據到MogDB
pg_bulkload -i ./dump_tables_mysql.dat -O dump_tables_mysql -l /home/omm/load.log -p 26000 -o "TYPE=csv" -o "DELIMITER=|" -d db_mysql -U omm |
600多萬數據導入2分鐘作用,非常快
4、使用ctl控制文件導入
編輯ctl文件
[omm@pkt_mogdb1 ~]$ cat dump_tables_mysql.ctl INPUT=/opt/mogdb/software/dump_tables_mysql.dat LOGFILE = /home/omm/load1.log LIMIT = INFINITE PARSE_ERRORS = 0 CHECK_CONSTRAINTS = NO TYPE = CSV DELIMITER = | OUTPUT = dump_tables_mysql MULTI_PROCESS = NO WRITER = DIRECT DUPLICATE_ERRORS = 0 ON_DUPLICATE_KEEP = NEW TRUNCATE = YES [omm@pkt_mogdb1 ~]$ |
根據ctl文件導入
pg_bulkload ./dump_tables_mysql.ctl -d db_mysql -U omm |
4、pg_repack數據導入插件
MogDB與Mysql類似每一個表對應一個OS文件,在頻繁的修改、刪除操作以后會使存在數據在page中是不連續的,有很多空隙。很容易影響效率。類似于Oracle的shink和Mysql的optimize.
1、安裝pg_repack插件包
[omm@pkt_mogdb1 mogdb]$ gs_install_plugin_local --pg_repack --force SUCCESS: pg_repack [omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_mysql gsql ((MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. db_mysql=# create extension pg_repack; CREATE EXTENSION |
2、查詢上面測試導入插件導入的表大小
db_mysql=# select pg_size_pretty(pg_relation_size('dump_tables_mysql_2)); pg_size_pretty ---------------- 153 MB (1 row) |
3、刪除部分數據
db_mysql=# delete from dump_tables_mysql_2 where schemaname='zkh'; DELETE 2097152 |
4、再次查詢上面測試導入插件導入的表大小
db_mysql=# select pg_size_pretty(pg_relation_size('dump_tables_mysql_2')); pg_size_pretty ---------------- 153 MB (1 row) |
大小沒有變化,是因為刪除的這個page頁被標記為空閑,下次insert的時候可以使用這些空閑的碎片
5、執行空間回收
pg_repack -d db_mysql -t dump_tables_mysql_2 -h 10.80.9.249 -U zkh -p 26000 |
正常情況下再次查詢select pg_size_pretty(pg_relation_size('dump_tables_mysql_2'));占用空間會變小,但是我本地始終測試不過,以下是我的錯誤信息。說insert與select字段不匹配導致的。可見pg_repack命令也是通過重建表實現表空間收縮.
臨時使用VACUUM FULL以下命令替換pg_repack
VACUUM FULL dump_tables_mysql_2; db_mysql=> select pg_size_pretty(pg_relation_size('dump_tables_mysql_2')); pg_size_pretty ---------------- 0 bytes (1 row) |
5、whale兼容Oracle插件(補充)
看到有朋友留言說補充一下whale插件,于是在官網查看了一個這個插件,發現這個插件與orafce類似也是兼容Oracle的一款插件,官網中描述分別如下:
whale是MogDB針對Oracle的兼容插件包,新增了Oracle函數以及package等功能。其中新增函數15個,例如instrb,nls_charset_id,nls_charset_name,nls_lower等。新增Oracle包7個,分別為dbms_random,dbms_output,dbms_lock,dbms_application_info,dbms_metadata,dbms_job,dbms_utility。
orafce是MogDB針對Oracle的兼容包,可以支持一些Oracle的表、函數和數據類型。orafce提供兼容Oracle RDBMS的函數和操作符。
沒有看到字面上明顯的區別,重新創建一個兼容類型是A的數據庫,然后創建插件查看是否存在明顯的差別。
1、安裝插件
#創建兼容oracle的數據庫 MogDB=> CREATE DATABASE db_oracle DBCOMPATIBILITY 'A'; CREATE DATABASE #安裝插件 gs_install_plugin_local --whale --force #登錄db_oracle數據庫 [omm@pkt_mogdb1 mogdb]$ gsql -U omm -d db_oracle #重新創建 db_oracle=# CREATE EXTENSION whale ; |
2、whale和orafce的區別
除dbms_*模式以外whale增加了whale模式,orafce增加了oracle模式,并且oracle模式下存在很多視圖,這個是whale沒有的,另外whale模式下支持的函數nls*、instrb、ora_hash也是orafce沒有的,可見這兩個插件針對這兩個模式是相互補充的
以下是oracle模式下對象的部分截圖
以下是whale模式對象下的部分截圖
dbms_*模式在兩個插件下的區別,用以下表格歸類一下:
Orafce插件 | Whale插件 |
dbms_alert | Dbms_application_info |
Dbms_assert | Dbms_job |
Dbms_output | Dbms_output |
Dbms_pipe | Dbms_metadata |
Dbms_random | Dbms_random |
Dbms_utility | Dbms_utility |
Dbms_lock |
通過對比發現Dbms_random、Dbms_output、Dbms_utility三個模式是兩個插件下共有的,其余的是作為互相補充。
6、寫在最后
通過測試得知了插件級別是數據庫級別的,比如A數據庫創建了插件,但是B數據如果不創建,則無法使用插件內容;插件創建在主從庫是同步的,只是從庫環境中沒有so庫文件。另外創建數據庫的時候一定要注意數據庫的兼容類別,在項目開始之初就要做好規劃,執行空間回收的時候需要注意表必須得存在主鍵,最后補充了一下whale和orafce兩個兼容oracle的插件的區別。
在測試pg_repack時候總是測試不通過,還請有測試通過的大佬幫忙看一下。




