一、In-Memory and Active Data Guard
在Active Data Guard上部署列式存储的目的
可以选在在主库、备库或者两者同时部署列式存储。当在主备库上同时部署了列式存储的时候,可以在两个库上对相同或者不同的对象集做操作,如果是操作不同的对象集,那就相当于增加了In-Memory的存储大小。
在主备库上部署同样的In-Memory。
在最简单的情况下,主数据库和备用数据库都包含具有相同大小(不是必需的)的IM列存储。 IM列存储包含相同的对象。
此方案的优点是分析查询可以访问任一数据库上的IM列存储。 因此,可以将分析查询定向到备用数据库,而不消耗主数据库上的资源。主数据库用于支持事务工作负载,备用数据库支持分析工作负载。
实现方案如下:
1、在主数据库实例和备用数据库实例上设置INMEMORY_SIZE初始化参数。
2、确保备用数据库实例上的INMEMORY_ADG_ENABLED初始化参数设置为true(默认值)。
3、在要填充到两个IM列存储中的所有对象上设置INMEMORY属性。
如果更改对象的INMEMORY属性,则主数据库将更改传播到备用数据库。 例如,如果在销售表上设置NO INMEMORY属性,那么两个IM列存储都会逐出销售。
在主数据库上,可以启用表的一部分列以填充到IM列存储中。还可以为不同的列指定不同的压缩级别。启用特定列涉及字典更改。 主数据库上的DDL将传播到Oracle Active Data Guard数据库。
只在standby 库上部署列存储
在此方案中,IM列存储存在于备用数据库中,但不存在于主数据库中。
在这种情况下,主数据库可以充当纯OLTP数据库。在IM列存储的主数据库中不需要额外的内存。可以将分析报告应用程序引导到备用数据库,而不会牺牲性能或消耗主数据库上的资源。
实现方案如下:
1、将备用数据库实例中的INMEMORY_SIZE初始化参数设置为非零值,并在主数据库实例中将其设置为0。
2、确保备用数据库实例上的INMEMORY_ADG_ENABLED初始化参数设置为true(默认值)。
3、使用要在备用数据库中的IM列存储中填充的所有对象的DISTRIBUTE FOR SERVICE子句设置INMEMORY属性。
例如,如果登录到主数据库,并且如果在shsales表上设置INMEMORY属性,则该表将不会填充到主数据库上的IM列存储中 - 因为没有IM列存储这个数据库。但是,备用数据库将继承sh.sales表上的INMEMORY属性。该表将填充在备用数据库中的IM列存储中。
主库IN-MEMORY和备库IN-MEMORY存储不同对象
最灵活的场景是单独配置主数据库和备用数据库的IM列存储。
此方案的优点是您可以在每个数据库中运行不同的工作负载。 例如,HR应用程序在主数据库中运行报告,而销售历史记录应用程序在备用数据库中运行报告。 因此,两个数据库都没有承担分析报告的全部负载。
实现方案如下:
1、在备用数据库和主数据库实例上将INMEMORY_SIZE初始化参数设置为非零值。 这些值不需要相同。
2、确保备用数据库实例上的INMEMORY_ADG_ENABLED初始化参数设置为true(默认值)。
3、对要在两个IM列存储中填充的所有对象设置INMEMORY ... DISTRIBUTE FOR SERVICE子句。 服务指定填充对象的实例。
对应的三种服务:
在以上三种典型的配置中,将会创建三种服务:仅备用,仅主用、主用和备用三种服务。 例如,如果需要主实例中最近一个月的销售事实表数据,而备用实例中存储前一个月的销售数据。 则需要在两个实例中填充维度表。 对于每个销售分区,可以使用INMEMORY ... DISTRIBUTE FOR SERVICE指定备用或主要服务。 对于每个维度表,指定包括主数据库实例和备用数据库实例的服务。
注:在Oracle RAC中,可以将用于指定用于填充的实例的FOR SERVICE子句与控制IMCU分发的DISTRIBUTE AUTO或DISTRIBUTE BY子句组合。 但是,在Oracle Active Data Guard中,FOR SERVICE子句指定要在其中填充指定对象的主实例或备用实例:您不能使用DISTRIBUTE AUTO或DISTRIBUTE BY在主实例和备用实例之间分发IMCU。 例如,不能在主实例和备用实例之间划分销售表的总体,因此一半的IMCU位于主实例中,一半的IMCU位于备用实例中。
二、How IM Column Stores Work in Oracle Active Data Guard
在Oracle Active Data Guard环境中,对象级别PRIORITY属性控制填充。 仅在服务处于活动状态的数据库实例中填充对象。
用户是基于优先级的按需,取决于PRIORITY值。 当发生角色更改或切换时,数据库根据服务最新映射到的数据库实例集合重新填充表。
下图说明了使用主数据库中的重做更新备用数据库的内部机制。
实现方案如下:
1、主数据库生成重做,然后将重做传输到备用数据库。
2、在主数据库上为所有DML语句生成的重做包括指示是否对INMEMORY对象进行更改的元数据。
3、备用数据库将重做应用于存储在磁盘中的数据块。
4、由于备用数据库将正在进行的操作生成的重做应用于主数据库,备用数据库使它们在事务上保持一致。
5、如果修改了INMEMORY对象,则备用数据库将使用事务日志和快照元数据单元(SMU)来跟踪更改,从而使已修改的行无效,就像在主数据库上一样。
重新填充机制在备用数据库中的工作方式与在主数据库中相同。 当对象上发生足够的DML以达到内部阈值时,备用数据库会重新填充IM列存储中的对象。
三、Configuring IM Column Stores in an Oracle Active Data Guard Environment
在Oracle Active Data Guard中配置IM列存储需要设置INMEMORY_SIZE,并为要填充的对象正确设置INMEMORY属性。此任务需要充分了解Oracle Active Data Guard的概念和过程。
必须满足以下要求:
COMPATIBLE设置必须为12.2.0或更大。
要填充每个数据库中的不同对象,请配置相应的服务。
要在Oracle Active Data Guard环境中配置IM列存储:
1、在将包含IM列存储的数据库实例上设置INMEMORY_SIZE初始化参数。
请遵循以下准则:
要在主数据库和备用数据库上配置IM列存储,请在两个数据库实例上设置INMEMORY_SIZE。
要仅在备用数据库上配置IM列存储,请在备用数据库实例上设置INMEMORY_SIZE。
2、确保备用数据库实例上的INMEMORY_ADG_ENABLED初始化参数设置为true(默认值)。
3、在主数据库上,使用INMEMORY属性执行DDL语句。
任务取决于IM列存储的存在位置,以及是否在每个IM列存储中填充不同的对象:
如果两个数据库中都存在IM列存储,则连接到主数据库,并设置INMEMORY属性,而不使用DISTRIBUTE FOR SERVICE子句。例如,将INMEMORY属性应用于sh.sales表。
根据标准规则,在每个数据库上出现人口。例如,如果备用数据库上的销售优先级为NONE,那么触发完全扫描销售的备用数据库的查询会填充备用IM列存储中的此表。
如果IM列存储仅存在于备用数据库中,则登录到主数据库,并设置INMEMORY属性而不使用DISTRIBUTE FOR SERVICE子句。
在重做传输期间,备用数据库从主数据库接收此DDL语句。 Population以正常方式出现在备用数据库上。例如,如果sales具有INMEMORY属性并且优先级为NONE,则表必须经历全面扫描以进行填充。
如果两个数据库中都存在IM列存储,并且希望这些IM列存储包含不同的对象,请登录到主数据库,然后根据每个对象设置INMEMORY ... DISTRIBUTE FOR SERVICE。
在每个DDL语句中,服务指定应填充对象的实例。例如,要仅在备用数据库中启用销售,请在DDL语句中指定仅备用服务。要在两个数据库中启用产品群,请在DDL语句中指定一个备用和主要服务。
文章转自数据和云公众号,原文链接