背景

  目前数据库市场上,仍然是甲骨文、IBM为代表的国外数据库软件处于主导地位,国产化的数据库的使用率,与推广面很有限。相对于主流数据库而言,国产数据库的优势并不明显,还有相当远的距离。那么我们为什么要用国产数据库呢?因为数据安全。相对于其它新特性而言,安全尤为重要。数据一旦泄露,对个人而言是侵犯隐私。对企业而言是商业秘密,会导致经济损失。对国家机关而言是机密,会带来国家安全上的危害。毕竟谁也不想,自己的系统正常的运行中,突然就尝到了大洋彼岸自由的子弹。所以在金融军工电信能源医疗交通等关键行业领域,以及国企政府国产数据库的使用概率很高,而当客户有相当部分的国企与政府单位时,适配国产数据库是势在必行的事情。
 今天要分享的国产数据库为Vastbase G100,分享从Mysql到Vastbase的数据切换经验,以及如何解决一些开发中的实际问题注意事项等。

Vastbase介绍

  Vastbase G100(以下简称Vastbase)是海量数据基于openGauss内核研发的企业级关系型数据库。产品从架构到引擎等多维度均进行了大范围深度优化,兼具极致性能与高兼容高可用高安全多引擎高并发等多种特性,给用户提供更高级别的产品质量保障和运行支撑,是各行业用户数据库国产化的优选方案。更多信息:Vastbase官网Vastbase 官方文档
 那openGauss又是什么呢?openGauss是华为开源高性能高安全高可靠的企业级关系型数据库。是基于PostgreSQL 9.2版本开发的,基本包括了PostgreSQL 9.4的新功能。同时,openGauss也是一个开源、免费的数据库平台。更多信息:openGaussopenGauss仓库
 那PostgreSQL又是什么数据库呢?(最后一次套娃了)PostgreSQL 是一个免费的对象–关系数据库服务器(ORDBMS),号称 “世界上最先进的开源关系数据库” ,在灵活的BSD许可证下发行。正确的读法应该为: post-gres-Q-L,或简称为:postgres,当然也有读post-gre-S-Q-L的,emmm,看个人习惯吧,别当着老外读就行了。接下来我们看一下PostgreSQL的排名(截图于:2022.5.15),大家可以直接去 DB-Engines Ranking 查看最新的排名情况。


 从图中不难看出PostgreSQL受欢迎程度并不低,仅次于三巨头,甚至超过了我们常用的Redis、MongoDB与ES,其中Hbase竟跌出了前二十。从图二中我们可以看出,PostgreSQL在受欢迎的同时,趋势每年还在不停的上涨!要是各位的基金和股票也有这个势头就好了(doge)。更多信息:PostgreSQL 官网PostgreSQL 仓库
 结论:Vastbase 基于 –> openGauss 基于 –> PostgreSQL 9.2。那么我们费了这么大的力气理顺这条关系有什么用呢?有用处的,Vastbase是商用数据库,没有开源的代码,并且国内使用的企业也有限,别人也未必会把使用经验公开,所以遇到问题时,能查的到资料其实十分有限。这时,我们找解决方案时,可以直接去openGauss或PostgreSQL的社区查找!这些都是血泪史啊。其次我们也不难看出,虽然我们使用的是国产数据库,但是对开发者成长也是有一定帮助的,主要在于本数据库主要是基于PostgreSQL内核二次开发的,我们可以学习一下 “世界上最先进的开源关系数据库” 了,完成工作的同时,也扩展了自己的技术栈!

与Mysql的区别

事务支持

  • MySQL只有innodb引擎支持事务,事务一致性保证上可根据实际需求调整。
  • VastBase支持事务的强一致性,事务保证性好,完全支持ACID特性。

SQL标准支持

  • MySQL只支持部分SQL标准,相比于Vastbase支持类型稍弱。
  • VastBase几乎支持所有的SQL标准,支持类型相当丰富。

数据复制

  • MySQL的复制是基于binlog的逻辑异步复制,无法实现同步复制。
  • Vastbase可以做到同步,异步,半同步复制,以及基于日志逻辑复制,可以实现表级别的订阅和发布。

性能方面:

Vastbase:
  • Vastbase在OLTP/ OLAP系统中表现良好,读写速度以及大数据分析方面表现良好。
