MogDB秘籍 之 乾坤大挪移

引子
前文“MogDB企業應用 之 七種武器”介紹了MogDB客戶端七種驅動,文章末尾提到“除了武器之外MogDB的一些拳腳功夫”今天先填個“坑”。
“乾坤大挪移”是明教呼叫神功,除了運勁巧妙、善于挪移,乾坤大挪移更是集合了一切武功之大成,一法通,萬法通,任何武功在他面前都已無秘奧之可言。不論哪一家哪一派的武功都能取而為用。在光明頂之戰中,張無忌曾以乾坤大挪移復制了龍爪手,以同樣的招式戰勝了少林派四大神僧之一的空性。
江湖
雖說“乾坤大挪移”可以復制任何武功,但MogDB尚未修煉到“大圓滿”境界,因此MogDB目前只能“復制”自家宗門的功法。
宗門與輩分
說“復制”自家宗門的功法,那就先聊聊宗門與輩分。
公元1986年,POSTGRES初出江湖經過六(6.0)代傳人的努力,于1996年正是開宗立派“PostgreSQL”,版本號從6.0開始。
公元2020年6月30日,PostgreSQL第九(9.2.4)代傳人自立門戶創建了“openGauss”,號稱改造了七層以上的門派功法(C–>C++).
公元2020年9月30日,openGauss“大弟子”另立門派“MogDB”,MogDB屬于江湖上勢力最大的DBA“幫會”——云和恩墨,恩墨旗下門客眾多,且各個身懷絕技。MogDB是云和恩墨基于openGauss開源數據庫進行定制、推出的企業發行版。
三者屬于同宗,從輩分上看MogDB的師傅是openGauss,師祖是PostgreSQL,所以MogDB的“乾坤大挪移”是可以復制其“師傅”和“師祖”的武功,同樣可以借鑒或復制“師兄弟”、“師叔伯”(人大金倉、PolarDB-PG、TDSQL-PG、Vastbase等等)的武功。
功法

“乾坤大挪移”功法博大精深,復制“師傅”、“師祖”的功法還算靈光,但是如果想復制“師叔伯”、“師兄弟”的功法也并非易事,因為有些功法可能是“獨創的絕學”。
下面主要介紹如何復制“師傅”、“師祖”的功法。
插件移植
移植openGauss
原則上相同內核版本的openGauss插件是直接可以在MogDB上使用的。所以從師傅哪里移植插件其實也談不上復制。師傅有的徒弟都可以直接拿來用。
- 獲取MogDB現有插件

wget https://cdn-mogdb.enmotech.com/mogdb-media/3.0.1/Plugins-3.0.1-openEuler-arm64.tar.gz
tar -zxvf Plugins-3.0.1-openEuler-arm64.tar.gz
cd plugins
ls -l

