关于mysql:昆仑数据库-MySQL-连接协议简介

4次阅读

共计 7108 个字符,预计需要花费 18 分钟才能阅读完成。

昆仑数据库的计算节点基于 PostgreSQL 研发,因此间接能够反对 PostgreSQL 的连贯协定,所以应用 JDBC、ODBC 等通用的数据库连贯协定以及应用各类编程语言的 PostgreSQL 专有的连贯库的软件都能够连贯到昆仑数据库集群并且失常工作。

为了让本来应用 MySQL 的应用程序能够不须要批改也不须要从新编译就能连贯并且失常应用昆仑数据库,咱们开发了昆仑数据库的 MySQL 连贯协定,本文对此协定实现做一个简介。

总的来说,对于 KunlunBase 来说,连贯协定就是客户端与 KunlunBase 服务器通信的管道,MySQL 和 PostgreSQL 协定就是两种形态不同的管道,而其中传输的 SQL 语句和查问后果则实质上是雷同的。

也就是说 KunlunBase 反对的任何 SQL 语法和性能都能够在 MySQL 和 PostgreSQL 这两种连贯协定中的任何一种连贯中传输到服务器集群中失常执行并收到其后果。

例如能够在 MySQL 连贯中发送 PostgreSQL 公有语法 SQL 或者规范 SQL 语句,包含 prepared statement 语法、存储过程语法、DDL 语法等,并且失去遵循 MySQL 协定的后果,从而能够应用 MySQL 客户端库实现后果读取;也能够 在 PostgreSQL 连贯中发送 KunlunBase 反对的任何 MySQL 公有语法(例如 prepared statement、DML 等)的 SQL 语句或者规范 SQL 语句,并且失去遵循 PostgreSQL 的后果,从而能够应用 PostgreSQL 客户端库实现后果读取。

昆仑数据库 MySQL 协定反对的性能

昆仑数据库 MySQL 协定反对所有罕用性能,包含文本和二进制协定,连贯验证(只反对 mysql_native_password),数据压缩,prepared statement,字符集,错误处理,SSL 连贯等。

一个 Kunlun-server(计算节点)同时监听 2 个 TCP 端口 — PostgreSQL 协定的端口(默认 5432)和 MySQL 协定的端口(默认 5306),都能够通过配置文件自定义配置。

MySQL 和 PostgreSQL 客户端应用对立的用户名和明码连贯 Kunlun-server,不管应用哪一种连贯协定,Kunlun-server 收到 TCP 连贯申请后,会启动本端口的服务端协定(即 PostgreSQL 或者 MySQL)解决模块,实现连贯验证,建设起无效的数据库连贯。

后续在这两类连贯中用户能够发送的 SQL 语句完全相同,与协定无关。

用户能够在任何一类连贯中发送规范 SQL 语句,或者 PostgreSQL 或者 MySQL 公有语法的 SQL 语句给昆仑数据库并且取得后果。

账号和访问控制

用户通过 Kunlun-server 的 PostgreSQL 或者 MySQL 连贯发送 create user 语句建设用户账户,这里的 create user 语法(以及任何其余 DDL 语法)必须是 PostgreSQL 的语法。

DBA 通过在 pg_hba.conf 配置文件中建设访问控制规定,来可选地定义某些用户账号必须来自特定的 IP 或者域名,或者某个账户只能拜访某些 database 等访问控制规定。

对于在 pg_hba.conf 配置访问控制规定,详见 PostgreSQL 的文档。

错误处理

昆仑数据库 MySQ L 协定会主动把 PostgreSQL 的谬误号被映射到对应的 MySQL 谬误号;MySQL 协定运行期间返回的谬误则应用与 MySQL 的 server 端协定实现完全相同的谬误号。

因而应用程序本来解决 MySQL 谬误的代码逻辑不须要任何批改就能够依照预期工作。