MySQL
  • MySQL是广泛选择的基于Web的项目,需要数据库只是为了简单的数据事务。但是,当遇到重负载或尝试完成复杂查询时,MySQL通常会表现不佳。
  • MySQL的读取速度,在OLTP系统中表现良好。
  • MySQL + InnoDB为OLTP场景提供了非常好的读/写速度。总体而言,MySQL在高并发场景下表现良好。
  • MySQL是可靠的,并且与商业智能应用程序配合良好,因为商业智能应用程序通常读取很多。

数据类型

Mysql: https://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
Vastbase: https://docs.vastdata.com.cn/zh/docs/VastbaseG100Ver2.2.5/doc/%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/SQL%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html
可简单参考下图:



MySQL 数据表转换到 Vastbase 时,数据类型转换参考下表

MySQLVastbase
charcharacter
varcharcharacter varying
tinytexttext
mediumtexttext
texttext
longtexttext
tinyblobbytea
mediumblobbytea
blobbytea
longblobbytea
binarybytea
varbinarybytea
bitbit varying
tinyintsmallint
tinyint unsignedsmallint
smallintsmallint
smallint unsignedinteger
mediumintinteger
mediumint unsignedinteger
intinteger
int unsignedbigint
bigintbigint
bigint unsignednumeric
floatreal
float unsignedreal
doubledouble precision
double unsigneddouble precision
decimalnumeric
decimal unsignednumeric
numericnumeric
numeric unsignednumeric
datedate
datetimetimestamp without time zone
timetime without time zone
timestamptimestamp without time zone
yearsmallint
enumcharacter varying (with check constraint)
setARRAY[]::text[]

需要注意的点有:

  • MySQL 转 Vastbase 时,数据类型的范围一定要从小转到大,否则可能会插入值失败
  • Vastbase 中建表时,并没有自带递增序列,但我们可以自定义序列,然后再建表时使用,步长可自定义,示例如下:
    CREATE SEQUENCE tbl_scs_alarm_file_map_id_seqSTART WITH 1INCREMENT BY 1NO MINVALUENO MAXVALUE CACHE 1;alter table tbl_scs_alarm_file_map alter column id set default nextval('tbl_scs_alarm_file_map_id_seq');
  • Vastbase 的时间是带时区的,要注意是否需要

函数、操作符

Mysql:https://dev.mysql.com/doc/refman/8.0/en/functions.html
Vastbase:https://docs.vastdata.com.cn/zh/docs/VastbaseG100Ver2.2.5/doc/%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/SQL%E5%8F%82%E8%80%83/%E5%87%BD%E6%95%B0%E5%92%8C%E6%93%8D%E4%BD%9C%E7%AC%A6.html
需要注意的有:

  • 函数太多了就没一一列举了,如果有对应的函数直接替换即可
  • 之后会介绍自动转换SQL的方法,可以参考转换后的函数
  • 如果没有对应的函数,只能写其它SQL、存储函数(不推荐)或业务代码代替

SQL语法

Mysql:https://dev.mysql.com/doc/refman/8.0/en/programs.html
Vastbase:https://docs.vastdata.com.cn/zh/docs/VastbaseG100Ver2.2.5/doc/%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/SQL%E5%8F%82%E8%80%83/%E5%87%BD%E6%95%B0%E5%92%8C%E6%93%8D%E4%BD%9C%E7%AC%A6.html

  其实80%的SQL语法是一致,重点在于剩下的20%,即我们SQL需要修改的地方,以下列举常见的SQL语法转换

MySQL 写法Vastbase 写法
` ’ “(支持三种引号)’ “(只支持单双引号,双引号表示字段和函数等,单引号表字符串)
limit 100,10;limit 10 offset 100;
GROUP_CONCAT(r.name)array_to_string(array_agg(r.name), ‘,’)
and FIND_IN_SET(d.type, #{devTags})and d.type = ANY(STRING_TO_ARRAY(#{devTags}, ‘,’))
IFNULL()COALESCE()
delete t from table1,table2 where table1.id = table2.codedelete from table1 where table1.id in (select table2.code from table2)
now()now() 或 CURRENT_TIMESTAMP
DATE_FORMAT(“alarmEndTime”,‘%Y-%m-%d %H:%i:%s’ )TO_CHAR(“alarmEndTime”,‘YYYY-MM-DD HH24:MI:SS’)
from dual不写
IF()CASE WHEN THEN ELSE END
DATEDIFF(createTime,NOW())date_part( ‘day’,date_trunc(‘day’,“createTime”) – date_trunc(‘day’,CURRENT_TIMESTAMP))
SELECT data, dataType From tbl_data;SELECT data, “dataType” From tbl_data; (驼峰字段必须加双引号)
注:需要注意的有:
  • 当SQL书写不是很规范,MySQL检查也不很严,在转换SQL时,需要改成正确的值,因为Vastbase检查比较严格,比如字段名为:dataType,mysql 写成 select dataType、datatype,DATATYPE都是可以查询的,而Vastbase只能写成select “dataType” … 才行
  • 字段都是驼峰命名时,所有需要加双引号才能查询…
  • ` 此引号,只有MySQL中有用,Vastbase中无用,直接全部删除即可