共10款插件,其中大部分是MogDB自己開發的插件。
- 查看openGauss現有插件
frank@DESKTOP-6NF3B9K:~/git/openGauss-server/contrib$ ll total 288 drwxr-xr-x 67 frank frank 4096 May 20 21:22 ./ drwxr-xr-x 15 frank frank 4096 Aug 28 20:39 ../ -rw-r--r-- 1 frank frank 693 May 20 21:22 .gitignore -rw-r--r-- 1 frank frank 1611 May 20 21:22 CMakeLists.txt -rw-r--r-- 1 frank frank 1141 May 20 21:22 Makefile -rw-r--r-- 1 frank frank 1133 May 20 21:22 README drwxr-xr-x 2 frank frank 4096 May 20 21:22 adminpack/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 auth_delay/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 auto_explain/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 btree_gin/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 btree_gist/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 chkpass/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 citext/ -rw-r--r-- 1 frank frank 85 May 20 21:22 contrib-global.mk drwxr-xr-x 5 frank frank 4096 May 20 21:22 cube/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 dblink/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 dict_int/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 dict_xsyn/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 dummy_seclabel/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 earthdistance/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 file_fdw/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 fuzzystrmatch/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 gauss_connector/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 gc_fdw/ drwxr-xr-x 3 frank frank 4096 May 20 21:22 hdfs_fdw/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 hstore/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 intagg/ drwxr-xr-x 6 frank frank 4096 May 20 21:22 intarray/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 isn/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 lo/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 log_fdw/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 ltree/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 mppdb_decoding/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 mysql_fdw/ drwxr-xr-x 2 frank frank 4096 Aug 28 20:39 oid2name/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 oracle_fdw/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pagehack/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pageinspect/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 passwordcheck/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_archivecleanup/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_buffercache/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_check_clog/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_check_replslot/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_freespacemap/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_standby/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_stat_statements/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_test_fsync/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_test_timing/ drwxr-xr-x 5 frank frank 4096 Aug 28 20:39 pg_trgm/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_upgrade_support/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pg_xlogdump/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pgbench/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 pgcrypto/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 pgrowlocks/ drwxr-xr-x 4 frank frank 4096 Aug 28 20:39 pgstattuple/ drwxr-xr-x 4 frank frank 4096 Aug 28 20:39 postgres_fdw/ drwxr-xr-x 3 frank frank 4096 May 20 21:22 roach_api/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 security_plugin/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 seg/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 sepgsql/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 spi/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 sql_decoding/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 sslinfo/ drwxr-xr-x 3 frank frank 4096 May 20 21:22 start-scripts/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 tablefunc/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 tcn/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 test_decoding/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 test_parser/ drwxr-xr-x 5 frank frank 4096 May 20 21:22 tsearch2/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 unaccent/ drwxr-xr-x 2 frank frank 4096 May 20 21:22 vacuumlo/ drwxr-xr-x 4 frank frank 4096 May 20 21:22 xml2/
編譯安裝openGauss源碼
我這有個一鍵編譯安裝openGauss源碼的“秘籍”供大家參考,包括:
- 安裝必備軟件包
- 獲取openGauss源碼
- 獲取openGauss第三方依賴包
- 編譯openGauss源碼
- 創建omm用戶和dbgrp組
- 設置系統環境變量
- 初始化openGauss數據庫
#! /bin/bash
set -e
# 安裝依賴
yum install --skip-broken --allowerasing -y libaio-devel flex bison ncurses-devel glibc-devel patch readline-devel python3 python3-devel libaio-devel pam-devel libffi-devel golang autoconf automake cmake diffutils openssl-devel libtool libtool-devel bison-devel libatomic
mkdir git
cd git
# openGauss的代碼倉庫
# git clone https://gitee.com/xk_git_admin/openGauss-server.git
git clone https://gitee.com/opengauss/openGauss-server.git
# openGauss依賴的開源第三方軟件倉庫
# git clone https://gitee.com/xk_git_admin/openGauss-third_party.git openGauss-third_party
# git clone https://gitee.com/opengauss/openGauss-third_party.git openGauss-third_party
#cd openGauss-third_party/build
#sh build_all.sh
wget -c https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.0.0/openGauss-third_party_binarylibs.tar.gz
tar -xzvf openGauss-third_party_binarylibs.tar.gz
mv openGauss-third_party_binarylibs binarylibs
cd openGauss-server
sh build.sh -m debug -3rd /root/git/binarylibs
make install
make clean
ulimit -n 655350
groupadd dbgrp
useradd omm -G dbgrp
cd
mv git/ /home/omm
cd /home/omm
chown -R omm:dbgrp git
echo "export LD_LIBRARY_PATH=/home/omm/git/openGauss-server/mppdb_temp_install/lib:$LD_LIBRARY_PATH" >> /home/omm/.bashrc
echo "export PATH=/home/omm/git/openGauss-server/mppdb_temp_install/bin:$PATH" >> /home/omm/.bashrc
echo "export GAUSSHOME=/home/omm/data/single_node" >> home/omm/.bashrc
################
su - omm
cd /home/omm/git/openGauss-server/simpleInstall
sh install.sh -w "xk.XMX190035"
編譯openGauss插件
[root@host-10-208-7-168 contrib]# cd /root/git/openGauss-server/contrib
[root@host-10-208-7-168 contrib]# make -j8
[root@host-10-208-7-168 citext]# cd citext
[root@host-10-208-7-168 citext]# ls
citext--1.0.sql citext.control citext.cpp citext.so citext--unpackaged--1.0.sql expected Makefile sql
[root@host-10-208-7-168 citext]# make install
/usr/bin/mkdir -p '/root/git/openGauss-server/mppdb_temp_install/share/postgresql/extension'
/usr/bin/mkdir -p '/root/git/openGauss-server/mppdb_temp_install/share/postgresql/extension'
/usr/bin/mkdir -p '/root/git/openGauss-server/mppdb_temp_install/lib/postgresql'
/bin/sh ../../config/install-sh -c -m 644 ./citext.control '/root/git/openGauss-server/mppdb_temp_install/share/postgresql/extension/'
/bin/sh ../../config/install-sh -c -m 644 ./citext--1.0.sql ./citext--unpackaged--1.0.sql '/root/git/openGauss-server/mppdb_temp_install/share/postgresql/extension/'
/bin/sh ../../config/install-sh -c -m 755 citext.so '/root/git/openGauss-server/mppdb_temp_install/lib/postgresql/'
注:可以在/root/git/openGauss-server/contrib 編譯所有插件,也可以進入到具體插件目錄進行單獨編譯。
以citext插件為例,該插件需要將citext.control 和citext--1.0.sql copy到$GAUSS_HOME/share/postgresql/extension下,將citext.socopy到$GAUSS_HOME/lib/postgresql下。
安裝MogDB
這里用最簡單的PTK方法安裝:
- 安裝PTK
[root@host-10-208-7-168 ~]# curl --proto '=https' --tlsv1.2 -sSf https://cdn-mogdb.enmotech.com/ptk/install.sh | sh
Downloading ptk package...
Detected shell: bash
Shell profile: /root/.bash_profile
ptk has been added to PATH in /root/.bash_profile
open a new terminal or source /root/.bash_profile to active it
Installed path: /root/.ptk/bin/ptk
[root@host-10-208-7-168 ~]# source /root/.bash_profile
- 編輯配置文件config.yaml
[root@host-10-208-7-168 ~]# cat config.yaml
# config.yaml
global:
cluster_name: mogdb1
user: omm
group: omm
base_dir: /opt/mogdb
db_servers:
- host: 127.0.0.1
db_port: 26000
- 主機設置檢查
ptk checkos -f config.yaml
Q:有兩個錯誤

