2.19.09.0 版本
DBLE Release Notes

以下对 DBLE 2.19.09.0 版本的 Release Notes 进行详细解读。
文章主要分为三部分内容:
一、DBLE 项目介绍
二、新版本主要更新解读
三、完整的 DBLE Release Notes 及翻译

一、DBLE 项目介绍

DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;

  • DBLE 官方项目:
    https://github.com/actiontech/dble
    如对源码有兴趣或者需要定制的功能的可以通过源码编译安装
  • DBLE 官方文档(已更新)
    https://actiontech.github.io/dble-docs-cn
    可以详细了解 DBLE 的背景和应用场景,本文未涉及到的细节都可在官方文档获得
  • 新版本 DBLE 下载地址及 Release Notes:
    https://github.com/actiontech/dble/releases
官方课程:
Tips:建议下载最新的 Releases 版本,下载 tar 压缩包即可,如有源码编译需求的,可以下载源码包。

二、新版本主要更新解读

距离 (2.19.07.0) 发布 71 天后 ,2.19.09.0 版本发布;
新版 dble 新增重构功能 8 个,修复缺陷 34 个,向后兼容性调整 3 处;

致谢

感谢以下人员对社区做出的贡献:
@yinyanghuafa, @CrookedPotato, @lirulei, @ssxlulu. 
感谢 Github 用户提供的优质 issue

感谢 QQ 群(669663113)内朋友提供的有效反馈

1、添加外部后端 MySQL-HA 连接
dble 在版本 2.19.09.0 开始提供对应的外部接口,基于以下几个基础要点进行设计:
  • 外部 HA 组件能够通过一定的方式和 dble 进行信息的主动沟通(包括脚本,网络通信,命令等方式)

  • 外部 HA 组件能够做出对与 MySQL 可用性的明确判断(包括哪些节点停流量,哪些节点主从切换,哪些节点启动流量)

在基于以上的两个条件的情况下,基于提供外部接口通用性以及易用性的考虑,决定通过管理端用户命令的方式添加对应的交互接口,具体的提供以下的三个交互接口:

  • 停止流量命令(dataHost @@disable)

  • 启动流量命令(dataHost @@enable)

  • 主从切换命令(dataHost @@swtich)

其次为了方便进行管理和观测,提供了一个当前切换状态的查询命令:

  • 切换状态查询命令(dataHost @@events)

外部 HA 组件可以通过 mysql 命令、脚本调用 mysql 命令、或者程序的 DB 连接执行 mysql 命令的方式进行交互。

同时此功能设计考虑到zk集群用户的需求,当用户使用 zk 集群状态下的 dble 进行高可用切换时,会有集群的联动机制,外部 HA 组件只需要通知其中一个节点即可。
以下提供一个外部 HA 和 dble 交互设计图:

命令的使用说明 & 命令实现细节 & 简单 HA 的交互使用案例 请查看以下文档:

https://github.com/actiontech/dble-docs-cn/blob/2.19.09.0/tag/2.Function/2.23_outerHa_linkage/2.23.2_command_usage.md

https://github.com/actiontech/dble-docs-cn/blob/2.19.09.0/tag/2.Function/2.23_outerHa_linkage/2.23.3_Logical_detail.md

https://github.com/actiontech/dble-docs-cn/blob/2.19.09.0/tag/2.Function/2.23_outerHa_linkage/2.23.4_mha_sample.md

dump 文件拆分命令 split
在进行 POC 时,现场人员进行数据导入时经常遇到各种问题,比较典型的是 dble 在导入文件时,对部分 sql 语句的不支持。另外,未分片的历史数据通过 dble 导入,旧数据会路由分片,在数据量较大时,耗时会比较长,在此过程中出现错误的话也很难排查。基于以上原因,2.19.09.0 版本提供工具对 mysqldump 导出的源数据文件按照后端分片节点进行分割。分割后的数据文件可以在每个后端分片执行导入,适配数据按分片导入的需求。
dump 文件语句处理

1. create database:会将逻辑数据库转换为物理库。

2. ddl 语句:根据表的分片节点写入到对应后端节点的 dump 文件中,对于全局表的 create 语句,会加入全局检查列,对于自增列,会将自增列的数据类型修改为 bigint。

3. insert:全局序列列值会被 dble 替换为全局序列,再按照拆分列根据拆分算法路由到对应后端节点的 dump 文件中。

4. 一些属性设置的语句会根据最近一次解析的 ddl 来决定下发到具体的后端节点的 dump 文件中。

5. 会跳过对视图的处理

6. 会跳过对子表的处理