JDBC 等数据库客户端 API 库基于异样类树进行错误处理,每一个异样类型绑定若干个 MySQL 谬误号,因而只有利用程序代码实现了异样捕获,也能够正确地捕捉昆仑数据库的 MySQL 连贯返回的谬误异样。

谬误形容文本应用 PostgreSQL 的谬误字符串,而不是 MySQL 谬误号对应的文本。

这通常不会成为问题,因为依据 MySQL 的文档,尽管谬误号码在所有 MySQL 版本中不变,然而谬误形容并不承诺不变,所以应用程序原本也不应该基于谬误字符串的内容匹配来实现其性能逻辑。

另外,KunlunBase 反对 MySQL 的 SHOW WARNINGS 和 SHOW ERRORS 语句,并且其用法和成果与 MySQL 的雷同语句完全相同。

字符集

MySQL 客户端能够依照其规范形式指定字符集,这个字符集如果昆仑数据库不反对则连贯失败报错。

PostgreSQL 默认反对丰盛的字符集,它与 MySQL 反对的字符集大部分是重合的,所有常见字符集两者都反对,包含所有中文、日韩字符集以及次要欧洲(西中东欧)各语言字符集。

MySQL 客户端发送到昆仑数据库的任何字符串,都会先转换为以后数据库的字符集再应用;返回给 MySQL 客户端的任何字符串都会先从以后数据库的字符集转回 MySQL 客户端字符集再发送。

不反对 MySQL 的 set client/connection/server_character_set/collation
, 然而反对 SET NAMES 语法。

数据压缩

反对应用 zlib 和 zstd 在传输数据包之前压缩。

昆仑数据库 MySQL 连贯协定不反对的 MySQL 性能

只反对 mysql_native_password 一种认证办法,不反对其余认证办法或者内部认证插件。这对于自 mysql-4.1 以来的各个版本的 MySQL 客户端都是没问题的,它们都能够正确地连贯上来并失常工作。

所有的明码治理性能:

包含明码过期,明码验证,双明码,明码重用限度,屡次明码谬误导致账户长期锁定等。所有此类性能都应用 PostgreSQL 原有的性能。

账户治理的不罕用性能:

代理用户(proxy user),未知、匿名用户、账户锁定,账户资源限度。

应用 text 协定发送 prepared statement:

生产零碎中应该应用 binary 连贯执行 prepared statement,这才是其设计初衷,也是昆仑数据库的 MySQL 协定反对的。

text 协定执行 prepare/execute 命令无论对于 MySQL 还是 PostgreSQL 都仅仅是用于开发和调试,而昆仑数据库并不反对 mysql 的 prepare/execute 语法,并且没有 MySQL 的用户自定义变量这个性能,也就无奈依照 mysql prepare statement 的形式绑定参数。

init_connect 语句初始化连贯状态:

该性能晓得的用户很少,而且在连贯 初始化好之前执行 SQL 语句原本也不合乎数据库系统的设计原理,因而在昆仑数据库中不反对。

session state tracking:

因为 MySQL 保护的那些 status 变量,在昆仑数据库的计算节点中并不存在。因而也不反对 mysql_session_track_xxx 系列客户端 API 函数。

然而同时,昆仑数据库继承了 PostgreSQL 的 pgstat 基础设施,pgstat 能够收集十分丰盛的零碎运行时统计信息,MySQL 和 PostgreSQL 客户端都能够通过查问 pgstat 的一系列视图和函数,能够失去这些信息。

详见 PostgreSQL 的 pgstat 文档。

昆仑数据库 MySQL 服务端协定与 MySQL 服务端协定不同的性能

连贯的指标数据库

当 MySQL 客户端连贯昆仑数据库计算节点时没有指定数据库名称,那么默认连贯到“postgres”数据库,这一点与 MySQL 的行为是不同的 — MySQL 在这种状况下不指定以后数据库。

同时,MySQL 反对应用 use db 语句或者应用 mysql_select_db() 客户端 API 来切换以后数据库,然而 postgres 并不容许在一个沉闷连贯中切换数据库,详见下文。

数据输入格局

