数据库管理-第366期 Oracle 19c 多租户 ADG 环境的陷阱(20250911)
作者:胖头鱼的鱼缸(尹海文) Oracle ACE Pro: Database PostgreSQL ACE Partner 10年数据库行业经验 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP,ITPUB认证专家 圈内拥有“总监”称号,非著 名社恐(社交恐怖分子) 公众号:胖头鱼的鱼缸 CSDN:胖头鱼的鱼缸(尹海文) 墨天轮:胖头鱼的鱼缸 ITPUB:yhw1809 IFClub:胖头鱼的鱼缸 除授权转载并标明出处外,均为“非法”抄袭
在 Oracle Active Data Guard,是 Oracle 的一种高可用架构,通俗点讲也是一个主备环境,其中角色为主库(primary)的数据库(单机 or 集群)提供读写访问能力,数据变更实时同步到角色为物理备库(physical standby)的数据库,同时备库提供只读能力,在主库出现异常的情况下,物理备库可切换 / 故障切换为主库角色,提供读写能力,确保数据库的持续服务。整个 ADG 环境即实现了数据库高可用,也提供了数据库的读写分离能力,可以将一些只读业务 / 报表类需求放在物理备库执行,降低主库压力的同时提升整个主备集群的读能力。
从 12c 开始,Oracle 数据库引入了多租户的概念,带来了 ADG 环境下更加多元的使用方式,当然也带来了一些需要注意的地方,本期的内容主要源自于实际生产场景中的实践,希望能给大家带来一些启发。

表空间的陷阱
大家在搭建 ADG 并在备库查询数据时,一定遇到过下面这个报错:
ORA-25153: Temporary Tablespace is Empty
在这种情况下我们在备库查询临时表空间是存在的,但是该表空间是不存在任何临时文件的:

这一点在 MOS 文档
Data Guard Physical Standby - Managing temporary tablespace tempfiles (Doc ID 1514588.1) 有明确的说明:
即主备不会自动同步临时表空间,备库需要DBA为临时表空间手动添加临时文件。
而且在 switchover / failover 后临时文件也不会被创建,因此为了能够让物理备库能够正常提供只读服务,同时在 switchover / failover 能够正常接管业务,因此 ADG 环境搭建完成或新 PDB 创建完成(注意需要添加 standbys 子句,详见《
数据库管理-第101期 DG环境下创建PDB的坑(20230908)》)后,需要手动为临时表空间添加临时文件。
但是这个潜在的问题也可以很好的处理一些特定读写分离场景的需求,比如在物理备库进行大数据量的报表类查询,会使用到较多的临时表空间空间,这样可以考虑在物理备库中有对应需求的 PDB 中配置比主库更大的临时表空间,在不需要的 PDB 中配置合适 / 较小的临时表空间满足切换需求,以达到查询要求和空间占用之间的平衡。
但是相同的想法不能在undo表空间上实现,undo 是主备同步,备库是无法向 undo 表空间添加数据文件的,为满足备库查询的 undo 表空间大小的需求,对应操作只能在主库完成:
当然如果在将来的版本中主备undo也能做到不一致的配置,那么备库的满足读响应使用方式肯定也会更加多元化。
修改 PDB 动态参数的陷阱
前面既然说到了备库可能会承载比主库更大规模的查询,那么针对查询可以配置更多的 PGA、SGA 和 undo 保留时间,但是在备库实际操作的时候又会遇到下面的问题:
按理来说从 19c 开始,修改 PDB 的 SGA 都不需要添加 scope=spfile 和重启 PDB 了,但是在备库进行相关操作的时候仍然会有类似的报错。如果想实现备库对应参数的调整,即便在备库关闭对应 PDB 也是无法实现的,只能够在主库指定 PDB 中调整完对应参数后,在备库重启对应 PDB 实现。如果主库并不需要那么大的 PGA 和 SGA (比如使用 Exadata),也不需要那么长 undo 保留时间来确保能够更好的支撑 OLTP 事务,就需要在备库 PDB 重启完成后将主库 PDB 的对应参数改回去,这就造成了在 switchover / failover 后会增加一部分任意被遗忘的操作。
另一方面,肯定有人会问了如果主备库的硬件资源相同,备库部分 PDB 使用了更多的内存资源会出现问题么,其实这就是多租户的另一个优势,灾备库可以通过关闭没有读写分离需求的 PDB 来腾出对应的内存占用,在 RAC 环境中还能够通过 service 来控制 PDB 运行实例来合理分配多节点内存占用。
当然,最后我还是希望未来的版本能够实现主备库部分动态参数的独立配置调整。
总结
本期讲了一些Oracle 19c 多租户 ADG 环境的一些陷阱,也引入了一些多元化使用方式。 老规矩,知道写了些啥。
