国产数据库VastBase适配指南

背景

  目前数据库市场上,仍然是甲骨文、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 时,数据类型转换参考下表

MySQL Vastbase
char character
varchar character varying
tinytext text
mediumtext text
text text
longtext text
tinyblob bytea
mediumblob bytea
blob bytea
longblob bytea
binary bytea
varbinary bytea
bit bit varying
tinyint smallint
tinyint unsigned smallint
smallint smallint
smallint unsigned integer
mediumint integer
mediumint unsigned integer
int integer
int unsigned bigint
bigint bigint
bigint unsigned numeric
float real
float unsigned real
double double precision
double unsigned double precision
decimal numeric
decimal unsigned numeric
numeric numeric
numeric unsigned numeric
date date
datetime timestamp without time zone
time time without time zone
timestamp timestamp without time zone
year smallint
enum character varying (with check constraint)
set ARRAY[]::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.code delete 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就介绍完了,关注我,以后给大家介绍更专业的知识点。

原文地址:https://blog.csdn.net/qq_22136439/article/details/127207710

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,但是对于懂数据库却不熟悉Oracle的同学可能会有一定的障碍。正好在最近的一个项目中碰到了这样一个任务,于是研究了一下Oracle的数据导入导出,在这里跟大家分享一下。......_oracle 迁移方法 对比
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。最近我们在使用MYSQL 8 的情况下(8.025)在数据库运行中出现一个问题 参数prefer_order_i..._mysql prefer_ordering_index
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流。_navicat连接opengauss
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成中详述的键/值对和数组。_postgresql json
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgresql 注:navicat老版本可能报错。1.在springboot中引入我们需要的依赖以及相应版本。用代码生成器生成代码后,即可进行增删改查(略)安装好postgresql 略。更改配置信息(注释中有)_mybatisplus postgresql
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解析、修改、删除、更新、强制踢出数据库所有使用用户、连表更新与删除、获取今年第一天、获取近12个月的年月、锁表处理、系统表使用(查询所有表和字段及注释、查询表占用空间)、指定数据库查找模式search_path、postgre备份及还原_pgsql分组取每组第一条
文章浏览阅读3.3k次。上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......_postgresql archive_mode
文章浏览阅读3k次。系统:ubuntu22.04.3目的:利用向日葵实现windows远程控制ubuntu。_csdn局域网桌面控制ubuntu
文章浏览阅读1.6k次。表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。1,继承式分区,分为触发器(trigger)和规则(rule)两种方式触发器的方式1)创建表CREATE TABLE "public"."track_info_trigger_partition" ( "id" serial, "object_type" int2 NOT NULL DEFAULT 0, "object_name..._pg数据表分区的实现
文章浏览阅读3.3k次。物联网平台开源的有几个,就我晓得的有、、thingskit、JetLink、DG-iot(还有其他开源的,欢迎在评论区留言哦!),然后重点分析了下ThingsBoard、ThingsPanel和JetLink,ThingsBoard和Jetlinks是工程师思维产品,可以更多的通过配置去实现开发的目的,ThingsPanel是业务人员思路产品,或者开发或者用,避免了复杂的配置带来的较高学习门槛。ThingsBoard和Jetlinks是Java技术体系的,ThingsPanel是PHP开发的。_jetlinks和thingsboard
文章浏览阅读3.8k次。PostgreSQL 数据类型转换_pgsql数字转字符串
文章浏览阅读7k次,点赞3次,收藏14次。在做数据统计页面时,总会遇到统计某段时间内,每天、每月、每年的数据视图(柱状图、折线图等)。这些统计数据一眼看过去也简单呀,不就是按照时间周期(天、月、年)对统计数据进行分个组就完了嘛?但是会有一个问题,简单的写个sql对周期分组,获取到的统计数据是缺失的,即没有数据的那天,整条记录也都没有了。如下图需求:以当前月份(2023年2月)为起点,往后倒推一年,查询之前一年里每个月的统计数据。可见图中的数据其实是缺少的,这条sql只查询到了有数据的月份(23年的1月、2月,22年的12月)_如何用一条sql查出按年按月按天的汇总
文章浏览阅读3.8k次,点赞66次,收藏51次。PostgreSQL全球开发小组与2022年10月13日,宣布发布PostgreSQL15,这是世界上最先进的开源数据库的最新版本_mysql8 postgresql15
文章浏览阅读1.3k次。上文介绍了磁盘管理器中VFD的实现原理,本篇将从上层角度讲解磁盘管理器的工作细节。_smgrrelationdata
文章浏览阅读1.1k次。PostgreSQL设置中文语言界面和局域网访问_postgressql汉化
文章浏览阅读4.2k次。PostgreSQL 修改数据存储路径_如何设置postgresql 数据目录
文章浏览阅读4.7k次。在项目中用到了多数据源,在连接postgres数据库时,项目启动报错,说数据库连接错误,说dual不存在,网上好多教程都是说数据库查询的时候的大小写问题,而这个仅仅是连接,咋鞥却处理方法是修改application-dev.yml中的配置文件.项目中的druid参数是这样的:确实在配置文件中有个查询语句。_relation "dual" does not exist
文章浏览阅读4.9k次。PostgreSQL是一款强大的关系型数据库,但在实际使用过程中,许多用户经常会遇到慢SQL的问题。这些问题不仅会降低数据库性能,还会直接影响业务流程和用户体验。因此,本文将会深入分析PostgreSQL慢SQL的原因和优化方案,帮助用户更好地利用这个优秀的数据库系统。无论你是初学者还是专业开发者,本文都将为你提供实用的技巧和方法,让你的PostgreSQL数据库始终保持高效快速。_postgresql数据库优化
文章浏览阅读1.6k次。Linux配置postgresql开机自启_linux 启动pgsql
文章浏览阅读2k次。本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构。后续更高级的HA模式都是基于这个最基本的主备搭建。_postgresql主备