如果您在不同位置安装了多个运行相同应用程序的数据库,并且想要包括所有数据库中的数据,例如要运行数据分析查询,则可以将独立数据库合并为分片数据库,而无需修改数据库模式或应用程序。
一、联合分片介绍
1、关于联合分片
联合分片是一种Oracle分片配置,其分片由具有相似架构的独立数据库组成。
通过独立数据库创建分片数据库,减少了将大量数据导入单个位置进行数据分析的需求。
此方法的以下好处:
您可以创建联合分片配置,其中分片之间的版本可以不是同一个版本。例如,一个区域可以在Oracle数据库20.2上,而另一个区域可以在Oracle数据库20.3上。但是所有数据库分片和分片目录必须在Oracle Database 20c或更高版本上。
2、联合分片架构要求
可以将运行同一应用程序的现有数据库转换为联合分片配置,而无需修改数据库架构或应用程序。
但是,数据库必须具有相同的表结构或较小的差异。例如,一个表在一个数据库中可以有一个额外的列。
应用程序升级可以触发架构中的更改,例如,当添加新表、新列、新检查约束或修改列数据类型时。当属于整体联合分片配置的一部分时,只要整体模式结构保持不变,Oracle分片将处理由应用程序升级引起的结构差异。
3、联合分片配置中的分片和重复表
每个联合数据库上具有不同数据集的表等同于传统分片数据库中的分片表。在所有联合数据库上具有相同内容的表等同于传统分片数据库中的重复表。
在创建联合分片配置时,系统假定所有表都已分片,因此必须显式标记多分片查询协调器必须将其视为重复的表。
4、联合分片的局限性
联合分片配置中没有块的概念,因此不支持GDSCTL MOVE CHUNK命令。
不支持基于应用程序分片键的路由。
在将现有数据库添加到联合分片配置之前,必须将其升级到Oracle Database 20c或更高版本。
5、联合分片安全
数据库用户不需要在所有联合数据库上都存在,但是架构所有者应该在所有数据库上都存在。这些架构所有者的特权和密码可以不同。为了安全起见,仅授予普通特权。
二、创建和部署联合分片配置
要使用现有数据库部署联合分片环境,您可以使用 GDSCTL 命令像定义用户分片一样定义数据库布局。
以下是对创建和部署联合分片配置的过程:
SQL ALTER TABLE
将跨联合分片包含相同数据的表转换为重复表。1、创建联合分片配置
GDSCTL 命令 CREATE SHARDCATALOG 在创建联合分片配置中的用法与在用户定义的分片中用于创建分片目录的方式相似,不同之处在于,您可以使用 FOR_FEDERATED_DATABASE 选项代替在 SHARDING 参数中指定分片方法。 也就是说,FOR_FEDERATED_DATABASE 选项与 SHARDING 选项互斥。
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 语法说明了该操作的三个阶段。
sync[hronize] schema
[-schema [schemalist | all] [-retrieve_only] [-restart [-force]]
| -apply [-skip_first]
| -show [[-ddl ddlnum] [-count n] | [-failed_only]]]
SYNC DDL 分阶段运行。
sync schema -schema schemalist –retrieve_only
在不使用 -retrieve_only 的情况下运行 SYNC SCHEMA 时,将同时检索和应用DDL。
您可以使用 -show
选项检查DDL语句及其执行状态。 -ddl ddlnum 选项显示指定的DDL,-count n
选项指定要显示的最大条目数。
sync schema –show -ddl ddlnum -count n
或者,您可以使用 -failed_only 选项仅检查错误的语句。
sync schema –show -failed_only
在最后阶段,您在分片目录上运行DDL以创建模式及其对象。
sync schema –apply
如果您在应用阶段遇到错误,则有两种解决方法:
出于安全原因,Oracle分片不提供编辑DDL的方法。
如果架构稍后有更改,则可以再次运行之前的阶段以导入增量更改。例如,当添加新对象或向表中添加新列时,这将生成ALTER TABLE ADD语句。
3、将表转换为重复表
使用 ALTER TABLE table_name externally duplicated 将表标记为在联合分片配置中复制的表。
多分片查询层将 SYNC SCHEMA 创建的任何表视为外部分片表。如果表在所有分片上都包含相同的数据,则可以将表更改为外部复制,以便多分片查询仅从一个分片中检索数据,即使它是对没有过滤谓词的表的查询 在 ORA_SHARDSPACE_NAME 上。
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 的订单的客户,可以编写类似于以下内容的查询。
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’