| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 昆仑数据库 MySQL 连接协议简介 -> 正文阅读 |
|
[大数据]昆仑数据库 MySQL 连接协议简介 |
文章目录昆仑数据库的计算节点基于 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 数据压缩支持使用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:
Prepared statement 相关的命令:
昆仑数据库不支持的MySQL命令昆仑数据库不支持的 MySQL 命令包括所有deprecated(过时的,即将在未来版本去除)的命令,replication和 clone 相关的命令,以及mysql server内部使用的(客户端不可以使用的)命令。 如果应用程序调用 MySQL 客户端 API 执行下列不支持的命令,则昆仑数据库计算节点会返回标准的 MySQL 错误1047(不支持的命令)。 昆仑数据库不支持的 MySQL 命令如下:
切换会话当前数据库和用户命令: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即可。 COM_CHANGE_USER:在MySQL中这个命令除了可以切换当前用户之外,还可以切换database。由于上述原因,我们不支持切换数据库,但是可以切换当前用户,所以只有mysql_change_user()函数调用指定的database name与当前连接已经连接的数据库相同时候,才可以正确执行,否则调用失败返回错误。另外,用户也可以执行PostgreSQL的set session authorization,set role等命令做用户/角色切换。 MySQL语法兼容性
在 MySQL 和PostgreSQL中TIMESTAMP类型有不同的意义:在MySQL中它表示带有时区信息的时间戳,在PostgreSQL中表示不带时区信息的时间戳。为了与二者都保持一致,在KunlunBase中,在 MySQL 连接中遵循MySQL的定义,在 PostgreSQL 连接中遵循PostgreSQL的定义。
SSL支持目前我们还没有实现昆仑数据库 MySQL 协议的 SSL 支持,在未来的版本中会支持 SSL 连接。目前应用程序无法调用任何 MySQL 客户端 SSL API 与昆仑数据库工作。 END
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 12:53:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |