TDSQL Boundless 高度兼容 MySQL 8.0 协议。MySQL 生态中的系统工具(phpMyAdmin、Navicat、MySQL Workbench、DBeaver 等)、客户端等均适用于 TDSQL Boundless。
不支持的功能
禁止在系统库
mysql 下执行 DDL生成列(Generated column)
事件(Event)
表空间(Tablespace),也包括可传输表空间(Transportable tablespace)
资源组(Resource group)
外键(Foreign keys)
LOB 数据类型的部分更新(Partial Update of LOB in InnoDB)
JSON 数据类型的多值索引(Multi-valued indexes)
空间类型的函数(
GEOMETRY/GIS) 、数据类型和索引全文语法与索引(Fulltext indexes)
降序索引(Descending indexes)
保存点(SAVEPOINT)
REPAIR TABLE 语法
交换分区(ALTER TABLE ... EXCHANGE PARTITION)
SKIP LOCKED 语法
XA 相关的语法返回成功但是不生效
组复制(Group Replication)
X 协议(X Protocol)
与 MySQL 有差异的功能特性
自增列
TDSQL Boundless 提供了高性能模式和 MySQL 兼容模式的自增 ID:
高性能模式:此模式通过在每个对等节点上缓存一批自增 ID 值来提升性能,它能保证自增值全局唯一,但不保证自增值在所有节点间连续递增。缓存的批量大小受参数
tdsql_auto_increment_batch_size控制,默认值为100。MySQL 兼容模式:设置系统参数
tdsql_auto_increment_batch_size 为1,可保证自增值全局唯一且递增。警告:
为防止 AUTO_INCREMENT 列出现值重复,必须将其定义为独立的主键或唯一索引。如果它只是复合主键的一部分,那么用户手动插入的 ID 就可能与系统生成的 ID 冲突。为避免数据冲突,请始终将自增列定义为独立的主键或唯一索引。
与 MySQL 不同,TDSQL Boundless 的自增列在特定情况下可能出现值重复。当自增列不是主键或者唯一索引时(例如,自增列只是复合主键的一部分),TDSQL Boundless 无法保证其值的唯一性。这个问题会在用户手动插入的自增值与系统自动生成的值相同时出现。例如,创建一张测试表
t1,其中自增列 id 与 f1 组合成复合主键:CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT,`f1` int NOT NULL,`f2` int DEFAULT NULL,PRIMARY KEY (`id`,`f1`)) ENGINE=ROCKSDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3
此时,在节点一上执行操作写入数据,自动生成
id = 1 的数据:-- 使用系统生成的自增insert into t1(f1, f2) values(1,1);
在节点二上手动指定
id = 1,并执行写入提交:-- 用户主动指定了自增insert into t1(id, f1, f2) values(1, 1,1);
可能会导致最终
id 的值出现重复,因此在定义自增列的时候,尽量将自增列定义为独立的主键/唯一索引。存储引擎
TDSQL Boundless 仅支持创建与使用 RocksDB 存储引擎的表,且不允许修改表引擎。无论用户建表的时候指定的存储引擎是什么,TDSQL 都会转换成 RocksDB 引擎。
说明:
Blackhole 引擎除外。
字符集与排序规则
说明:
官方 MySQL 从8.0.29版本开始,原有默认 UTF8 编码格式变为 UTF8MB4。
TDSQL Boundless 沿用 MySQL 8.0.29之前版本的默认字符集 UTF8MB3(即 UTF8)。为提升应用的兼容性和可移植性,建议在 TDSQL Boundless 中创建表和建立数据库连接时,显式指定使用字符集编码。
对比项 | TDSQL Boundless | MySQL 8.0.29以下版本 | MySQL 8.0.29及以上版本 |
默认字符集 | UTF8MB3 | UTF8MB3 | UTF8MB4 |
默认排序规则 | UTF8_GENERAL_CI | UTF8_GENERAL_CI | UTF8MB4_0900_AI_CI |
SQL 广播
TDSQL Boundless 可通过设置
/*# broadcast */ SQL Hints 将查询广播到实例的所有节点。例如,SET GLOBAL只会设置某个节点上的变量;用/*# broadcast */ SET GLOBAL 可广播到所有节点能使其在全局生效。SHOW PROCESSLIST展示当前连接节点的 processlist,如果需要展示所有节点的,需要用/*# broadcast */SHOW PROCESSLIST;或SELECT * FROM information_schema.processlist日志输出
TDSQL Boundless 中,通用日志
general_log 和慢查询日志 slow_log 仅支持输出到文件,暂不支持通过 SET GLOBAL log_output=TABLE设置为输出到表。DDL 差异
相比 MySQL,TDSQL Boundless 支持了更多常用的 Online DDL 操作,支持在线变更列类型、字符集/排序规则、非分区表与分区表互转。但与 MySQL 不同,不那么常用的 DDL 操作,对于增/删主键、添加带表达式默认值的列(
ADD COLUMN DEFAULT (a+a))、涉及触发器的表等操作,TDSQL Boundless 不支持在线执行。若执行这类 DDL 时遇到报错,请先通过 set tdsql_use_online_copy_ddl = 0 关闭 Online DDL 模式,再重新执行。说明:
若执行增/删主键、添加带表达式默认值的列(
ADD COLUMN DEFAULT (a+a))、涉及触发器的表等操作报错,可通过 set tdsql_use_online_copy_ddl = 0 关闭 Online DDL 模式,再重新执行。注意,关闭 Online DDL 模式会导致 DDL 锁表且执行期间阻塞该表的写入。其他
SHOW VARIABLES;和SHOW GLOBAL STATUS; 展示的是当前连接的计算节点中的状态信息,连到不同的计算节点展示的信息可能不同。LOCK TABLE 相关的语句不会锁表阻塞业务读写,因此,部分依赖于 LOCK TABLE 的操作可能受限,例如,mysqldumper 导出工具。
实验特性
下述功能在当前版本为实验特性,请根据说明在一定条件下使用。
说明:
每个实验特性各自拥有独立开关和默认值。用户如需开启/关闭,请在连接到 TDSQL Boundless 实例后通过如下 SQL 语句开启(以 tdsql_enable_trigger 为例):
SET PERSIST tdsql_enable_trigger=ON;。特性名 | 开关 | 默认值 | 说明 |
触发器 | tdsql_enable_trigger | OFF | 不建议使用 |
视图 | tdsql_enable_view | ON | 不建议在视图上执行更新操作 不建议 ALTER 变更视图定义 |
存储过程 | tdsql_enable_procedure | ON | 不建议 ALTER 变更存储过程定义 |
函数 | tdsql_enable_function | ON | 不建议 ALTER 变更 function |