暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

昆仑分布式数据库系统简介 之 SQL 标准兼容性和日常维护工作

原创 KunlunBase 昆仑数据库 2022-04-19
259

前几篇文章介绍主要侧重于宏观层面介绍昆仑分布式数据库系统,介绍了它的高可用性,高可扩展性,分布式事务处理和分布式查询处理,以及自动DDL功能。本文进一步专门面向DBA/运维人员和应用软件程序员,来具体介绍一下昆仑分布式数据库到底是一个什么样的分布式关系数据库管理系统。

昆仑数据库的SQL标准兼容性

对于应用系统开发人员来说,昆仑分布式数据库不是postgresql,也不是mysql,而是一个支持标准sql语言的分布式关系数据库。基于昆仑分布式数据库开发应用软件和网站非常简单,并不需要多少PostgreSQL或者MySQL特定的知识,只要使用标准的SQL语句即可。应用软件中使用的sql语句几乎全是做数据的增删改查的,也就是insert/delete/update/select语句,这些语句包括它们操作的数据的数据类型,以及它们使用的运算符和SQL函数,在昆仑数据库以及所有其他主流RDBMS中都有非常好的SQL标准兼容性,这样就极大地增强了应用软件的SQL标准兼容性,降低了切换RDBMS的代价。

当前主流的RDBMS都有很好的SQL标准兼容性,这些标准SQL是绝大多数应用软件访问数据库时使用的语法。所以,如果你的应用软件或者网站原本是使用PostgreSQL,SQL server, oracle server或者mysql的,那么你只需要极少的修改或完全不需要修改sql语句,即可使用和读写访问昆仑数据库。

只有当你希望写存储过程时才需要postgresql的plsql知识。另外由于完全基于标准SQL语句,所以各种ORM工具比如hibernate 也能够与昆仑分布式数据库协同工作,这些ORM工具生成的代码和模块也不需要修改就可以访问昆仑数据库。

使用昆仑数据库不需要PostgreSQL或者其他特定的RDBMS的知识
虽然昆仑分布式数据库的计算节点基于PostgreSQL修改而来,并且截止昆仑-0.6版本,昆仑数据库只支持postgresql 客户端协议,但是应用程序开发者并不需要多少postgresql特定知识。PostgreSQL非常好地兼容标准SQL,因此所有标准的SQL语法,昆仑数据库都已经支持,这些标准SQL是绝大多数应用软件访问数据库时使用的语法,无论他连接的是哪一种RDBMS。

虽然PostgreSQL也有不少私有扩展,但是这些扩展大多已经在昆仑分布式数据库中被禁用。所以总的来说,只有程序员需要写PL/SQL 存储过程时候,才需要postgresql的特定知识。

另外对于习惯使用postgresql的开发者来说,postgresql的私有功能扩展,除了被禁用的部分,都是良好支持的;而且postgresql特有的函数和运算符,在昆仑数据库中都是完全支持的。这样你的应用软件就可以完全不需要修改就可以从使用postgresql改变为使用昆仑数据库。

mysql兼容性

当前昆仑0.6版本还不支持mysql连接协议,未来会支持,以便各种语言编写的使用mysql客户端协议的应用程序可以直接连接到昆仑数据库来工作。从应用软件开发者角度来看,mysql兼容性主要包括语法兼容和功能兼容。由于mysql本来就非常好的兼容sql标准,所以语法相同的语句,在昆仑数据库和mysql中一定会产生相同的效果,返回等价的结果。也就是说,只要语法兼容就意味着功能兼容。语法兼容方面,昆仑数据库与mysql和postgresql一样都非常兼容标准SQL语法,并且在昆仑系统内部已经做了postgresql与mysql之间的数据类型转换和映射,所以剩余的兼容性问题就是DML语句的语法扩展,以及系统函数和运算符导致的。

insert 语法:支持部分mysql 私有扩展语法

支持on conflict do update 子句并且保持mysql的语法(其语法与postgresql略有不同)

支持insert ignore 来忽略unique key/primary key冲突,不忽略其他错误

例如:insert ignore into t1 values(1,2);

支持replace语句来覆盖重复行

例如:

replace into t1 set a=1,b=2; replace t1 values(1,2);
支持insert语句的set语法:

