写点什么

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

作者:KunlunDB
  • 2022 年 5 月 23 日
  • 本文字数:5630 字

    阅读完需:约 18 分钟

前几篇文章介绍主要侧重于宏观层面介绍昆仑分布式数据库系统,介绍了它的高可用性,高可扩展性,分布式事务处理和分布式查询处理,以及自动 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 节点和复制集群,工作内容和方法完全相同。

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.zettadb.com/ 获取更多信息并且下载昆仑数据库软件、文档和资料。

KunlunDB 项目已开源

【GitHub:】https://github.com/zettadb

【Gitee:】https://gitee.com/zettadb

发布于: 刚刚阅读数: 2
用户头像

KunlunDB

关注

还未添加个人签名 2022.03.09 加入

还未添加个人简介

评论

发布
暂无评论
昆仑分布式数据库系统简介 之 SQL 标准兼容性和日常维护工作_国产数据库_KunlunDB_InfoQ写作社区