暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

腾讯云数据库TDSQL MySQL版开发指南(五)

原创 腾讯云数据库 2024-03-29
579

版本日期:2024.03(最新版本以腾讯云官网产品文档为准,本链接为2024年3月版)

版权声明

本文档著作权归腾讯云计算(北京)有限责任公司(以下简称“腾讯云”)单独所有,未经腾讯云事先书面许可,任何主体不得以任何方式或理由使用本文档,包括但不限于复制、修改、传播、公开、剽窃全部或部分本文档内容。

本文档及其所含内容均属腾讯云内部资料,并且仅供腾讯云指定的主体查看。如果您非经腾讯云授权而获得本文档的全部或部分内容,敬请予以删除,切勿以复制、披露、传播等任何方式使用本文档或其任何内容,亦请切勿依本文档或其任何内容而采取任何行动。

免责声明

本文档旨在向客户介绍本文档撰写时,腾讯云相关产品、服务的当时的整体概况,部分产品或服务在后续可能因技术调整或项目设计等任何原因,导致其服务内容、标准等有所调整。因此,本文档仅供参考,腾讯云不对其准确性、适用性或完整性等做任何保证。您所购买、使用的腾讯云产品、服务的种类、内容、服务标准等,应以您和腾讯云之间签署的合同约定为准,除非双方另有约定,否则,腾讯云对本文档内容不做任何明示或默示的承诺或保证。


错误码和错误信息

proxy 增加如下错误编码:

#define ER_PROXY_GRAM_ERROR_BEGIN 600

#define ER_PROXY_SANITY_ERROR 601 // "Sanity error: %s"

#define ER_PROXY_GS_NOT_SUPPORT 602 // sql 类型不支持

#define ER_PROXY_ORDERBY_INDEX_NEG 603 // order by index is negative

#define ER_PROXY_ORDERBY_INDEX_TOO_BIG 604 // order by index is too big

#define ER_PROXY_ORDERBY_TYPE_UNSUPPORT 605 // 不支持到 order by 用法

#define ER_PROXY_GROUPBY_INDEX_NEG 606 // group by index is negative

#define ER_PROXY_GROUPBY_INDEX_TOO_BIG 607 // group by index is too big

#define ER_PROXY_GROUPBY_TYPE_UNSUPPORT 608 // 不支持的 group by 用法

#define ER_PROXY_GET_AUTO_ID_FAILED 609 // 获取自增 id 失败

#define ER_PROXY_TEANS_ROLLED_BACK 610 // 事务已经被回滚

#define ER_PROXY_ONE_SET 611 // 当前 sql 应该被发往一个后端,但是不是

#define ER_PROXY_CLIENT_HS_ERROR 612 // 解析客户端握手包出错

#define ER_PROXY_ACCESS_DENIED_ERROR 613 // the length of readu_auth_switch_result is not 20,不应该出现

#define ER_PROXY_TRANS_NOT_ALLOWED 614 // 事务中不允许执行的命令

#define ER_PROXY_TRANS_READ_ONLY 615 // 只读事务中不允许执行的命令

#define ER_PROXY_TRANS_ERROR_DIFFENT_SET 616 // 非 xa 事务中,只读 sql 使用了多个后端

#define ER_PROXY_STRICT_ERROR 617 // strict 模式下,一次仅允许修改一个 set

#define ER_PROXY_SC_TOO_LONG 618 // 后端断开时间过长,链接断开

#define ER_PROXY_START_TRANS_FAILED 619 // 开启新的 xa 事务失败

#define ER_PROXY_SC_RETRY 620 // server 已经 close,请重试上一条 sql

#define ER_PROXY_SC_TRANS_IN_ROLLBACK_ONLY 621 // server 已经 close,当前事务处于 rollback

#define ER_PROXY_SC_COMMIT_LATER 622 // server 已经 close,事务会在稍后提交

#define ER_PROXY_SC_ROLLBACL_LATER 623 // server 已经 close,事务会在稍后回滚

#define ER_PROXY_SC_IN_COMMIT_OR_ROLLBACK 624 // server 在事务提交/回滚阶段 close

#define ER_PROXY_SC_NEED_ROLLBACK 625 // server 已经 close,需要回滚当前事务

#define ER_PROXY_SC_STATE_WILL_ROLLBACK 626 // server 已经 close,将会会滚

#define ER_PROXY_XA_UNSUPPORT 627 // xa 目前不支持的命令