例如:insert into t1 set a=1,b=2;

支持insert into… select from
禁止insert和replace的其他修饰关键字,即 delayed, low_priority, high_priority等全部不支持。
不可以指定分区,也就是不支持 insert into t2 partition(p0,p1) values(1,2),(3,4);

update & delete: 禁止所有mysql私有扩展

  1. do not allow updating/deleting rows of multiple tables in one stmt

  2. do not support ‘order by’ clause and ‘limit’ clause of update/delete stmt

  3. no modifiers allowed, such as IGNORE , delayed, low_priority, high_priority,quick

  4. do not allow specifying partitions

  5. common table expression should be in postgresql’s syntax

select:禁止所有mysql私有扩展

  1. 不支持mysql 私有的modifiers,包括[HIGH_PRIORITY]
[STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
  1. 不支持with rollup 子句,因为pg的olap功能比这要强大很多,不需要这个with rollup子句

  2. 不支持指定分区查询

  3. 不支持[INTO OUTFILE ‘file_name’

[CHARACTER SET charset_name] export_options | INTO DUMP-FILE 'file_name' | INTO var_name [, var_name]]
  1. 不支持加锁子句
[FOR {UPDATE | SHARE} [OF tbl_name [, tbl_name] ...] [NOWAIT | SKIP LOCKED] | LOCK IN SHARE MODE]]
  1. CTE should be in postgresql’s syntax, window definition and usage are also in postgresql’s syntax

系统函数的兼容性

mysql的系统函数中除了GIS和 json 函数,其余绝大多数都是标准的SQL函数。所有SQL标准函数都是昆仑数据库支持的,剩余少数mysql特有的非gis和json函数会根据用户需要来支持,而且用户也可以从PostgreSQL中找到替代函数;

postgres=# select distinct t1.*from mysql_funcs t1, pg_proc t2 where lower(t1.fname)=t2.proname; fname ------------------ ABS ACOS ASIN ATAN ATAN2 BIT_LENGTH CEIL CEILING CHARACTER_LENGTH CHAR_LENGTH CONCAT CONCAT_WS COS COT DEGREES EXP FLOOR JSON_OBJECT LENGTH LN LOG LOWER LPAD LTRIM MD5 OCTET_LENGTH PI POW POWER RADIANS REGEXP_REPLACE REVERSE ROUND RPAD RTRIM SIGN SIN SQRT TAN UPPER VERSION (41 rows)

另外,mysql的所有window函数,在postgresql和昆仑系统中都是支持的,但是没有列在上面的列表中,在此处列出:

ROW_NUMBER RANK DENSE_RANK CUME_DIST PERCENT_RANK NTILE LEAD LAG FIRST_VALUE LAST_VALUE NTH_VALUE

昆仑数据库不支持的mysql函数如下。可以看到大多数是gis和json函数,其余的函数,也可以在昆仑数据库中找到相同功能的函数,只是函数名称不同。