A:1.關閉防火墻;2.關閉大頁內存
systemctl stop firewalld.service
systemctl disable firewalld.service
echo never >/sys/kernel/mm/transparent_hugepage/enabled
# 如果出現A6.Check_SysCtl_Parameter | Abnormal,則使用下面方法{in Kylin 10 sp1}
echo "RemoveIPC=no" >> /etc/systemd/logind.conf
- 再次檢查
ptk checkos -f config.yaml

注:warning可以暫時不處理
- 執行安裝
ptk install -f config.yaml

- 切換omm用戶
su - omm
- 執行pg_config,查看相關信息
[omm@host-10-208-7-168 ~]$ pg_config BINDIR = /opt/mogdb/app/bin DOCDIR = /opt/mogdb/app/share/doc/postgresql HTMLDIR = /opt/mogdb/app/share/doc/postgresql INCLUDEDIR = /opt/mogdb/app/include PKGINCLUDEDIR = /opt/mogdb/app/include/postgresql INCLUDEDIR-SERVER = /opt/mogdb/app/include/postgresql/server LIBDIR = /opt/mogdb/app/lib PKGLIBDIR = /opt/mogdb/app/lib/postgresql LOCALEDIR = /opt/mogdb/app/share/locale MANDIR = /opt/mogdb/app/share/man SHAREDIR = /opt/mogdb/app/share/postgresql SYSCONFDIR = /opt/mogdb/app/etc/postgresql
其中PKGLIBDIR = /opt/mogdb/app/lib/postgresql 和SHAREDIR = /opt/mogdb/app/share/postgresql 是存放插件相關文件的目錄。
- 手動移植openGauss插件到MogDB插件目錄
[root@host-10-208-7-168 citext]# cp citext.so /opt/mogdb/app/lib/postgresql
[root@host-10-208-7-168 citext]# chown omm:omm /opt/mogdb/app/lib/postgresql/citext.so
[root@host-10-208-7-168 citext]# cp citext.control citext--1.0.sql /opt/mogdb/app/share/postgresql/extension/
[root@host-10-208-7-168 citext]# chown omm:omm /opt/mogdb/app/share/postgresql/extension/citext.control
[root@host-10-208-7-168 citext]# chown omm:omm /opt/mogdb/app/share/postgresql/extension/citext--1.0.sql
移植插件
- 當前插件
MogDB=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------------+---------+------------+--------------------------------------------------
dist_fdw | 1.0 | pg_catalog | foreign-data wrapper for distfs access
file_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
hdfs_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
hstore | 1.1 | pg_catalog | data type for storing sets of (key, value) pairs
log_fdw | 1.0 | pg_catalog | Foreign Data Wrapper for accessing logging data
mot_fdw | 1.0 | pg_catalog | foreign-data wrapper for MOT access
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
security_plugin | 1.0 | pg_catalog | provides security functionality
(8 rows)
- 可用插件,可以看到移植過來的citext插件。

