草庐IT

国产数据库VastBase适配指南

小夏陌 2023-04-15 原文

背景

  目前数据库市场上,仍然是甲骨文、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_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO 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? 最重要,可用于查看其它命令。

-- 启动数据库
vb_ctl start -D 数据库目录 或 vb_ctl start

-- 关闭数据库
vb_ctl stop -D 数据库目录 或 vb_ctl stop

-- 切换数据库
\c dbname

-- 查看帮助(重要)
\h

-- 查看快捷帮助(重要)
\?

-- 列出所有数据库
\l 

-- 列出所有当前数据库表
\d

-- 列出表的所有字段
\d tablename

-- 列出表的基本情况
\d+ tablename

-- 退出
\q

-- 查看索引
\di

-- 查看系统表
\dtS

-- 查看用户
\du    or   \dg

-- 显示表的权限分配情况
\dp

-- 查看连接数
\du

-- 查看视图
\dv   or  \d+ viewname

-- 创建用户
CREATE USER test WITH PASSWORD 'Test@123';

-- 创建角色
CREATE ROLE test WITH PASSWORD 'Test@123';

-- 创建数据库
CREATE DATABASE testdb;

-- 赋权
GRANT ALL PRIVILEGES ON DATABASE testdb to test;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO test;

-- 更改数据库所有者
ALTER DATABASE testdb OWNER TO test;

navicat介绍

  Vastbase是可以用Navicat连接与使用的,我们直接用PostgresSQL的连接方式即可

配置也和PostgresSQL的类似即可,不过这里需要注意的是,默认的初始用户vastbase是不支持远程连接的,所以我们需要自己新建一个用户,再连接即可:

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

与项目整合方法

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

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

  • Step1: 直接导入 postgresql 依赖
        <!-- postgresql 用以连接 vastbase -->
        <dependency>
           <groupId>org.postgresql</groupId>
           <artifactId>postgresql</artifactId>
           <version>42.2.12</version>
        </dependency>
  • Step2:配置数据源和驱动
allcam.database.host=172.16.11.120:5432
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.name=druid_datasource
spring.datasource.druid.driver-class-name=org.postgresql.Driver
spring.datasource.druid.url=jdbc:postgresql://${allcam.database.host}/acsdb?currentSchema=public
spring.datasource.druid.username=vb
spring.datasource.druid.password=password
spring.datasource.druid.initial-size=20
spring.datasource.druid.max-active=40
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.test-while-idle= true
spring.datasource.druid.test-on-borrow= false
spring.datasource.druid.test-on-return= false

迁移数据库

  这里主要介绍三种迁移数据库的方式,第一种是手动迁移数据库,第二种是用Navicat迁移,第三种是用海量数据的付费迁移工具exBase。如果对数据库性能与存储空间有严格要求,且库和数据不是很大的情况下,建议用手动迁移数据库,但这种方式工作量大,且对开发者要求更高。除此之外,我们更建议使用自动迁移的方式,自动迁移方便快捷,如果原库符合开发规范的情况下,迁移的郊果也不错,如果需要优化,也可在迁移的结果下,二次修改表结构与数据。

手动

  将原Msql数据库以SQL的形式导出,然后用文本操作工具(例如Sublime Text),按Vastbase语法进行替换操作即可。工作量太大,如果数据表不多,对性能和存储空间有严格要求的话,可以考虑。

Navicat 迁移(推荐)

   其实 Navicat Premium 自带就有,异库迁移数据库功能,接下来演示一下操作流程:

  • 首先选择 工具 --> 数据传输…
  • 配置目标信息
  • 点击选项后,根据需要配置,但一定要选择遇到错误时继续我们运行完成后再根据迁移报错,对数据库进行补偿即可
  • 选择要迁移的表,这里是选择所有的数据表,根据需要选择即可
  • 最后点击开始,等待完成即可

  这里需要注意的点是:如果原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就介绍完了,关注我,以后给大家介绍更专业的知识点。

有关国产数据库VastBase适配指南的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  8. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