云数据库 TaurusDB
云数据库 TaurusDB
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
- 内核介绍
- 用户指南
- 最佳实践
- 性能白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
-
API(推荐)
- 查询数据库引擎的版本
- 查询数据库规格
-
实例管理
- 创建数据库实例
- 重启数据库实例
- 删除/退订数据库实例
- 创建只读节点
- 删除/退订只读节点
- 包年/包月实例存储扩容
- 修改实例名称
- 重置数据库密码
- 变更实例规格
- 查询专属资源池列表
- 查询专属资源信息详情
- 设置实例秒级监控
- 查询实例秒级监控
- 节点重启
- 内核版本升级
- 开关SSL
- 绑定弹性公网IP
- 解绑弹性公网IP
- 手动主备倒换
- 设置可维护时间段
- 修改安全组
- 修改内网地址
- 修改实例端口
- 修改实例备注
- 申请内网域名
- 修改内网域名
- 查询内核版本信息
- 设置自动变配
- 查询自动变配
- 资源预校验
- 查询实例列表
- 查询实例详情信息
- 批量查询实例详情
- 设置回收站策略
- 查询回收站策略
- 查询回收站实例信息
- 批量修改节点名称
- 查询自动变配历史记录
- 设置Serverless配置策略
- 修改节点故障倒换优先级
- 查询弹性公网IP
- 备份管理
- 参数模板管理
- 配额管理
- 数据库代理
- 日志管理
- 标签管理
- 数据库用户管理
- 数据库管理
- 流量管理
- 任务中心
- 智能诊断
-
HTAP-标准版
- 恢复StarRocks数据同步
- 暂停StarRocks数据同步
- HTAP数据同步表配置校验
- 创建StarRocks实例
- 查询StarRocks实例
- 删除StarRocks实例
- 重启StarRocks实例
- 重启StarRocks节点
- StarRocks资源检查
- HTAP引擎资源查询
- 获取HTAP实例存储类型
- HTAP查询规格信息
- 查询HTAP实例列表
- 创建StarRocks数据同步
- 删除StarRocks数据同步
- 查询StarRocks数据同步状态信息
- HTAP数据同步库配置校验
- 查询StarRocks数据同步配置信息
- 查询StarRocks数据同步的库参数配置
- 查询StarRocks数据库
- 查询数据库账号
- 创建数据库账号
- 删除数据库账户
- 修改数据库账号密码
- 修改数据库账号权限
- StarRocks实例规格变更
- 查询参数
- 修改参数
- StarRocks实例开启行列分流
- 参数对比
- StarRocks内核版本升级
- 多租特性
- API(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 常见问题
-
故障排除
- 备份恢复
- 连接类
-
SQL类
- 建表时timestamp字段默认值无效
- 索引长度限制导致修改varchar长度失败
- delete大表数据后,再查询同一张表时出现慢SQL
- 更新emoji表情数据报错Error 1366
- 存储过程和相关表字符集不一致导致执行缓慢
- 报错ERROR [1412]的解决方法
- 存在外键的表无法删除
- GROUP_CONCAT结果不符合预期
- 创建二级索引报错Too many keys specified
- distinct与group by优化
- 为什么有时候用浮点数做等值比较查不到数据
- 开通数据库代理后,还是有大量select请求分发到主节点
- 表空间膨胀问题
- MySQL创建用户提示服务器错误(ERROR 1396)
- 执行alter table xxx discard/import tablespace报错
- 数据库报错Native error 1461的解决方案
- 创建表失败报错Row size too large的解决方案
- Order by limit分页出现数据重复问题
- 执行select * from sys.innodb_lock_waits报错
- 参数类
- 性能资源类
-
基本使用类
- 查看TaurusDB的存储容量
- 修改库名和修改表名
- 字符集和字符序的默认选择方式
- 自增字段值跳变的原因
- 表的自增AUTO_INCREMENT初值与步长
- 修改表的自增AUTO_INCREMENT值
- 自增主键达到上限,无法插入数据
- 自增字段取值
- 自增属性AUTO_INCREMENT为何未在表结构中显示
- 空用户的危害
- 慢日志显示SQL语句扫描行数为0
- 错误日志页面显示handle_sync_msg_from_slave my_net_read error:-1
- 执行SQL语句报错:ERROR 1290 (HY000): The MySQL server is running with the --sql-replica-on option so it cannot execute this statement的原因及解决方案
- 通用参考
链接复制成功!
分区级MDL锁
在MySQL社区版中,分区表的数据访问操作(DML)和分区维护操作(DDL)会互相阻塞,这意味着分区维护只能在业务低峰期进行。然而,创建和删除分区的操作相对频繁,这在很大程度上限制了分区表的使用。
TaurusDB实现了分区级别的MDL锁,使得分区表的锁粒度从表级降低到了分区级,不同分区上的DML和特定DDL(如增加和删除分区)在MDL锁上不会相互阻塞,从而大大提升分区间操作的并发性。
使用限制
- 当前版本支持分区级MDL锁功能,包括DROP PARTITION操作、RANGE和LIST分区方式的ADD PARTITION操作。
- DROP PARTITION操作和ADD PARTITION操作仅支持inplace算法,不支持copy算法。
- 由于隔离级别可以设置为会话级别,如果transaction_isolation设置为REPEATABLE-READ或更高的隔离级别,在并发执行DDL过程中,可能会出现如下报错:
ERROR HY000: Table definition has changed, please retry transaction。
这是正常现象,因为事务访问到了DDL创建的新分区。可以通过重新执行事务来解决这个问题。
前提条件
- TaurusDB内核版本大于等于2.0.57.240900时可使用该功能。
- transaction_isolation参数的全局隔离级别需要设置为“READ-COMMITTED”。
开启分区级MDL锁
您可以通过“rds_partition_level_mdl_enabled”参数来开启分区级MDL锁功能。
参数名称 |
级别 |
描述 |
---|---|---|
rds_partition_level_mdl_enabled |
Global |
分区级MDL锁特性开关,默认值为OFF。 ON:开启分区级MDL锁特性。 OFF:关闭分区级MDL锁特性。 修改该参数需要重启。 |
使用示例
分区级MDL锁功能确保分区表的数据访问和分区维护操作互不阻塞。用户可以在不影响分区表业务流量的情况下,更灵活地进行分区维护。
以下是使用示例:
- 准备数据。
mysql> mysql> CREATE TABLE t1 ( c1 INTEGER NOT NULL PRIMARY KEY, c2 CHAR(10)) PARTITION BY RANGE (c1) ( -> PARTITION p0 VALUES LESS THAN (100), -> PARTITION p1 VALUES LESS THAN (200), -> PARTITION p2 VALUES LESS THAN (300), -> PARTITION p3 VALUES LESS THAN (400), -> PARTITION p4 VALUES LESS THAN (500)); Query OK, 0 rows affected (0.22 sec) mysql> INSERT INTO t1 VALUES(0,'abc'),(100,'abc'),(200,'abc'),(300,'abc'),(400,'abc'); Query OK, 5 rows affected (0.02 sec) Records: 5 Duplicates: 0 Warnings: 0
- 客户端1开启事务。
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM t1 WHERE c1 >= 300; +-----+------+ | c1 | c2 | +-----+------+ | 300 | abc | | 400 | abc | +-----+------+ 2 rows in set (0.00 sec)
- 客户端2添加新分区。
mysql> ALTER TABLE t1 ADD PARTITION (PARTITION p5 VALUES LESS THAN (600)); Query OK, 0 rows affected (0.21 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> INSERT INTO t1 VALUES(500,'abc'); Query OK, 1 row affected (0.00 sec)
- 客户端1在事务内能够看到新分区数据。
mysql> SELECT * FROM t1 WHERE c1 >= 300; +-----+------+ | c1 | c2 | +-----+------+ | 300 | abc | | 400 | abc | | 500 | abc | +-----+------+ 3 rows in set (0.00 sec)
- 客户端2删除旧分区。
mysql> ALTER TABLE t1 DROP PARTITION p0; Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0
- 客户端1可以看到旧分区已不存在,新分区存在。
mysql> SHOW CREATE TABLE t1\G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int NOT NULL, `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!50100 PARTITION BY RANGE (`c1`) (PARTITION p1 VALUES LESS THAN (200) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (300) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (400) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (500) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN (600) ENGINE = InnoDB) */ 1 row in set (0.00 sec)
- 客户端1提交事务。
mysql> COMMIT; Query OK, 0 rows affected (0.01 sec)
分区级MDL锁功能通过降低DML和DDL过程中获取的锁粒度到分区上,以提升并发性能。在分区维护时,通过performance_schema.metadata_locks表可以查看分区级别的MDL锁获取情况。示例如下:
- 客户端1开启事务。
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM t1 WHERE c1 >= 500; +-----+------+ | c1 | c2 | +-----+------+ | 500 | abc | +-----+------+ 1 rows in set (0.00 sec)
- 客户端1查看MDL锁获取状态。
mysql> SELECT * FROM performance_schema.metadata_locks; +-------------------+--------------------+----------------+-----------------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+ | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID | +-------------------+--------------------+----------------+-----------------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+ | TABLE | test | t1 | NULL | 140082560509056 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:8006 | 69 | 23 | | PARTITION | test | t1 | p5 | 140082560508384 | SHARED_READ | TRANSACTION | GRANTED | sql_lex.cc:5434 | 69 | 23 | | TABLE | performance_schema | metadata_locks | NULL | 140082560511936 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:8006 | 69 | 24 | +-------------------+--------------------+----------------+-----------------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+ 4 rows in set (0.01 sec)
客户端1的事务获得了t1表级的SHARED_READ锁和p5分区级别的SHARED_READ锁。其中,p5分区是实际需要访问分区,通过分区裁剪获得。
- 客户端2删除p5分区。
mysql> ALTER TABLE t1 DROP PARTITION p5;
客户端1正在访问p5分区,且已经获取p5分区级别的SHARED_READ锁,此时客户端2的删除p5分区会被阻塞等待。
- 确认客户端2删除p5分区操作处于阻塞等待中。
mysql> SHOW PROCESSLIST; +----+-----------------+-----------------+------+---------+-------+-------------------------------------------+----------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+------+---------+-------+-------------------------------------------+----------------------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 33127 | Waiting on empty queue | NULL | | 13 | root | localhost:42926 | test | Query | 0 | init | SHOW PROCESSLIST | | 14 | root | localhost:42936 | test | Query | 180 | Waiting for table partition metadata lock | ALTER TABLE t1 DROP PARTITION p5 | | 15 | root | localhost:42938 | test | Sleep | 1542 | | NULL | +----+-----------------+-----------------+------+---------+-------+-------------------------------------------+----------------------------------+ 4 rows in set (0.00 sec)
- 通过客户端1提交事务后,客户端2删除p5分区的操作解除阻塞,执行成功。
mysql> COMMIT; Query OK, 0 rows affected (0.01 sec)
客户端2:
mysql> ALTER TABLE t1 DROP PARTITION p5; Query OK, 0 rows affected (1 min 2.48 sec) Records: 0 Duplicates: 0 Warnings: 0
父主题: 分区表增强