连接与使用工具

命今行介绍

  Vastbase的命令行工具,和Mysql的命令行工具一样,可用于写SQL和赋权操作等。在Vastbase服务正常启动的情况下,以操作系统用户 vastbase 登录数据库主节点,而后使用以下命令即可正常连接。

vsql -d vastbase -p 5432

vsql -d vastbase -h 10.10.0.11 -U vb -p 5432 -W Test@123

命令行常用命令

  vb_ctl 和Mysql的命令行类似,这里不再过多说明,主要讲讲常用的命令,其中 \h” />
配置也和PostgresSQL的类似即可,不过这里需要注意的是,默认的初始用户vastbase是不支持远程连接的,所以我们需要自己新建一个用户,再连接即可:

用Nvavicat连接后,我们可以看到,此界面的操作和mysql的操作是一致的,这里不再展开。

与项目整合方法

  官方项目整合地址:基于ORM框架的适配
 官方整合方式里,有一个小问题,就是需要 “Maven本地导入vastbase-2.0依赖” ,因为这个包Maven官方是没有的,我也没有在海量数据的官方网站找到

后来经过尝试,可以直接用PostgresSQL驱动即可,Maven官方也有此依赖,更加方便一些,所以具体整合步骤为:

  • Step1: 直接导入 postgresql 依赖
                <dependency>           <groupId>org.postgresql</groupId>           <artifactId>postgresql</artifactId>           <version>42.2.12</version>        </dependency>
  • Step2:配置数据源和驱动
allcam.database.host=172.16.11.120:5432spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.name=druid_datasourcespring.datasource.druid.driver-class-name=org.postgresql.Driverspring.datasource.druid.url=jdbc:postgresql://${allcam.database.host}/acsdb" />
  • 配置目标信息
  • 点击选项后,根据需要配置,但一定要选择遇到错误时继续我们运行完成后再根据迁移报错,对数据库进行补偿即可
  • 选择要迁移的表,这里是选择所有的数据表,根据需要选择即可
  • 最后点击开始,等待完成即可
  •   这里需要注意的点是:如果原Mysql的数据库创建的不够规范,那么迁移数据库时一定会有ERROR出现,比如在Mysql中,两张表的引索名称一样,都叫index_type,在Mysql中这种行为是被允许的,但PostgreSQL是不被允许的。那么迁移到PostgreSQL时,第一个索引会创建成功,但第二个会报错。此时我们的解决方法是,报错后,我们再以SQL的形式,重新手动写入第二索引,进行一个补偿行为即可。

    改写SQL

      改写SQL这里推荐两种方式。

    手动

       根据Vastbase语法,把原MySQL语句转换即可,可在navicat或其它客户端工具中,对SQL进行验证,需要细心的编写,对语言熟练度也有一定要求

    在线网站

      SQL手动转换其实工作量还是很大的,这里提供一下在线的转换SQL的网站,https://www.jooq.org/translate/ ,拉到页面下方,我们分别设置为MySQL和PostgreSQL 9.3即可(经过测试,无科学上网的情况下,可能不会翻译)


    这个网站不仅支持这两种SQL转换,共支持多达二十多种SQL语言的相互转换!

    接下来,左边写源SQL,右边即会自动生成目标SQL

     但令人难受的是,经过实践后我们发现,这些SQL转换,如果在左边SQL不是很规范的情况下,右边生成的SQL可能会有问题,不能直接使用,需要我们人为的改动一下!

    最后

      最后,Vastbase就介绍完了,关注我,以后给大家介绍更专业的知识点。