postgres=# select *from mysql_funcs t1 where lower(t1.fname) not in (select distinct proname from pg_proc); fname ----------------------------------- ADDTIME AES_DECRYPT AES_ENCRYPT ANY_VALUE BENCHMARK BIN BIN_TO_UUID BIT_COUNT COERCIBILITY COMPRESS CONNECTION_ID CONV CONVERT_TZ CRC32 CURRENT_ROLE DATEDIFF DATE_FORMAT DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR ELT EXPORT_SET EXTRACTVALUE FIELD FIND_IN_SET FOUND_ROWS FROM_BASE64 FROM_DAYS FROM_UNIXTIME GET_LOCK GREATEST GTID_SUBSET GTID_SUBTRACT HEX IFNULL INET6_ATON INET6_NTOA INET_ATON INET_NTOA INSTR IS_FREE_LOCK IS_IPV4 IS_IPV4_COMPAT IS_IPV4_MAPPED IS_IPV6 ISNULL IS_USED_LOCK IS_UUID JSON_ARRAY JSON_ARRAY_APPEND JSON_ARRAY_INSERT JSON_CONTAINS JSON_CONTAINS_PATH JSON_DEPTH JSON_EXTRACT JSON_INSERT JSON_KEYS JSON_LENGTH JSON_MERGE JSON_MERGE_PATCH JSON_MERGE_PRESERVE JSON_PRETTY JSON_QUOTE JSON_REMOVE JSON_REPLACE JSON_SEARCH JSON_SET JSON_STORAGE_FREE JSON_STORAGE_SIZE JSON_TYPE JSON_UNQUOTE JSON_VALID LAST_DAY LAST_INSERT_ID LCASE LEAST LOAD_FILE LOCATE LOG10 LOG2 MAKEDATE MAKE_SET MAKETIME MASTER_POS_WAIT MBRCONTAINS MBRCOVEREDBY MBRCOVERS MBRDISJOINT MBREQUALS MBRINTERSECTS MBROVERLAPS MBRTOUCHES MBRWITHIN MONTHNAME NAME_CONST NULLIF OCT ORD PERIOD_ADD PERIOD_DIFF QUOTE RAND RANDOM_BYTES REGEXP_INSTR REGEXP_LIKE REGEXP_SUBSTR RELEASE_ALL_LOCKS RELEASE_LOCK ROLES_GRAPHML ROTATE_SYSTEM_KEY SEC_TO_TIME SHA SHA1 SHA2 SLEEP SOUNDEX SPACE ST_AREA ST_ASBINARY ST_ASGEOJSON ST_ASTEXT ST_ASWKB ST_ASWKT STATEMENT_DIGEST STATEMENT_DIGEST_TEXT ST_BUFFER ST_BUFFER_STRATEGY ST_CENTROID ST_CONTAINS ST_CONVEXHULL ST_CROSSES ST_DIFFERENCE ST_DIMENSION ST_DISJOINT ST_DISTANCE ST_DISTANCE_SPHERE ST_ENDPOINT ST_ENVELOPE ST_EQUALS ST_EXTERIORRING ST_GEOHASH ST_GEOMCOLLFROMTEXT ST_GEOMCOLLFROMTXT ST_GEOMCOLLFROMWKB ST_GEOMETRYCOLLECTIONFROMTEXT ST_GEOMETRYCOLLECTIONFROMWKB ST_GEOMETRYFROMTEXT ST_GEOMETRYFROMWKB ST_GEOMETRYN ST_GEOMETRYTYPE ST_GEOMFROMGEOJSON ST_GEOMFROMTEXT ST_GEOMFROMWKB ST_INTERIORRINGN ST_INTERSECTION ST_INTERSECTS ST_ISCLOSED ST_ISEMPTY ST_ISSIMPLE ST_ISVALID ST_LATFROMGEOHASH ST_LATITUDE ST_LENGTH ST_LINEFROMTEXT ST_LINEFROMWKB ST_LINESTRINGFROMTEXT ST_LINESTRINGFROMWKB ST_LONGFROMGEOHASH ST_LONGITUDE ST_MAKEENVELOPE ST_MLINEFROMTEXT ST_MLINEFROMWKB ST_MPOINTFROMTEXT ST_MPOINTFROMWKB ST_MPOLYFROMTEXT ST_MPOLYFROMWKB ST_MULTILINESTRINGFROMTEXT ST_MULTILINESTRINGFROMWKB ST_MULTIPOINTFROMTEXT ST_MULTIPOINTFROMWKB ST_MULTIPOLYGONFROMTEXT ST_MULTIPOLYGONFROMWKB ST_NUMGEOMETRIES ST_NUMINTERIORRING ST_NUMINTERIORRINGS ST_NUMPOINTS ST_OVERLAPS ST_POINTFROMGEOHASH ST_POINTFROMTEXT ST_POINTFROMWKB ST_POINTN ST_POLYFROMTEXT ST_POLYFROMWKB ST_POLYGONFROMTEXT ST_POLYGONFROMWKB STRCMP STR_TO_DATE ST_SIMPLIFY ST_SRID ST_STARTPOINT ST_SWAPXY ST_SYMDIFFERENCE ST_TOUCHES ST_TRANSFORM ST_UNION ST_VALIDATE ST_WITHIN ST_X ST_Y SUBSTRING_INDEX SUBTIME TIMEDIFF TIME_FORMAT TIME_TO_SEC TO_BASE64 TO_DAYS TO_SECONDS UCASE UNCOMPRESS UNCOMPRESSED_LENGTH UNHEX UNIX_TIMESTAMP UPDATEXML UUID UUID_SHORT UUID_TO_BIN VALIDATE_PASSWORD_STRENGTH WAIT_FOR_EXECUTED_GTID_SET WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS WEEKDAY WEEKOFYEAR YEARWEEK (233 rows)

