前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle 20c新特性:从多个现有数据库创建分片数据库(联合分片)

Oracle 20c新特性:从多个现有数据库创建分片数据库(联合分片)

作者头像
Grainger
发布2022-04-24 09:50:48
1.4K0
发布2022-04-24 09:50:48
举报
文章被收录于专栏:数据与未来数据与未来

如果您在不同位置安装了多个运行相同应用程序的数据库,并且想要包括所有数据库中的数据,例如要运行数据分析查询,则可以将独立数据库合并为分片数据库,而无需修改数据库模式或应用程序。

一、联合分片介绍

1、关于联合分片

联合分片是一种Oracle分片配置,其分片由具有相似架构的独立数据库组成。

通过独立数据库创建分片数据库,减少了将大量数据导入单个位置进行数据分析的需求。

此方法的以下好处:

  • 使用现有的地理分布数据库创建分片环境,无需置备新的系统
  • 运行多分片查询,在单个查询中从多个位置访问数据 在联合分片配置中,Oracle Sharding将每个独立数据库视为一个分片,因此可以对这些分片发出多分片查询。

您可以创建联合分片配置,其中分片之间的版本可以不是同一个版本。例如,一个区域可以在Oracle数据库20.2上,而另一个区域可以在Oracle数据库20.3上。但是所有数据库分片和分片目录必须在Oracle Database 20c或更高版本上。

2、联合分片架构要求

可以将运行同一应用程序的现有数据库转换为联合分片配置,而无需修改数据库架构或应用程序。

但是,数据库必须具有相同的表结构或较小的差异。例如,一个表在一个数据库中可以有一个额外的列。

应用程序升级可以触发架构中的更改,例如,当添加新表、新列、新检查约束或修改列数据类型时。当属于整体联合分片配置的一部分时,只要整体模式结构保持不变,Oracle分片将处理由应用程序升级引起的结构差异。

3、联合分片配置中的分片和重复表

每个联合数据库上具有不同数据集的表等同于传统分片数据库中的分片表。在所有联合数据库上具有相同内容的表等同于传统分片数据库中的重复表。

在创建联合分片配置时,系统假定所有表都已分片,因此必须显式标记多分片查询协调器必须将其视为重复的表。

4、联合分片的局限性

联合分片配置中没有块的概念,因此不支持GDSCTL MOVE CHUNK命令。

不支持基于应用程序分片键的路由。

在将现有数据库添加到联合分片配置之前,必须将其升级到Oracle Database 20c或更高版本。

5、联合分片安全

数据库用户不需要在所有联合数据库上都存在,但是架构所有者应该在所有数据库上都存在。这些架构所有者的特权和密码可以不同。为了安全起见,仅授予普通特权。

二、创建和部署联合分片配置

要使用现有数据库部署联合分片环境,您可以使用 GDSCTL 命令像定义用户分片一样定义数据库布局。

以下是对创建和部署联合分片配置的过程:

  1. 使用 FOR_FEDERATED_DATABASE 选项运行 GDSCTL CREATE SHARDCATALOG 命令以创建联合分片配置
  2. 将分片控制器添加到配置中。
  3. 向配置添加一个分片空间。碎片空间定义为现有数据库及其副本。
  4. 通过将现有数据库添加到分片空间来添加分片,然后运行部署。
  5. 运行 GDSCTL SYNC SCHEMA 来比较联合分片配置中的架构,并检索公用的共享架构。使用 SYNC SCHEMA 检查和应用DDL。
  6. 在分片目录上使用 SQL ALTER TABLE 将跨联合分片包含相同数据的表转换为重复表。
  7. 在联合分片配置中为多分片查询准备分片。

1、创建联合分片配置

GDSCTL 命令 CREATE SHARDCATALOG 在创建联合分片配置中的用法与在用户定义的分片中用于创建分片目录的方式相似,不同之处在于,您可以使用 FOR_FEDERATED_DATABASE 选项代替在 SHARDING 参数中指定分片方法。 也就是说,FOR_FEDERATED_DATABASE 选项与 SHARDING 选项互斥。

代码语言:javascript
复制
CREATE SHARDCATALOG -DATABASE connect_identifier
  [-USER username[/password]]
  [-REGION region_name_list]
  [-CONFIGNAME config_name]
  [-AUTOVNCR ON/OFF]
  [-FORCE]
  [-SDB sdb_name]
  [-SHARDSPACE shardspace_name_list]
  -FOR_FEDERATED_DATABASE

上面的 CREATE SHARDCATALOG 语法语句显示了支持哪些参数。与 FOR_FEDERATED_DATABASE 分片方法一起使用时,不支持未显示的参数,例如–AGENT_PASSWORD, REPFACTOR和Oracle Data Guard保护模式 PROTECTMODE。