#define ER_PROXY_XA_INVALID_COMMAND 628 // xa 命令不合法

#define ER_PROXY_XA_GTID_INIT_ERROR 629 // gtid log 初始化失败

#define ER_PROXY_XA_GET_SET_IP_PORT_FAILED 630 // 获取 set 地址失败

#define ER_PROXY_XA_UPDATE_GTID_LOG_FAILED 631 // 更新 gtid log 失败

#define ER_PROXY_MYSQL_PARSER_ERROR 632 // 嵌入式库 sql 解析失败

#define ER_PROXY_ILLEGAL_ID 633 // kill id 不合法

#define ER_PROXY_NOT_SUPPORT_CURSOR 634 // CURSOR_TYPE_READ_ONLY 暂不支持

#define ER_PROXY_UNKNOWN_PREPARE_HANDLER 635 // 执行的 prepare 不明确

#define ER_PROXY_SET_PARA_FAIL 636 // Set parameters failed

#define ER_PROXY_SUBPARTITION_DEAY 637 // 处理二级分区发生错误

#define ER_PROXY_NO_SUBPARTITION_ROUTE 638 // 没有获取到二级分区表的路由信息

#define ER_PROXY_LOCK_MORE_TABLE 639 // 一次只可以锁定一张二级分区表

#define ER_PROXY_GET_ROUTER_LOCK_FAIL 640 // 获取路由锁失败

#define ER_PROXY_PART_NAME_EMPTY 641 // 分区名称为空

#define ER_PROXY_SUB_PART_TABLE_IS_NONE 642 // 没有二级分区

#define ER_PROXY_PART_TYPE_DENY 643 // 二级分区类型不支持

#define ER_PROXY_PART_NAME_ILLEGAL 644 // 分区名不合法

#define ER_PROXY_DROP_ALL_PARTITION_FAIL 645 // 删除所有分区失败,尝试直接删除表

#define ER_PROXY_GET_OLD_PART_NUM_FAIL 646 // 获取表的分片数失败

#define ER_PROXY_EMPTY_SQL 647 // empty sql,不会返回给客户端

#define ER_PROXY_ERROR_SHARDKEY 648 // sk 必须为某一列

#define ER_PROXY_ERROR_SUB_SHARDKEY 649 // 二级分区键失败

#define ER_PROXY_SQLUSE_NOT_SUPPORT 650 // proxy 不支持这种用法

#define ER_PROXY_DBFW_WHITE_LIST_DENY 651 // 不在白名单,被防火墙拒绝

#define ER_PROXY_DBFW_DENY 652 // 防火墙拒绝

#define ER_PROXY_INCORRECT_ARGS 653 // stmt 参数不正确

#define ER_PROXY_SYSTABLE_UNSUPPORT_NON_READ_SQL 654 // 不支持非只读 sql 访问系统表

#define ER_PROXY_TABLE_NOT_EXIST 655 // 表不存在

#define ER_PROXY_SHARD_JOIN_UNSUPPORT_TYPE 656 // shard join 暂不支持的用法

#define ER_PROXY_RECURSIVE_JOIN_DENY 657 // 递归 join 不支持

#define ER_PROXY_JOIN_INTERNAL_ERROR 658 // join 异常

#define ER_PROXY_SQL_TOO_COMPLEX 659 // sql 太复杂,groupshard 暂不支持

#define ER_PROXY_INVALID_ARG_FOR_GTID_STATE 660 // gtid_state() 参数不合法

#define ER_PROXY_CANT_SET_GLOBAL_AUTOCOMMIT_GS 661 // Global autocommit cannot be set in groupshard

#define ER_PROXY_INVALID_VALUE_FOR_AUTOCOMMIT 662 // autocommit 值设置不合法

#define ER_PROXY_XID_ERROR 663 // xid 不合法

#define ER_PROXY_XID_GENERAT_FAILED 664 // xid 不能由用户指定

#define ER_PROXY_CANT_EXEC_IN_INTER_TRANS 665 // "The command cannot be executed in internal transction"

#define ER_PROXY_XID_TIME_ERROR 666 // "Unexpected time part of xid"

#define ER_PROXY_XID_TIMEDIFF_TOO_LONG 667 // "timediff > 1800s, it's not safe to execute boost"

#define ER_PROXY_SAVEPOINT_NOT_EXIST 668 // SAVEPOINT 不存在