对于所有数据类型,昆仑数据库都应用 PostgreSQL 的输入函数来生成文本协定下的查问后果,这意味着 decimal/numeric, float,real(double), date, timestamp, timestamptz, time 类型的输入后果在个别情况下可能会与 MySQL 的输入的字段值文本示意有细微差别 — 因为数值类型是因为序列化的浮点数精度差别;日期工夫类型是因为 locale 设置或者时区信息,例如 PostgreSQL 的 timestamptz 类型字段值总是带有时区值,例如”2022-5-30 21:08:35+08”。

如果应用 binary 协定(也就是应用 prepared statement,bind 参数和后果),则没有这些差异。

昆仑数据库反对的 MySQL 命令

在昆仑数据库的 MySQL 连贯中,MySQL 客户端软件除了能够发送 SQL 语句(即 COM_QUERY 命令)之外,还能够发送若干种其余命令,具体包含:

扭转连贯状态的命令及其对应的 MySQL 客户端 API:

COM_SET_OPTION:mysql_set_server_option()
COM_RESET_CONNECTION:
mysql_reset_connection()
COM_PING:mysql_ping()
COM_QUIT:
mysql_close()

Prepared statement 相干的命令:

COM_STMT_EXECUTE
COM_STMT_FETCH
COM_STMT_PREPARE
COM_STMT_SEND_LONG_DATA
COM_STMT_RESET
COM_STMT_CLOSE

昆仑数据库不反对的 MySQL 命令

昆仑数据库不反对的 MySQL 命令包含所有 deprecated(过期的,行将在将来版本去除)的命令,replication 和 clone 相干的命令,以及 mysql server 外部应用的(客户端不能够应用的)命令。

如果应用程序调用 MySQL 客户端 API 执行下列不反对的命令,则昆仑数据库计算节点会返回规范的 MySQL 谬误 1047(不反对的命令)。

昆仑数据库不反对的 MySQL 命令如下:

  • COM_PROCESS_KILL:mysql_kill() 已过期,应用 kill connection/query,不过昆仑数据库目前不反对此命令
  • COM_PROCESS_INFO:
  • mysql_list_processes() 已过期,应用 show
  • processlist,昆仑数据库目前已反对此命令
  • COM_BINLOG_DUMP_GTID:replication 命令,备节点 IO 线程连贯主节点时应用
  • COM_BINLOG_DUMP:replication 命令,备节点 IO 线程连贯主节点时应用
  • COM_REFRESH:更新用户账户和访问控制信息。昆仑数据库不须要用户显示地刷新缓存,而是齐全主动的探测到任何元数据表发生变化并且自动更新缓存的对应信息。不反对此命令或者对应的 mysql_reload(), mysql_refresh() 函数
  • COM_STATISTICS:昆仑数据库中统计信息应用 pgstat 的设施取得,不反对 mysql_stat()API 函数或者 mysqladmin 获取统计信息
  • COM_DEBUG:mysql_debug() 函数,仅在开发人员调试时应用,生产零碎中无奈应用。
  • COM_REGISTER_SLAVE:replication 命令,备节点 IO 线程连贯主节点时应用
  • COM_CLONE:clone 命令
  • COM_FIELD_LIST:mysql_list_fields() 已过期,应用 show columns,不过昆仑数据库目前不反对此命令,用户须要查问 pg_attribute 等元数据表取得列的元数据
  • COM_SLEEP:不是客户端发送的,外部应用
  • COM_CONNECT:连贯建设后就不能够发送此命令
  • COM_TIME:不是客户端发送的,外部应用
  • COM_DELAYED_INSERT:在 mysql 中已去除
  • COM_END:不是客户端发送的,外部应用
  • 不反对 mysql_set_local_infile_xxx() 系列函数

切换会话以后数据库和用户命令:

COM_INIT_DB:在 MySQL 连贯中切换以后数据库,也即是 use db 语句的命令版本。在昆仑数据库中这两种形式切换 database 都不反对。