MogDB=# create extension citext;
CREATE EXTENSION
MogDB=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------------+---------+------------+--------------------------------------------------
citext | 1.0 | public | data type for case-insensitive character strings
dist_fdw | 1.0 | pg_catalog | foreign-data wrapper for distfs access
file_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
hdfs_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
hstore | 1.1 | pg_catalog | data type for storing sets of (key, value) pairs
log_fdw | 1.0 | pg_catalog | Foreign Data Wrapper for accessing logging data
mot_fdw | 1.0 | pg_catalog | foreign-data wrapper for MOT access
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
security_plugin | 1.0 | pg_catalog | provides security functionality
(9 rows)
測試插件
MogDB=# SELECT 'a'::citext = 'a'::citext AS t;
t
---
t
(1 row)
MogDB=# SELECT 'a'::citext = 'b'::citext AS f;
f
---
f
(1 row)
MogDB=# SELECT 'a'::citext = 'ab'::citext AS f;
f
---
f
(1 row)
MogDB=# SELECT 'a'::citext <> 'ab'::citext AS t;
t
---
t
(1 row)
移植PostgreSQL
- 查看現有PostgreSQL的插件列表
[root@host-10-208-7-168 contrib]# pwd
/root/git/postgres/contrib
[root@host-10-208-7-168 contrib]# ll
total 248K
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 adminpack
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 amcheck
drwxr-xr-x 2 root root 4.0K Sep 4 12:23 auth_delay
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 auto_explain
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 basebackup_to_shell
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 basic_archive
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 bloom
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 bool_plperl
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 btree_gin
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 btree_gist
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 citext
-rw-r--r-- 1 root root 85 Sep 4 12:23 contrib-global.mk
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 cube
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 dblink
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 dict_int
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 dict_xsyn
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 earthdistance
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 file_fdw
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 fuzzystrmatch
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 hstore
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 hstore_plperl
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 hstore_plpython
drwxr-xr-x 2 root root 4.0K Sep 4 12:23 intagg
drwxr-xr-x 6 root root 4.0K Sep 4 12:23 intarray
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 isn
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 jsonb_plperl
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 jsonb_plpython
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 lo
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 ltree
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 ltree_plpython
-rw-r--r-- 1 root root 1.6K Sep 4 12:23 Makefile
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 oid2name
drwxr-xr-x 2 root root 4.0K Sep 4 12:23 old_snapshot
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pageinspect
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 passwordcheck
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_buffercache
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pgcrypto
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_freespacemap
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 pg_prewarm
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pgrowlocks
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_stat_statements
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pgstattuple
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_surgery
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 pg_trgm
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_visibility
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 pg_walinspect
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 postgres_fdw
-rw-r--r-- 1 root root 1.2K Sep 4 12:23 README
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 seg
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 sepgsql
drwxr-xr-x 2 root root 4.0K Sep 4 12:26 spi
drwxr-xr-x 2 root root 4.0K Sep 4 12:23 sslinfo
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 start-scripts
drwxr-xr-x 5 root root 4.0K Sep 4 12:23 tablefunc
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 tcn
drwxr-xr-x 6 root root 4.0K Sep 4 12:23 test_decoding
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 tsm_system_rows
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 tsm_system_time
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 unaccent
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 uuid-ossp
drwxr-xr-x 3 root root 4.0K Sep 4 12:23 vacuumlo
drwxr-xr-x 4 root root 4.0K Sep 4 12:23 xml2
如上節openGauss已經遷移了幾乎所有PostgreSQL的插件,所以現有PostgreSQL的插件幾乎都可以從openGauss上移植到MogDB,那么我們用一個自己實現的PostgreSQL插件進行移植。
編譯安裝postgres
git clone https://github.com/postgres/postgres.git
cd postgres/
./configure --prefix=/root/pgsql
make -j8
make install
編譯PostgreSQL插件
可以參考之前的一篇文章“postgresql自定義函數實現,通過contrib模塊進行擴展”,這里就簡單介紹一下過程。
主要過程:
- 在contrib目錄下創建插件目錄
- 編寫c代碼
- 編寫.sql文件
- 編寫.control文件
- 編寫Makefile
- 編譯
- 安裝
- 驗證
移植插件
敲黑板,劃重點。這個是本文的重點。
之前一篇文章是在MogDB上直接開發插件可以參考“openGauss/MogDB調用C FUNCTION”,這里主要將移植的注意事項。
- 核心差異
- PostgreSQL以C開發,MogDB/openGauss以C++,導出符號時可能存在ABI不兼容的問題。因此開發插件時C++代碼需要使用
extern "C" - 編譯是需要使用g++代替gcc。(如果使用cmake,需要把.c后綴還差.cpp,從而自動識別編譯器)
extern "C" Datum add_ab(PG_FUNCTION_ARGS);
分享一個MogDB/openGauss插件編譯的CMakeLists.txt。
cmake_minimum_required (VERSION 2.8)
project (gs_plug)
set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g3")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_BUILD_TYPE Debug)
set(MOG_INCLUDE /opt/mogdb/app/include/postgresql/server)
set(MOG_LIBPATH /opt/mogdb/app/lib/postgresql)
set(MOG_EXTENSION /opt/mogdb/app/share/postgresql/extension)
include_directories(${MOG_INCLUDE})
aux_source_directory(. DIR_SRCS)
add_library (${PROJECT_NAME} SHARED ${DIR_SRCS})
install(TARGETS ${PROJECT_NAME} DESTINATION ${MOG_LIBPATH})
- 安裝
cp *.control *.sql /opt/mogdb/app/share/postgresql/extension/ cp *.so /opt/mogdb/app/lib/postgresql/
測試插件
- 安裝前狀態