#define ER_PROXY_SC_TRANS_IN_ROLLED 669 // 事务已经会滚,由于 serevr 已经 close

#define ER_PROXY_CANT_BOOST_IN_TRANS 670 // 事务中不允许执行 SQLCOM_BOOST

#define ER_PROXY_TRANS_EXPECTED 671 // "A transaction is expected, this maybe a bug"

#define ER_PROXY_EXTERNAL_TRANS 672 // 外部 xa 中不允许执行

#define ER_PROXY_AUTO_INC_FAIL 673 // "Deal auto inc failed"

#define ER_PROXY_CHECK_JOIN_FAIL 674 // "Check join failed"

#define ER_PROXY_TABLE_TYPE_NOT_MATCH 675 // "Do not support shard-table operations in noshard instance"

#define ER_PROXY_UNSUPPORT_NS_IN_INSERT 676 // "Do not support noshard and noshard_allset in insert sql"

#define ER_PROXY_ALTER_SEQ_ID_FAIL 677 // Alter seq id failed

#define ER_PROXY_ALTER_ID_ILLEGAL 678 // Alter seq id is illegal

#define ER_PROXY_CANT_CHANGE_STEP 679 // "Current table use zk to get auto inc, do not support to change step: \'%s\'"

#define ER_PROXY_ALTER_STEP_FAIL 680 // Alter step failed

#define ER_PROXY_TOO_MUCH_TABLES 681 // 表的数量超过限制

#define ER_PROXY_TABLE_EXISTED 682 // 表已经存在

#define ER_PROXY_CREATE_STABLE_FAILED 683 // 创建shard表失败,复杂 sql 不能用来创建 shard 表

#define ER_PROXY_DDL_DENY 684 // ddl 不允许的操作

#define ER_PROXY_SHADKEY_ERROR 685 // SQL should not relate to subpartition tables

#define ER_PROXY_NO_SK 686 // reject nosk

#define ER_PROXY_COMBINE_SQL_KEY 687 // Something went wrong

#define ER_PROXY_GET_SK_ERROR 688 // sk 获取失败

#define ER_PROXY_SHOW_FAILED 689 // proxy show 命令错误

#define ER_PROXY_SET_FAILED 690 // proxy set 命令错误

#define ER_PROXY_UNLOCK_FORMAT_ERROR 691 // sql 格式不正确

#define ER_PROXY_UNLOCK_ROUTER_FAIL 692 // 释放路由锁失败

#define ER_PROXY_LOCK_ROUTER_FAIL 693 // 加路由锁失败

#define ER_PROXY_PROXY_CMD_FAIL 694 // 不支持的/*proxy*/ 命令

#define ER_PROXY_PROCESS_RULE_FILE_FAILED 695 // dump_error

#define ER_PROXY_GET_AUTO_NUM_ERROR 696 // 获取自增值失败

#define ER_PROXY_SEQUENCE_NOT_EXIST 697 // sequence 不存在

#define ER_PROXY_SEQUENCE_ERROR 698 // sequence 不合法

#define ER_PROXY_SEQUENCE_ALREADY_EXIST 699 // sequence 已经存在

#define ER_PROXY_SQL_RETRY 700 // sql 还未提交或回滚

#define ER_PROXY_XA2PC_ABORT 701 // 2pc 失败,事务将会会滚

#define ER_PROXY_XA2PC_COMMIT 702 // 2pc 失败,后续提交

#define ER_PROXY_XA2PC_UNCERTAIN 703 // 2pc 失败,结果未知

#define ER_PROXY_KILL_ERROR 704 // kill 失败

#define ER_PROXY_TRACE_DENY 705 // trace 模式下不允许执行的sql

#define ER_PROXY_SQL_IMCOMPLETE 706 // 事务状态不完整

#define ER_PROXY_SHARDKEY_HASH_ERROR 709 // sk hash错误

#define ER_PROXY_GRAM_ERROR_END 799 

// system error -----------------------------------------------------------------------

#define ER_PROXY_SYSTEM_ERROR_BEGIN 900

#define ER_PROXY_SLICING 901 // slice 被修改,可能在扩容阶段,拒掉当前 sql

#define ER_PROXY_NO_DEFAULT_SET 902 // set 为空

#define ER_PROXY_GET_ADDRESS_FAILED 903 // 还未初始化完成,获取后端地址失败,稍后重试

