昆仑分布式数据库系统简介 之 SQL 标准兼容性和日常维护工作
前几篇文章介绍主要侧重于宏观层面介绍昆仑分布式数据库系统,介绍了它的高可用性,高可扩展性,分布式事务处理和分布式查询处理,以及自动 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 语句来覆盖重复行
例如:
支持 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 私有扩展
do not allow updating/deleting rows of multiple tables in one stmt
do not support ‘order by’ clause and ‘limit’ clause of update/delete stmt
no modifiers allowed, such as IGNORE , delayed, low_priority, high_priority,quick
do not allow specifying partitions
common table expression should be in postgresql’s syntax
select:禁止所有 mysql 私有扩展
不支持 mysql 私有的 modifiers,包括[HIGH_PRIORITY]
不支持 with rollup 子句,因为 pg 的 olap 功能比这要强大很多,不需要这个 with rollup 子句
不支持指定分区查询
不支持[INTO OUTFILE ‘file_name’
不支持加锁子句
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 中找到替代函数;
另外,mysql 的所有 window 函数,在 postgresql 和昆仑系统中都是支持的,但是没有列在上面的列表中,在此处列出:
昆仑数据库不支持的 mysql 函数如下。可以看到大多数是 gis 和 json 函数,其余的函数,也可以在昆仑数据库中找到相同功能的函数,只是函数名称不同。
运算符的兼容性
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
版权声明: 本文为 InfoQ 作者【KunlunDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/69298a7cdc6190aac8eae43ea】。文章转载请联系作者。
评论