【笔记】开发指南—透明分布式—变更表类型及拆分规则

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: PolarDB-X新增支持变更表的类型(即在单表、拆分表和广播表三者间进行相互转换),和变更拆分表的拆分规则(包括拆分函数或拆分列)。本文介绍相关语法和示例。

前提条件

  • 仅内核小版本为5.4.8或以上的PolarDB-X实例支持变更拆分表的拆分规则。
  • 仅内核小版本为5.4.10或以上的PolarDB-X实例支持变更表的类型(即在单表、拆分表和广播表三者间进行相互转换)。

如何查看实例版本,请参见查看实例版本

注意事项

  • 暂不支持变更带有GSI的拆分表的拆分规则。
  • 表属性变更后,主键拆分表将变成普通表(即不再适用原主键拆分表中的自动拆分规则或索引转换规则)。更多详情,请参见主键拆分
  • 若单表设置了自增列,在变更为广播表或拆分表时,需提前为该表创建Sequence。如何创建Sequence,请参见显式用法
  • 本文中关于变更拆分表、广播表和单表的表类型示例,均在单表t_order的基础上进行变更,t_order表的创建语句如下:
CREATE TABLE t_order (

`id` bigint(11) NOT NULL AUTO_INCREMENT BY GROUP,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表类型

PolarDB-X实例支持3种类型的表:拆分表、广播表和单表。您可以通过ALTER TABLE语句在拆分表、广播表和单表间进行转换,同时还能对拆分表的拆分规则进行变更。3..png

  • 拆分表使用drds_partition_options子句进行拆分的表。drds_partition_options可以是如下分库或分表子句:
drds_partition_options:
DBPARTITION BY db_partition_algorithm
[TBPARTITION BY table_partition_algorithm [TBPARTITIONS number]]
  • 其中:
    • db_partition_algorithm支持如下函数:
db_partition_algorithm:
HASH([col_name])
| {YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
    • table_partition_algorithm支持如下函数:
table_partition_algorithm:
HASH(col_name)
| {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
  • 广播表通过BROADCAST子句创建的表,系统会将该表复制到每个分库上,并通过分布式事务实现数据一致性。更多详情,请参见广播表

  • 单表未进行任何拆分或未指定BROADCAST子句的表。更多详情,请参见单库单表

单表或广播表变为拆分表

  • 语法
ALTER TABLE table_name drds_partition_options;
  • 说明
    • 更多关于drds_partition_options的信息,请参见表类型
    • 若单表设置了自增列,在变更为拆分表时,需提前为该表创建Sequence。如何创建Sequence,请参见显式用法
  • 示例因业务扩展,单表t_order无法承载日益增长的数据。此时,您可以使用如下语句将该单表变更为拆分表(以order_id为拆分键):
ALTER TABLE t_order dbpartition BY hash(`order_id`);

单表或拆分表变为广播表

  • 语法
ALTER TABLE table_name BROADCAST;

  • 说明 若单表设置了自增列,在变更为广播表时,需提前为该表创建Sequence。如何创建Sequence,请参见显式用法
  • 示例您可以使用如下语句将单表或拆分表t_order变更为广播表:
ALTER TABLE t_order BROADCAST;

广播表或拆分表变为单表

  • 语法
ALTER TABLE table_name SINGLE;
  • 示例您可以使用如下语句将广播表或拆分表t_order变更为单表:
ALTER TABLE t_order SINGLE;

变更拆分表的拆分规则

  • 语法
ALTER TABLE tbl_name drds_partition_options;
  • 示例假设已使用如下语句在PolarDB-X数据库中创建了一张拆分表t_order(根据order_id列进行库级拆分):
CREATE TABLE t_order (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition BY hash(`order_id`);
  • 现需要对t_order表的拆分规则作出如下变更:
    • 根据order_id列进行库级拆分。
    • buyer_id列做表级拆分。
    • 每个分库包含3个分表。
  • 您可以使用如下语句实现上述变更:
ALTER TABLE t_order dbpartition BY hash(order_id) tbpartition BY hash(buyer_id) tbpartitions 3;

相关文档

拆分规则变更后,您可以通过如下命令查看表的拆分规则或拓扑结构:

常见问题

Q:为什么有时拆分键变更的DDL任务会执行失败?此时该如何处理?

A:实例崩溃或唯一索引存在冲突等因素会导致拆分规则变更的DDL任务执行失败。但这不会损坏原表任何数据,也不会阻塞正常的DML和查询语句执行。当拆分键变更的DDL任务执行失败时,您可以通过ROLLBACK DDL命令回滚该任务,然后再次尝试变更。关于ROLLBACK DDL命令的详情,请参见回滚任务


说明 暂不支持通过RECOVER DDL命令恢复执行失败的拆分键变更任务。

相关实践学习
跟我学:如何一键安装部署 PolarDB-X
《PolarDB-X 动手实践》系列第一期,体验如何一键安装部署 PolarDB-X。
相关文章
|
3月前
|
监控 负载均衡 Dubbo
|
7月前
|
缓存 算法 架构师
阿里P9架构师终于把毕生心血而成的分布式高可用算法笔记开源了
说在前面的话 分布式系统无处不在。 一台计算机内部多个互联的处理器组成了一个分布式系统,它们通过“一致性缓存”算法使每个处理器核心看到相同的数据。近三十年来,随着互联网的发展,越来越多的互联网后台系统采用计算机集群的方式来应对海量请求和数据的需求,这个计算机集群也是分布式系统。 为了简化分布式系统的开发,出现了很多为开发者提供分布式框架的开源项目,例如Apache基金会旗下的ZooKeeper项目就是一个应用广泛的分布式框架。 同时,国内也有很多关于如何使用这些分布式框架来搭建应用的书籍,它们极大地推动了分布式系统在国内的应用。我们不仅要知道如何使用这些现成的分布式框架来搭建应用,而且应
|
4月前
|
达摩院 Java Apache
惊动“达摩院”的分布式架构笔记:火于互联网,据说来自于清华
一个星期前,一本Java架构笔记突然在互联网上爆火。因为内容的深度和广度,甚至连阿里最牛的研发中心都被惊动了,而且作者一周后直接被阿里挖走后定级P8,据说作者来自于清华。
|
4月前
|
存储 NoSQL 算法
redis存储什么类型的数据?redis分布式锁怎么实现的?
redis存储什么类型的数据?redis分布式锁怎么实现的?
|
4月前
|
Dubbo Java 应用服务中间件
已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有
程序员,立之根本还是技术,一个程序员的好坏,虽然不能完全用技术强弱来判断,但是技术水平一定是基础,技术差的程序员只能CRUD,技术不深的程序员也成不了架构师。程序员对于技术的掌握,除了从了解-熟悉-熟练-精通的过程以外,还应该从基础出发,到进阶,到源码,到实战。所以,程序员想要成功,首先要成就自己。
|
4月前
|
Java 数据库连接 应用服务中间件
32天高效突击:框架+性能优化+微服务+分布式,笔记面试全有
今年似乎因为疫情影响,时间过得特别快,对于需要跳槽换工作的人来,更觉得有些突然,似乎金三银四和金九银四还没开始准备好,就匆匆过去。加上今年的大环境不佳,所以大部分的人在今年的招聘旺季都没有收获到好的结果。
|
5月前
|
消息中间件 存储 缓存
分布式实时消息队列Kafka(三)生产分区规则
分布式实时消息队列Kafka(三)生产分区规则
39 0
分布式实时消息队列Kafka(三)生产分区规则
|
5月前
|
缓存 分布式计算 NoSQL
分布式NoSQL列存储数据库Hbase_MR集成Hbase:读写Hbase规则(九)
分布式NoSQL列存储数据库Hbase_MR集成Hbase:读写Hbase规则(九)
38 0
|
5月前
|
存储 NoSQL Redis
黑马点评笔记 分布式锁(二)
黑马点评笔记 分布式锁
39 0
|
5月前
|
NoSQL 安全 关系型数据库
黑马点评笔记 分布式锁(一)
黑马点评笔记 分布式锁
60 0