数据库管理247期 2024-10-04
- 数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)
- 1 分区、表空间和Chunk(块)
- 2 表空间组
- 3 分片表
- 4 分片表族
- 5 复制表
- 6 在所有分片上创建的非表对象
- 总结
数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭
前面起的坑,现在继续挖。
为了充分利用Oracle全球分布式数据库中的好处,分片数据库的schema的设计应该最大限度的将数据库请求在单个分片上执行。
1 分区、表空间和Chunk(块)
通过在不同分片上的表空间中创建分区,实现了分片之间的分区分布。分片表的每个分区都存储在单独的表空间中,使表空间成为分片数据库中的数据分布单元。
如Sharded Table Family(分片表族)中所述,为了尽量减少多分片join的数量,表族中所有表的相应关联分区数据应当始终存储在同一分片中。当表族中的表在同一组分布式表空间中创建时,这是有保证的,如语法示例所示,其中表空间集ts1用于所有表。
但是,可以从不同表空间集中的表族创建不同的表,例如表空间集ts1中的Customers表和表空间集ts2中的Orders表。在这种情况下,必须保证存储Customers分区1的表空间始终与存储Orders分区1的表格空间位于同一分片中。
为了支持此功能,会形成一组来自表族中所有表的相应分区,称为块(Chunk)。块包含表族中每个表的单个分区。这保证了来自不同分片表的相关数据可以一起移动。换句话说,块是分片之间数据迁移的单位。在系统管理和复合分片中,创建分片数据库时指定每个分片内的块数。在用户定义的分片中,块的总数等于分区的数量。
下图显示了一个块,其中包含Cutomers-Orders-LineItems模式表中的相应分区。
除了分片表外,分片还可以包含单个或多个重复的表。重复的表不能存储在用于分片表的表空间中。
2 表空间组
Oracle全球分布式数据库将多个表空间作为一个称为TABLESPACE SET(表空间组)的单元进行创建和管理。
系统管理和复合分片使用表空间组,而用户定义的分片使用常规表空间。表空间是分片数据库中数据分布的逻辑单元。
PARTITIONS AUTO子句指定应自动确定分区的数量。这种类型的哈希在分片之间迁移数据时提供了更大的灵活性和效率,这对弹性可扩展性非常重要。每个表空间集创建的表空间数量取决于部署期间为共享空间定义的块的数量。
3 分片表
数据库表被拆分在分片之间,这样每个分片都包含具有相同列但行子集不同的表。以这种方式分割的表称为分片表。
下图显示了左侧一个数据库中显示的一组大型表(称为表族)如何在右侧显示的三个分片上水平分区,以便每个分片包含数据的一个子集,用红色、黄色和蓝色行表示。
分区基于分片键(Sharing key)在表空间级别跨分片分布。密钥的示例包括客户ID、帐号和国家ID。分片键支持以下数据类型:
- NUMBER
- INTEGER
- SMALLINT
- RAW
- (N)VARCHAR
- (N)VARCHAR2
- (N)CHAR
- DATE
- TIMESTAMP
分片表的每个分区都位于一个单独的表空间中,每个表空间都与一个特定的分片相关联。根据分片方法,可以自动建立关联或由管理员定义关联。
即使分片表的分区位于多个分片中,对于应用程序来说,该表的外观和行为与单个数据库中的分区表完全相同。应用程序发出的SQL语句永远不必引用分片,也不必依赖于分片的数量及其配置。
熟悉的表分区SQL语法指定了如何在分片之间分区行。例如,以下SQL语句创建了一个分片表,根据分片键cust_id在分片之间水平划分表。
CREATE SHARDED TABLE customers
( cust_id NUMBER NOT NULL
, name VARCHAR2(50)
, address VARCHAR2(250)
, region VARCHAR2(20)
, class VARCHAR2(3)
, signup DATE
,CONSTRAINT cust_pk PRIMARY KEY(cust_id)
)
PARTITION BY CONSISTENT HASH (cust_id)
PARTITIONS AUTO
TABLESPACE SET ts1
;
上面示例分片表由一致哈希进行分区,这是一种特殊类型的哈希分区,通常用于可扩展的分布式系统。此技术自动将表空间分散到分片上,以提供数据和工作负载的均匀分布。
4 分片表族
分片表族是一组以相同方式分片的表。通常,数据库表之间存在父子关系,子表(外键)中的引用约束引用父表的主键。
通过这种关系链接的多个表通常形成树状结构,其中每个子表都有一个父表。一组这样的表称为表族。表族中没有父表的表称为根表。一个表族中只能有一个根表。
这里用客户-订单-行项目模式说明了表族的分割。在分片之前,模式中的表可能如下面的示例所示。这三个表具有父子关系,其中Customers是根表。下面是分片前的表数据:
Customers Table (Root)
CustNo Name Address Location Class
--------- ---------- -------------- --------- ------
123 Brown 100 Main St us3 Gold
456 Jones 300 Pine Ave us1 Silver
999 Smith 453 Cherry St us2 Bronze
Orders Table
OrderNo CustNo OrderDate
--------- -------- -----------
4001 123 14-FEB-2013
4002 456 09-MAR-2013
4003 456 05-APR-2013
4004 123 27-MAY-2013
4005 999 01-SEP-2013
LineItems Table
LineNo OrderNo CustNo StockNo Quantity
------ ------- ------ ------- --------
40011 4001 123 05683022 1
40012 4001 123 45423609 4
40013 4001 123 68584904 1
40021 4002 456 05683022 1
40022 4002 456 45423509 3
40022 4003 456 80345330 16
40041 4004 123 45423509 1
40042 4004 123 68584904 2
40051 4005 999 80345330 12
这些表可以通过Customers表中的客户编号CustNo进行分片,该客户编号是根。包含与客户123相关的数据的分片如以下示例表所示:
Customers Table (Root)
CustNo Name Address Location Class
--------- ---------- -------------- ---------- ------
123 Brown 100 Main St us3 Gold
Orders Table
OrderNo CustNo OrderDate
--------- -------- -----------
4001 123 14-FEB-2013
4004 123 27-MAY-2013
LineItems Table
LineNo OrderNo CustNo StockNo Quantity
------ ------- ------ ------- --------
40011 4001 123 05683022 1
40012 4001 123 45423609 4
40013 4001 123 68584904 1
40041 4004 123 45423509 1
40042 4004 123 68584904 2
这些客户123的相关数据就会被分配到一个分片内,可以避免关联数据的跨分片查询。
5 复制表
在Oracle全球分布式数据库中,每个分片中内容相同的表称为复制表。
分片数据库既包括跨分片水平分区的分片表,也包括复制到所有分片的复制表。对于不经常更新且经常与分片表一起访问的相对较小的表,复制表是一个不错的选择。因此,复制表通常包含引用信息,例如,每个分片共用的Stock Items表。
对于许多应用程序,通过在所有分片上复制只读或只读表,可以最大限度地增加单个分片处理的数据库请求数量。分片表和复制表的组合使得与分片键相关的所有事务都可以由单个分片处理。该技术实现了线性可扩展性和故障隔离。
作为需要复制表的示例,请考虑“分片表族”中描述的表族。此数据库模式还可能包括一个Products表,该表包含为此表系列创建的分片中所有客户共享的数据,并且不能按客户编号进行分片。为了防止订单处理过程中的多分片查询,可以在分片数据库中的所有分片上复制整个表。
分片表(Customers、Orders、Line Items)和重复表(Products)之间的区别如下图所示。
在上图中,Customers、Orders、Line Items都由客户ID号分为三个分片,如图顶部每个表中行的颜色和每个分片中分片表的相应颜色所示。以灰色显示的复制表Products被完整地复制到所有分片,如表中指向三个分片的箭头所示。
6 在所有分片上创建的非表对象
在Oracle全球分布式数据库中,除表以外,还有其他的schema对象,如用户、角色、视图、索引、同义词、函数过程和包,以及一些非schema对象,如表空间、表空间组、目录和上下文。这些对象可以在所有分片上创建。
与表不同,表在CREATE语句中需要一个额外的关键字——SHARDED或DUPLICATED——其他对象是使用现有语法在所有分片上创建的。唯一的要求是必须启用SHARD DDL会话属性。
请注意,当前版本不支持在以下对象的所有分片上自动创建。这些对象可以通过连接到单个分片来创建:
- Cluster
- Control file
- Database link
- Disk group
- Edition
- Flashback archive
- Materialized zone map
- Outline
- Pfile
- Profile
- Restore point
- Rollback segment
- Summary
从18c开始,支持物化视图和视图日志,但有以下限制:
- 在分片表上创建的物化视图在目录数据库中保持为空,而分片上的相应物化视图包含来自每个单独分片的数据。
- 对于分片表上的物化视图,仅支持REFRESH COMPLETE ON DEMAND USING TRUSTED CONSTRAINTS选项。
总结
本期简单介绍了23ai:全球分布式数据库-Schema对象相关内容。
老规矩,知道写了些啥。