#define ER_PROXY_SQL_SIZE_ERROR_IN_GET_CANDIDATE_ADDRESS 904 // 获取后端地址出错(发往后端个数不正确)

#define ER_PROXY_GET_ADDRESS_ERROR 905 // 获取后端地址出错

#define ER_PROXY_CANDIDATE_ADDRESS_EMPTY 906 // 未获取到后端地址

#define ER_PROXY_CANT_GET_SOCK 907 // socket 获取失败

#define ER_PROXY_GET_SET_SOCK_FAIL 908 // socket 获取失败

#define ER_PROXY_CONNECT_ERROR 909 // 后端连接失败

#define ER_PROXY_NO_SQL_ASSIGN_TO_SET 910 // 分发 sql 异常

#define ER_PROXY_STATUS_ERROR 911 // group 状态异常,断开链接

#define ER_PROXY_CONN_BROKEN_ERROR 912 // server close,sql 状态不正常

#define ER_PROXY_UNKNOWN_ERROR 913 // proxy 未知错误

#define ER_PROXY_ALL_SLAVES_UNAVAILABLE 914 // 所有备机不可用

#define ER_PROXY_ALL_SLAVES_CHANGE 915 // 备机异常

#define ER_PROXY_ERROR_END 916

其中900以上为系统错误,会通过 腾讯云可观测平台 进行告警。

TDStore 引擎

使用说明

TDSQL MySQL 版(TDStore 引擎)在使用上与 MySQL 8.0 高度一致,用户可以将其视为一个 MySQL 8.0 实例来使用,但请注意以下几点:

TDStore 引擎暂不支持的语法特性

  • 不支持下列对象的 CREATE/ALTER/DROP 语法。
    • event
    • resource group
    • instance
    • server
    • tablespace
    • spatial
  • SET GLOBAL log_output = TABLE:不支持 general_log 和 slow_log 输出到表,只能输出到 file(即慢查询日志文件)。
  • 暂不支持 LOCK TABLE 语法(默认依赖 LOCK TABLE 语法的数据导入导出工具,建议通过参数设置跳过 LOCK TABLE 的执行避免报错,例如 mysqldump --lock-tables = false)。
  • 禁止对 MySQL 库下的任何系统表进行 DDL 操作。
  • 暂不支持外键。
  • 不允许修改表的存储引擎。
  • 暂不支持虚拟列、GEOMETRY 类型、降序索引、全文索引。
  • 不支持 ALTER TABLE .. EXCHANGE PARTITION
  • 不支持 SAVEPOINT
  • 不支持 Spatial indexes
  • 不支持 Transportable tablespace
  • 不支持 multi-valued indexes
  • 不支持 Fulltext indexes
  • 不支持 Group Replication
  • 不支持 Partial Update of LOB in InnoDB
  • 不支持使用 INPLACE 或者 ONLINE 的方式添加含有 DEFAULT EXPRESS 列;

例如:支持 ALTER TABLE t ADD COLUMN col INT DEFAULT 10; 但不支持 ALTER TABLE t ADD COLUMN col INT DEFAULT (10);

  • 实验特性:触发器(trigger)功能在当前版本为实验特性,不建议用户在正式生产环境中使用。

每个实验特性各自拥有独立开关和默认值。用户如需开启/关闭,请在连接到 TDStore 实例后通过如下 SQL 语句开启(以 tdsql_enable_trigger 为例):SET PERSIST tdsql_enable_trigger=ON;。

特性名

开关

默认值

触发器

tdsql_enable_trigger

OFF

TDStore 引擎与 MySQL 8.0 的使用差异

  • TDStore 自增字段暂时只保证全局唯一,不保证全局自增。
  • add column,add/drop index 支持 online 不阻塞读写;变更 column 类型,变更字符集也支持 online 不锁表。目前会锁表的 DDL 操作主要有:
    • add/drop 主键
    • rename column
    • add/drop/change 自增字段
    • add column 的时候默认值采用了表达式的形式,例如 add column default (a+a)
    • 表是无主键表
    • 表上有关联的触发器

遇到上述不支持 online 的 DDL 系统会有报错提示,用户此时可以设置 set tdsql_use_online_copy_ddl = 0来通过锁表的方式执行这类 DDL。

  • set global xxx 只会设置某个节点上的变量,需要用/*# broadcast */ set global xxx 广播到所有节点才能使其在全局生效。
  • show variables,show global status 展示的是当前连接的计算节点中的状态信息,连到不同的计算节点展示的信息可能不同。
  • show processlist 展示当前连接节点的 processlist,如果需要展示所有节点的,需要用/*# broadcast */show processlist。