- 安裝插件

測試插件

以上關于PostgreSQL插件移植到MogDB算是拋磚引玉吧。PostgreSQL有著豐富的插件,大部分是非官方的。推薦個網站給大家,可以自己動手試試遷移。

MogDB插件安裝工具
可以參考前文“openGauss/MogDB腳本源碼淺析(2)—— gs_install_plugin/gs_install_plugin_local”,介紹了如何通過gs_install_plugin_local遷移openGauss的插件。
以lo插件為例,進行遷移
- 創建lo目錄
[omm@host-10-208-76-194 plugins]$ cd /opt/mogdb/tool/script/static/plugins/plugins
[omm@host-10-208-76-194 plugins]$ ls
dblink desc.json dolphin orafce pg_bulkload pg_prewarm pg_repack pg_trgm postgis wal2json whale
[omm@host-10-208-76-194 plugins]$ mkdir lo
[omm@host-10-208-76-194 plugins]$ ls
dblink desc.json dolphin lo orafce pg_bulkload pg_prewarm pg_repack pg_trgm postgis wal2json whale
[omm@host-10-208-76-194 plugins]$
- 將openGauss插件復制到MogDB插件目錄,并修改屬組
[root@host-10-208-76-194 lo]# cp lo.so lo.control lo--1.0.sql /opt/mogdb/tool/script/static/plugins/plugins/lo
[root@host-10-208-76-194 lo]# chown -R omm:omm /opt/mogdb/tool/script/static/plugins/plugins/lo
- 修改desc.json

- 重新打包
tar -zcvf Plugins-3.0.1-openEuler-arm64.tar.gz plugins/
注:這里重新打包有點麻煩,也可以修改代碼,注釋掉解壓的步驟,或者優雅一點,則可以增加參數控制是否重新解壓,如果不重新打包則解壓是desc.json會被覆蓋成老版本,導致安裝新插件失敗。
總結
希望這篇文章能把PostgreSQL、openGauss和MogDB關于插件開發和遷移相關的問題能夠盡量的講清晰,需要結合之前的幾篇(“postgresql自定義函數實現,通過contrib模塊進行擴展”、“openGauss/MogDB調用C FUNCTION”、“openGauss/MogDB腳本源碼淺析(2)—— gs_install_plugin/gs_install_plugin_local”)文章一起學習了解。