2、检索、检查和应用DDL

分阶段运行 GDSCTL SYNC SCHEMA 命令,以创建分片目录中现有数据库共有的模式对象。

此处显示的 GDSCTL SYNC SCHEMA 语法说明了该操作的三个阶段。

代码语言:javascript
复制
sync[hronize] schema
  [-schema [schemalist | all] [-retrieve_only] [-restart [-force]]
 | -apply [-skip_first]
 | -show [[-ddl ddlnum] [-count n] | [-failed_only]]]

SYNC DDL 分阶段运行。

  • 检索阶段 使用 -retrieve_only 选项运行 SYNC SCHEMA,以在DDL在分片目录上运行之前检查并验证DDL。
代码语言:javascript
复制
sync schema -schema schemalist –retrieve_only

在不使用 -retrieve_only 的情况下运行 SYNC SCHEMA 时,将同时检索和应用DDL。

  • 检验阶段

您可以使用 -show 选项检查DDL语句及其执行状态。 -ddl ddlnum 选项显示指定的DDL,-count n 选项指定要显示的最大条目数。

代码语言:javascript
复制
sync schema –show -ddl ddlnum -count n

或者,您可以使用 -failed_only 选项仅检查错误的语句。

代码语言:javascript
复制
sync schema –show -failed_only
  • 应用阶段

在最后阶段,您在分片目录上运行DDL以创建模式及其对象。

代码语言:javascript
复制
sync schema –apply

如果您在应用阶段遇到错误,则有两种解决方法:

  • 如果可以解决导致错误的原因,请修复并重试 SYNC SCHEMA -apply,重试失败的DDL。
  • 如果DDL无法固定或不需要,则可以运行 SYNC SCHEMA –apply -skip_first,从DDL故障点开始恢复应用阶段。

出于安全原因,Oracle分片不提供编辑DDL的方法。

  • 导入增量更改

如果架构稍后有更改,则可以再次运行之前的阶段以导入增量更改。例如,当添加新对象或向表中添加新列时,这将生成ALTER TABLE ADD语句。

3、将表转换为重复表

使用 ALTER TABLE table_name externally duplicated 将表标记为在联合分片配置中复制的表。

多分片查询层将 SYNC SCHEMA 创建的任何表视为外部分片表。如果表在所有分片上都包含相同的数据,则可以将表更改为外部复制,以便多分片查询仅从一个分片中检索数据,即使它是对没有过滤谓词的表的查询 在 ORA_SHARDSPACE_NAME 上。

代码语言:javascript
复制
ALTER TABLE table_name [externally duplicated | externally sharded]

4、准备分片以进行多分片查询

创建所有分片用户,并使用 ORA_SHARDSPACE_NAME 伪列对特定分片执行查询。

  • 所有分片用户

从分片目录运行多分片查询之前,必须创建所有分片用户并授予他们对分片和重复表的访问权限。这些用户及其特权应在启用了分片DDL的分片目录中创建。

  • 创建特定于分片空间的查询

联合分片中的分片空间是一个由主分片和零个或多个备用分片组成的集合。为了过滤特定分片[space]的查询结果,向每个外部分片表(externally sharded)中添加了一个名为 ORA_SHARDSPACE_NAME 的伪列。表中此伪列的值是分片空间的名称。

根据 MULTISHARD_QUERY_DATA_CONSISTENCY 的值,可以从主空间或分片空间中的任何备用数据库中获取行。要对给定的分片运行多分片查询,可以使用谓词 ORA_SHARDSPACE_NAME = shardspace_name_shard_belongs_to 筛选查询。

SELECT CUST_NAME, CUST_ID FROM CUSTOMER,这样的查询在所有分片上运行,其中表CUSTOMER被标记为外部分片。

诸如 SELECT CUST_NAME, CUST_ID FROM CUSTOMER WHERE ora_shardspace_name = ‘EUROPE’ ,在属于欧洲 shardspace_name 的分片上运行。根据 MULTISHARD_QUERY_DATA_CONSISTENCY 参数值,查询将在欧洲分片空间的主分片或其备用数据库上运行。

您可以连接来自不同分片空间的分片表。例如,要在 shardspace NA 中找到来自 shardspace Europe 的订单的客户,可以编写类似于以下内容的查询。

代码语言:javascript
复制
SELECT order_id, customer_name FROM customers c , orders o WHERE c.cust_id = o.cust_id and
c.ora_shardspace_name = ‘Europe’ and o.ora_shardspace_name = ‘NA’
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档