TDStore实例建表数量的限制

每个 TDStore 实例能创建表的数量有如下限制,此数量限制与构成实例的节点规格及节点数相关,若超出此限制将返回对应错误码(EC_MC_DATA_OBJ_LIMIT_EXCEEDED )。

节点规格(CPU 内存)

基础版实例最大建表数量(单节点)

集群版实例最大建表数量(3节点为例)

1核2GB

160

480

2核4GB

320

960

4核8GB

640

1920

8核16GB

1280

3840

16核32GB

2560

7680

32核64GB

5120

15360

错误码信息

TDStore 引擎错误码及说明如下:

当您遇到如下错误码需要处理时,您可以通过 在线支持 进行处理。

错误码

说明

50018

通用错误码,无具体含义

50019

存储引擎设置错误,例如 SET default_storage_engine=InnoDB 报此错误

50020

发生在 SQLEngine 进程启动的阶段,SQLEngine 向 MC 注册失败

50021

执行 DML 时,并发的 DDL 修改了表结构,DML 报此错误

50022

执行 DDL 时,DDL 被后台线程中断,DDL 报此错误

50023

执行 DML 时,并发的 DDL 修改了表结构,DML 报此错误

50024

执行 DDL 时,校验表结构失败,DDL 报此错误

50025

同一时间、同一对象上只能有一个 DDL 正在执行,并发的 DDL 报此错误,例如,sqlengine#1 执行 ALTER TABLE db1.tbl1;sqlengine#2 也执行 ALTER TABLE db1.tbl1,sqlengine#2 报错

50028

执行 DDL 时,创建表定义失败

50030

执行 DDL(带有自增值属性的 DDL)时,初始化自增值失败

50031

执行 DDL(如建表、建索引)时,分配 index id 失败

50032

SQL Engine 通用错误码,无具体含义

50033

执行 DML,获取自增值 next val 失败

50034

执行 DDL 或 DML 时,TDStore 无法创建迭代器

50035

执行 DML,推进自增值 next val 失败

50036

执行 DDL 时,未定义自增列,但给出了自增值,如 CREATE TABLE t(a INT) AUTO_INCREMENT=10;

50037

执行 DDL 或 DML 时,TDStore 上不存在相应事务上下文

50038

执行 DDL 或 DML 时,TDStore 上不存在相应事务上下文,更有可能发生了 "TDStore 切主"

50039

发生在进程启动时,初始化路由失败

50040

用户在 SET VARIABLE 时缺少权限

50041

内置函数 STORAGE_FORMAT 只接受1个 uint32 整数作为入参,输入其他参数会报此错误。如 SELECT STORAGE_FORMAT(10001);

50042

执行 DML 提交事务时,乐观事务冲突报错

50043

执行 DML 时,如果有写操作失败,为避免数据不一致,必须手工把事务回滚,然后能执行其他 SQL;在 ROLLBACK 之前执行其他 SQL,报此错误,如 INSERT INTO t - 失败、COMMIT - 报此错误、ROLLBACK - OK、其他 SQL - OK

50044

发生在 SQLEngine 进程启动时,集群尚不可用

50045

发生在 SQLEngine 进程启动时,无法建立事务保活机制,会影响到正常事务的执行流程,拒绝启动

50046

发生在 DDL,ALTER TABLE t CHANGE ENGINE 在 RocksDB 和其他引擎之间切换会报此错误

50047

发生在用 DML 直接修改权限相关的表(user/global_grants 等)报错

50048

执行 DML 时,并发的 DDL 修改了表结构,DML 报此错误

50049/50050

发生在 SQLEngine 进程启动时,SQLEngine 向 MC 申请唯一的标识 ID 并持久化在 SQLEngine 的数据目录下,这期间报错误

50051

执行 DDL 时,Online Copy DDL 流程的错误码

50052

执行 DDL 时,Online DDL 流程的错误码

50053

发生在本地变量版本比 MC 维护的版本低的情况

50054

发生在对只读变量使用 SET PERSIST_ONLY 语法

50055

发生在 TDStore 进行全量备份时报错

50057

DDL 会持久化一些任务信息,任务信息有长度上限,超过上限会报此错误

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论