命令语法
  1. mysql > split src dest [-r500] [-w500] [-l10000]


  2. - src:表示原始 dump 文件名

  3. - dest: 表示生成的 dump 文件存放的目录

  4. - -r 表示设置读文件队列大小,默认 500

  5. - -w 表示设置写文件队列大小,默认 500

  6. - -l 表示 split 后一条 insert 中最多包含的 values,只针对分片表,默认 10000。例如:原始 dump 文件分片表的一条 insert 语句包含三万条values,可平均分片到两个节点,则这条语句被 split 之后每个数据节点上生成一条包含一万 values 的insert和一条包含五千 values 的 insert。

生成的分片文件以格式:源文件名  -datanode名-时间戳.dump ,最新的文件时间戳最大。

例如:我的原始 dump 文件是 /tmp/mysql_dump.sql ,我想切分以后输出到 /tmp/dump/ 目录下,命令就是:

  1. split /tmp/mysql_dump.sql /tmp/dump/

命令的使用说明请查询以下文档:

https://github.com/actiontech/dble-docs-cn/blob/2.19.09.0/tag/2.Function/2.1_manager_cmd/2.1.19_split.md?tdsourcetag=s_pctim_aiomsg

三、完整的 DBLE Release Notes 及翻译

翻译

更新列表:
  • [#1467] 新增外部 MySQL-HA 软件调用接口,支持 MySQL-HA 软件发生数据库切换时调用 dble 同步切换路由

  • [#1452] mysqldump 导出的文件可以根据 datanode 拆分为多个文件。

  • [#1364] ChildTable 添加一个配置属性 “incrementColumn”。

  • [#1408] 为某些分区算法添加新的参数 “ruleFile”

  • [#1402] 升级 JWS 版本,因为有时旧版本无法正常工作。

  • [#1412] 为心跳连接添加一个可分辨的名称。

  • [#1405] 重构 Dbleserver&Dbleserver#startup。

  • [#1440] 管理命令 thread_used 的性能优化
缺陷修复:
  • [#1409] 实现集群的在线重启状态检查。

  • [#1505] 当 Join SQL 包含  using()  子句时,Explain 会得到错误的结果。

  • [#1499] 当 balance!= 0 并且所有后端 MySQL 被禁用时,重载 @@config_all 报错。

  • [#1445] 用户权限被限制时查询反馈不准确。

  • [#1336] 事务失败后,新事务可能会获得上一个事务的结果集。

  • [#1392] 当无法访问数据主机时, Commit  可能会得到奇怪的结果集。

  • [#1325] [#1317] server.xml 中的 maxPacketSize 属性不起作用。

  • [#1394] [#1434] 执行  SQL_SELECT_LIMIT=1000  时返回错误,并且有另一个无法访问的数据主机。感谢 @yinyanghuafa 报告错误。

  • [#1491] small int 类型在预处理语句协议中将导致抛出数组索引超出范围的异常。

  • [#1432] 管理命令  pause @@dataNode=…  即使该服务实际上并未停止也会返回 OK。

  • [#1393] 当启用慢日志后,一个非常大的 select SQL 会花费大量时间

  • [#1456] [load data … fields terminated by “x”…] 的 x 只能是 char 类型,期望 x 可以是 string 类型。

  • [#1335] 事务中查询之间的间隔时间被计算为 sqlExecuteTimeout 的一部分。

  • [#1321] 如果表使用保留字作为列名,并且 server.xml 中 useGlobleTableCheck=1 时,在全局表中插入数据将会出错。

  • [#1478] 当设置 lower_case_table_names=1 且视图名称包含大写字母时, select …  from view_name  将报错。

  • [#1458] 在 XA 事务中执行 DDL 时返回错误。

  • [#1400] 隐式插入到不同的数据节点可能不会遵循最终一致性。

  • [#1379] 函数形式为 char [N],如果在不带 [N] 的部分,dble 执行将出错。

  • [#1330] 带有重复列的 Join 查询期望失败报错,实际却成功了。

  • [#1365] 当 MySQL 设置 lower_case_table_names=1 时,Join 返回错误 “Unknown column ‘ta.id’ in ‘field list'”。

  • [#1429] 内部连接查询返回错误 “column t1.id not found”。

  • [#1428] 对于全局表,dble 在路由到 datanode 时将删除表名上的反引号。

  • [#1375] dble 不支持反引号。

  • [#1269]使用 c_api 驱动程序检查多查询功能时出错。

  • [#1239] PMA 无法连接到 dble,感谢 @lirulei 报告该错误。

  • [#1419] 执行  select … from where … limit n  时得到了一个错误 “table node build Own exception! Error:null” 。

  • [#1397] 如果在加载数据过程中发生错误,则 MySQL 协议数据包的 ID 是错误的 ,感谢 @ssxlulu 报告并修复该错误。

  • [#1388] 语句中包含中文字符的分号  ; ,将直接返回 OK。

  • [#1324] 如果查询中的表名添加反引号  table_name  ,表将被全局扫描。谢谢 @CrookedPotato 报告该错误。

  • [#1323] 选择一个特定的分片表,被反引号修饰的表明将路由到所有分片。

  • [#1385] 在  where  条件下使用正则表达式时,查询结果不正确。

  • [#1386] MySQL 中的数据库名称有 ‘.’ 时,执行 SQL 报错。

  • [#1398] 在连接 dble 时使用  –default-auth=sha256_password  和错误密码,返回错误:”lost connected”。

  • [#1277] 管理用户可以登录到服务器端口,感谢 @CrookedPotato 报告该错误
兼容性:
  • [#1267] 更改  reload @@config  逻辑,现在与  reload @@config_all  相同。

  • [#1412] 为心跳连接添加一个可分辨的名称。

  • [#1446] 重构  show @@directmemory 

Release Notes:

Features:
  • [#1467] Add a new backend dataSource HA System. For more details, click here .

  • [#1452] Dump file by mysqldump can be split to multi files according to datanode. For more details, click here .

  • [#1364] ChildTable add a config property “incrementColumn”

  • [#1408] Add a new param “ruleFile” for some PartitionAlgorithm

  • [#1402] Upgrade the JWS version because sometimes the old version does not work properly

  • [#1412] Add a distinguishable name for heartbeat connections

  • [#1405] Refactor Dbleserver&Dbleserver#startup

  • [#1440] Optimization implements of manager command thread_used Performance
Bug-fixes:
  • [#1409] Cluster restart online status check

  • [#1505] Explain got the wrong result while the join SQL contains  using()  clause

  • [#1499] Reload @@config_all return error when balance!=0 and all backend MySQL are disabled

  • [#1445] Query feedback is not accurate when user privilege is limited

  • [#1336] After a transaction failed, the new transaction may get the resultset of prev transaction

  • [#1392]  Commit  may get strange resultset when there is a  datahost  can not be reached

  • [#1325] [#1317] Property  maxPacketSize  in server.xml does not work

  • [#1394][#1434] Return an error when executing “SQL_SELECT_LIMIT=1000” and there is another  datahost  that can not be reached, thanks @yinyanghuafa report the bug.

  • [#1491] Small int type with PreparedStatement protocol will cause ArrayIndexOutOfBoundsException

  • [#1432] Manager cmd “pause @@DataNode=…” return OK, even if the service is not stopped in fact

  • [#1393] A very large select SQL costs a lot of time when turning on the slow log

  • [#1456] [load data … fields terminated by “x”…] x can only be char, expect x can be a string

  • [#1335] Gap time between queries during a transaction is calculated as part of sqlExecuteTimeout

  • [#1321] Insert into the global table with useGlobleTableCheck=1 in server.xml will get an error if the table use a reserved word as column name

  • [#1478]  select … from view_name  will get error when setting lower_case_table_names=1 and the view name contains uppercase letters

  • [#1458] Return error while executing DDL in XA transaction

  • [#1400] Implicit insert to different  datanodes  may not follow Eventually Consistency

  • [#1379] Functions form as char[N], if execute in dble without [N] section will get error

  • [#1330] Join query with ambiguous columns success but expect not

  • [#1365] Join return error “Unknown column ‘ta.id’ in ‘field list'” when MySQL setting lower_case_table_names=1

  • [#1429] Return error “column t1.id not found” for inner join query

  • [#1428] For the global table, dble will remove backquotes of table name while routing to  datanodes 

  • [#1375] dble does not support backticks

  • [#1269] Got an error while checking multi-query functionality by using c_api driver

  • [#1239] PMA can not connect to dble, thanks @lirulei report the bug.

  • [#1419] Got an error “table node buildOwn exception! Error:null” from executing SQL “select … from where … limit n”

  • [#1397] Wrong Packet Id of MySQL Protocol Packet If Error Happens In Process of Loading Data, thanks @ssxlulu report and fix the bug.

  • [#1388] The statement contains Chinese characters  ; , will return ok directly

  • [#1324] The table name in the query will be scanned globally. If add backquotes  table_name , thanks @CrookedPotato report the bug.

  • [#1323] Select to a certain sharding table whose name in backticks will be router to all shardings

  • [#1385] The query result is incorrect when the regexp is used in where  condition

  • [#1386] Execute SQL error when the database name in MySQL has ’.’

  • [#1398] Use  –default-auth = sha256_password  and the wrong password when connecting dble, return the error:  lost connected 

  • [#1277] The manager user can log in to the server port, thanks @CrookedPotato report the bug
Breaking backward compatibility:
  • [#1267] Change reload @@config logic, now it is the same to reload @@config_all. For more details, click here

  • [#1412] Add a distinguishable name for heartbeat connections. For more details, click here

  • [#1446] Refactor show @@directmemory. For more details, click here.

本次的发版报道就到这里啦~