PostgreSQL 要求客户端连贯到一个 database 后始终应用它,不能够切换。

同时 PostgreSQL 提供了 schema 这个概念,它是一个逻辑层面的名字空间。

在 PostgreSQL 中一个 database 外面能够创立任意数量的 schema, database 和 schema 之外的数据库对象(比方表,索引,视图,存储过程,sequence 等)都肯定属于某个 schema(名字空间)。

援用这些数据库对象时候,如果不指定 schema 名称,那么就是在一个称为 search_path 变量的名字空间列表中顺次按名字寻找这个对象。在一个连贯中能够动静的批改 search_path 变量来批改名字空间查找的 schema 序列,应用 PostgreSQL 的语法 set search_path。

昆仑数据库齐全继承了这些特色。在一个 MySQL 连贯中如果要切换 schema,那么执行 PostgreSQL 的 set search_path 即可。
MySQL 的 database 概念其实是数据库对象的物理(目录存储地位)和逻辑(名字空间)合并为一体了,而 PostgreSQL 则把它们离开,实现了更大的灵活性和自由度。

COM_CHANGE_USER:在 MySQL 中这个命令除了能够切换以后用户之外,还能够切换 database。因为上述起因,咱们不反对切换数据库,然而能够切换以后用户,所以只有 mysql_change_user() 函数调用指定的 database name 与以后连贯曾经连贯的数据库雷同时候,才能够正确执行,否则调用失败返回谬误。另外,用户也能够执行 PostgreSQL 的 set session authorization,set role 等命令做用户 / 角色切换。

MySQL 语法兼容性

  1. postgreSQL 要求标识符名称字节数 <64, 意味着如果标识符是中文的话,中文标识符最大字符数 M 在一个范畴内变动,最小的 M 不到 20 个字符。这里的标识符包含 database,table,column,procedure 等。
  2. 昆仑数据库反对罕用的 MySQL 公有的 DML 语法以及变量读写语法。并且无论在应用 PostgreSQL 协定的连贯还是 MySQL 协定的连贯中,都能够执行昆仑数据库反对的任何语法,包含这些 MySQL 公有 DML 语法,也包含规范的 SQL 语法,以及昆仑数据库反对的任何其余 PostgreSQL 公有语法。
  3. KunlunBase 反对 autoincrement 关键字定义列为自增列,也反对 last_insert_id() 函数,其用法与 mysql 完全相同
  4. KunlunBase 反对 MySQL 的所有公有数据类型,包含:

    • TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, VARBINARY, BINARY
    • 在 KunlunBase 中对立依照 bytea 类型来存储和解决
    • TINYTEXT, MEDIUMTEXT, LONGTEXT
    • 在 KunlunBase 中都对立依照 text 类型来存储和解决
    • DOUBLE (不带 PRECISION)
    • byte, tinyint, mediumint, middleint, 以及所有整形类型的 UNSIGNED 修饰符
    • DATETIME:不带时区信息的工夫戳。
    • TIMESTAMP

在 MySQL 和 PostgreSQL 中 TIMESTAMP 类型有不同的意义:在 MySQL 中它示意带有时区信息的工夫戳,在 PostgreSQL 中示意不带时区信息的工夫戳。为了与二者都保持一致,在 KunlunBase 中,在 MySQL 连贯中遵循 MySQL 的定义,在 PostgreSQL 连贯中遵循 PostgreSQL 的定义。

  1. 昆仑数据库不反对 MySQL 存储过程或者 MySQL 专有的 DDL 语法以及诸如 show 系列的命令,load data infile 命令等等任何 MySQL 特有性能的语法。

SSL 反对

目前咱们还没有实现昆仑数据库 MySQL 协定的 SSL 反对,在将来的版本中会反对 SSL 连贯。目前应用程序无奈调用任何 MySQL 客户端 SSL API 与昆仑数据库工作。

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/ 获取更多信息并且下载昆仑数据库软件、文档和材料。
KunlunBase 我的项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb

正文完
 0