签到成功

知道了

CNDBA社区CNDBA社区

Oracle 18c 必须掌握的新特性 Sharding系列(3) -- Sharding对象说明

2019-10-30 15:27 2546 0 原创 Oracle 18c
作者: dave

在之前的博客,我们了解了Oracle Sharding 的概念和环境搭建,如下:https://www.cndba.cn/cndba/dave/article/3760

Oracle 18c 必须掌握的新特性 Sharding系列(1) — Sharding概述
https://www.cndba.cn/dave/article/3758
Oracle 18c 必须掌握的新特性 Sharding系列(2) — 搭建Sharding环境
https://www.cndba.cn/dave/article/3759

本篇我们继续学习Sharding中的对象。

1 分片表(Shard Table)

  分片表是通过分区技术分成更小、更好管理分片的表。Oracle Sharding是基于Oracle数据库分区特性实现的。Oracle分片本质上是分布式分区,它通过支持跨分片的表分区分布来扩展分区。分区根据分片键来分布到SDB中的各个分片的表空间中。https://www.cndba.cn/cndba/dave/article/3760

  分片键支持如下数据类型:NUMBER / INTEGER / SMALLINT / RAW / (N)VARCHAR / (N)CHAR / DATE / TIMESTAMP。

  分片表的每个分区都存储在单独的表空间中,并且每个表空间都和一个特定的分片相关联。这种分片表对于应用来说是完全透明的,和操作普通的分区表没有任何区别。

https://www.cndba.cn/cndba/dave/article/3760

  以下SQL是通过user_id作为分片键创建分片表的示例。在执行DDL语句之前要先启用 shard DDL(alter session enable shard ddl),然后使用分片用户来执行SQL。

CREATE SHARDED TABLE cndba
( user_id     NUMBER NOT NULL
, name        VARCHAR2(50)
, address     VARCHAR2(250)
, created_date      DATE
CONSTRAINT cust_pk PRIMARY KEY(user_id)
)
PARTITION BY CONSISTENT HASH (user_id)
PARTITIONS AUTO
TABLESPACE SET data1;

  上表是通过一致性哈希来进行分区,这种分区方式可自动跨分片传输表空间,从而来提供数据和负载的均匀分布。注意这里支持本地索引,不支持分片表上的全局索引。https://www.cndba.cn/cndba/dave/article/3760https://www.cndba.cn/cndba/dave/article/3760

这里有两个相关的概念, 先简单了解一下,后面会进一步说明:

1) 表空间集:Sharding将多个表空间作为一个逻辑单元来创建并管理称为表空间集。 PARTITIONS AUTO表示由Oracle来决定分区数量。这种类型的哈希分区对分片之间迁移数据提供了很大的灵活性和更高的效率。
  表空间是SDB中数据分布的逻辑单元。通过在不同分片的表空间中自动创建分区可以实现跨分片的分区分布。为了最小化多个分片之间的连接查询,相关表的相应分区总是存储在同一个分片中。分片表的每个分区存储在不同的表空间中。
2) 块:分片之间的数据移动的单位是块。块是一组表空间,用于存储table family中所有表的相应分区。块包含来自一组相关表的每个表的单个分区。这样就可以一次性移动不同分片表的相关数据。创建SDB时,需要指定每个分片中块的数量。

2 表家族(Table Family)

  表家族是一组以相同方式分片的分片表。通常情况下,表之间存在父子关系,子表的外键引用父表的主键。通过这种关系连接的多个表形成树状结构,其中每个子节点都有单个父节点。在一个表家族中没有父节点的表称为根表(root table)。表家族中只能有一个根表。但截至到目前的18c版本,SDB只支持一个表家族。https://www.cndba.cn/cndba/dave/article/3760

  创建分片表家族的推荐方法是使用参考分区指定表之间的父子关系。看以下示例,首先通过CREATE TABLE语句来创建表家族中的根表: students。

以分片用户连接,并启用shard DDL:
SQL> conn shard_user/oracle
Connected.
SQL> alter session enable shard ddl;
Session altered.
创建表空间集:
SQL> CREATE TABLESPACE SET data1;
Tablespace created.
创建表:
CREATE SHARDED TABLE students
( StuNo      NUMBER NOT NULL
, Name        VARCHAR2(50)
, Sex     VARCHAR2(20)
, class     VARCHAR2(50)
, CONSTRAINT NoPK PRIMARY KEY(StuNo)
)
PARTITION BY CONSISTENT HASH (StuNo)
PARTITIONS AUTO
TABLESPACE SET data1;

下面再创建course表和score表,分别是students表的子表,重子表:https://www.cndba.cn/cndba/dave/article/3760https://www.cndba.cn/cndba/dave/article/3760

CREATE SHARDED TABLE course
( CourseNo   NUMBER NOT NULL
, StuNo    NUMBER NOT NULL
, CONSTRAINT OrderPK PRIMARY KEY (StuNo, CourseNo)
, CONSTRAINT StuFK FOREIGN KEY (StuNo) REFERENCES students(StuNo) 
)
PARTITION BY REFERENCE (StuFK);