运算符的兼容性

mysql的SQL标准的运算符在昆仑数据库中都已经完全支持;剩余少数mysql私有扩展的运算符会在未来支持,具体包括(相信大多数人甚至不知道mysql还有这些运算符):

  • 逻辑运算符 &&,||, !,XOR
  • 比较运算符 <=> , A<=>B 意思是 A IS NOT DISTINCT FROM B
  • 位运算符 ^ , 即bitwise XOR
  • 算数运算符 DIV 和 MOD
  • 赋值运算符 := 大家通常很少用这个而是使用 =

最后,还需要解析mysql特有的comment(注释)并直接忽略它们,这样用户通过mysqldump 做的备份就可以直接导入到昆仑数据库。同时,设置全局和session用户变量的语句将会支持,由于postgresql的设置变量的语句语法与mysql的相同,所以需要设法正确区分开来。

另外,有些mysql特有功能的语法,比如replication相关的语法,show命令等是不支持的,所以DBA需要连接昆仑数据库的存储节点来做mysql数据库节点的日常运维管理工作。这类功能几乎都是应用软件开发者完全不需要直接操作的功能。

其他RDBMS的兼容性

如果用户原来使用SQL server或者oracle server等其他关系数据库,那么用户可以通过jdbc和odbc协议连接昆仑数据库系统,然后使用标准的sql语法来操作和访问昆仑数据库。这样,用户使用的sql server和oracle server的所有SQL标准功能都可以正常工作。对于sql server和oracle server的私有扩展功能,则需要用户修改应用程序的sql语句,改为使用标准的sql功能,或者昆仑数据库支持的postgresql 功能扩展。

DBA和运维的日常运维工作

对于DBA和运维人员来说,昆仑数据库的计算节点只需要非常少量的维护工作,主要包括:

  • 创建和删除计算节点实例
  • 手动和自动启停计算节点实例
  • 定期调用自带工具备份数据
  • 使用备份数据创建计算节点实例
  • 节点运行日志文件的收集归档以备分析

这些操作都可以完全脚本自动化完成。

并且由于昆仑数据库的“自动DDL”功能,DBA并不需要繁重的工作来维护计算节点和存储节点的元数据的映射,数据类型转换,以及元数据做所有节点上的统一和一致 — 这些重复劳动已经由昆仑数据库系统自动完成了。

另外,DBA对于存储节点的日常维护,完全等同与维护通用的mysql节点和复制集群,工作内容和方法完全相同。

点击阅读原文

推荐阅读

KunlunBase架构介绍
KunlunBase技术优势介绍
KunlunBase技术特点介绍
KunlunBase集群基本概念介绍

END

昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,可以满足用户对海量关系数据的存储管理和利用的全方位需求。
应用开发者和DBA的使用昆仑数据库的体验与单机MySQL和单机PostgreSQL几乎完全相同,因为首先昆仑数据库支持PostgreSQL和MySQL双协议,支持标准SQL:2011的 DML 语法和功能以及PostgreSQL和MySQL对标准 SQL的扩展。同时,昆仑数据库集群支持水平弹性扩容,数据自动拆分,分布式事务处理和分布式查询处理,健壮的容错容灾能力,完善直观的监测分析告警能力,集群数据备份和恢复等 常用的DBA 数据管理和操作。所有这些功能无需任何应用系统侧的编码工作,也无需DBA人工介入,不停服不影响业务正常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS标准测试集,可以实时分析最新的业务数据,帮助用户发掘出数据的价值。昆仑数据库支持公有云和私有云环境的部署,可以与docker,k8s等云基础设施无缝协作,可以轻松搭建云数据库服务。
请访问 http://www.kunlunbase.com/ 获取更多信息并且下载昆仑数据库软件、文档和资料。
KunlunBase项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb

最后修改时间:2022-11-29 10:45:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论