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 |
注:参数设置章节请参考《笔记-日志管理》https://www.modb.pro/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时候总是测试不通过,还请有测试通过的大佬帮忙看一下。