CREATE SHARDED TABLE score
( ScoreNo    NUMBER NOT NULL
, CourseNo   NUMBER(2) NOT NULL
, StuNo    NUMBER(5) NOT NULL
, score   NUMBER(4)
, CONSTRAINT LinePK  PRIMARY KEY (StuNo, CourseNo, ScoreNo)
, CONSTRAINT LineFK  FOREIGN KEY (StuNo, CourseNo) REFERENCES Orders(StuNo, CourseNo)
)
PARTITION BY REFERENCE (LineFK);

  上面表家族中的三张表,都会存储data1表空间中,默认和根表存放的表空间一样(继承根表的存储属性),当然也可以指定不同的表空间。
  三张表中都存在分片键StuNo,通常情况下参考分区(reference partitioning)不需要在子表中创建分片键列。但是由于参考分区需要父表中的主键,用来约束子表和父表的主外键关系,因此主键要么是分片键,或者是分片键中的前导列(leading column)。这样才可以确保数据的唯一性。
  另外从建表的SQL语句看,只为students表指定了分区方案,而其他两个表都没有指定分区方案。因为在表家族中,其他两个表会随着的根表的分区变化而变化,例如根表新增了一个分区,那么其他两个子表会自动增加一个分区。

总之,在SDB中使用参考分区表需要满足以下要求:

分片表上的主键必须与分片键相同,或者与分片键中前导列相同。这是保证全局唯一性的必要条件。
引用分区需要父表中的主键,因为必须在子表的外键约束中指定父表的主键。

  在某些情况下,主外键约束对于应用来说比较麻烦,因此Oracle允许在每个表的创建SQL语句中指定PARENT来创建表家族,从而不需要指定主外键约束。例如:

CREATE SHARDED TABLE students
( StuNo      NUMBER NOT NULL
, Name        VARCHAR2(50)
, Sex     VARCHAR2(20) 
, class     VARCHAR2(50) 
)
PARTITION BY CONSISTENT HASH (StuNo)
PARTITIONS AUTO
TABLESPACE SET data1;

CREATE SHARDED TABLE course
( CourseNo   NUMBER NOT NULL
, StuNo    NUMBER NOT NULL
)
PARENT students
PARTITION BY CONSISTENT HASH (StuNo)
PARTITIONS AUTO
TABLESPACE SET data1;

CREATE SHARDED TABLE score
( ScoreNo    NUMBER NOT NULL
, CourseNo   NUMBER(2) NOT NULL
, StuNo    NUMBER(5) NOT NULL
, score   NUMBER(4)
)
PARENT students
PARTITION BY CONSISTENT HASH (StuNo)
PARTITIONS AUTO
TABLESPACE SET data1;

  以上SQL语句不仅去掉了主外键约束,而且每个表都有自己的分区策略和存放的表空间集。但是这种方法只支持两级表家族,也就是父表-子表(所有子表都有同一个父表),没有重子表。

3 复制表(Duplicated Tables)

  除了分片表之外,SDB中还可以在所有分片上存储复制表,这里所谓的复制表,就是每个分片上的数据都是一样的。复制表适用与数量小,只读且读取频繁的表,这样可以最大化单个分片处理的数据库请求数。例如某些数据字典表,数据量很小并且不适合分片。这样在每个分片上都存储完整的数据,可以在单个分片上完成一个查询。

3.1 创建复制表

  创建复制表的方法很简单,在CREATE TABLE语句中指定关键字DUPLICATED即可。

https://www.cndba.cn/cndba/dave/article/3760

CREATE DUPLICATED TABLE courseinfo
(CourseNo   NUMBER PRIMARY KEY
, Name       VARCHAR2(20)
, Grade       VARCHAR2(20));

3.2 更新复制表并同步数据

  Oracle Sharding使用物化视图复制来同步复制表中的数据。每个分片上的复制表实际上是物化视图,物化视图的基表存储在分片目录数据库中。 CREATE DUPLICATED TABLE语句自动创建所需的基表,物化视图和其他对象。
  在Oracle 12c R2中只能在分片目录数据库中更新复制表。而到了Oracle 18c,也可以在分片上执行更新操作。首先将更新的内容传输到分片目录中的主表中,然后再更新到其他分片中。
  所有分片上的物化视图可以配置刷新频率来实现自动刷新。所有复制表的刷新频率由初始化参数SHRD_DUPL_TABLE_REFRESH_RATE控制。该参数的默认值是60秒。

3.3 创建非表(Non-Table)的对象

  除了表之外,其他对象(例如用户,角色,视图,索引,同义词,函数,存储过程)和包以及非模式数据库对象(例如表空间,表空间集,directory和context)都可以在分片上创建。

  以下对象目前不支持自动在所有分片上创建,但是可以分别在分片中单独进行创建:

Cluster
Control file
Database link
Disk group
Edition
Flashback archive
Materialized zone map
Outline
Pfile
Profile
Restore point
Rollback segment
Summaryhttps://www.cndba.cn/cndba/dave/article/3760

4 块(Chunk)

  块的概念和表家族密不可分。因为表家族之间的各个表都是有关系的,我们把某个表家族的一组分区称作一个 块。

  因为表家族中的每个表都可以有自己的表空间集,比如表CNDBA的表空间集是TS1,表Users的表空间集是TS2,为了保证表家族中CNDBA表P1分区对应的表空间和Users表P1分区对应表空间存放在同一个分片上,引入了块的概念,块就是表家族中所有表对应分区的集合,这样可以相应的分区都在同一个分片中,避免了跨分片的链接查询。在进行re-sharding 的时候,是以块为单位进行移动。

下面通过一个图来说明SDB中各个组件之间的对应关系。

  SDB是由多个分片(独立的数据库)组成,每个分片是由一个或多个块组成,每个块是由多个表空间组成,表空间也是由多个表分区组成。这里注意表空间和表分区之间的关系,同一个表的不同分区一定是存储在不同的表空间中。
  块就是由一组分区组成的,如下图:每个块包含了不同表的分区。

  每个分片包含多个块,如下图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2239
    原创
  • 3
    翻译
  • 547
    转载
  • 186
    评论
  • 访问:6666342次
  • 积分:4249
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