大家好,欧博allbet我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来学习 Oracle 21c 新特性 | 基于 PDB 的 ADG 今天在 Oracle 原厂公众号上看到了一篇描述 Oracle 21c ADG 新特性的文章,基于 PDB 级别的 ADG 可以实现自由切换,非整个 CDB 级别的 ADG 及 Switchover 十分不错,值得推荐,故分享给大家。 Oracle 数据库作为一款企业级核心数据产品从诞生之时就对高可用和容灾进行探索和努力。1996 年 Oracle 发布了 7.3 版本,其中有一个具有跨时代的功能:Standby Database,那时Standby Database(备库)可以看成是主库的一个基于文件的备份。主库与备库的同步只能依赖于归档日志,而归档日志依赖于第三方工具从主库传输到备库。备库只能启动到 MOUNT阶段,通过激活命令将数据库从备库状态转为主库状态。1998 年Oracle 发布了 8.1.5 版本,Standby Database 在这个版本中得到了质的飞越,对它的运维变得更加简单,Standby Database 不仅仅有容灾功能,同时还引入了只读功能,使得原来在主库环境中消耗大量资源的报表业务可以迁移到备库端运行。 经过 20 多年的不断努力和推陈出新,Oracle 以 DG 和 RAC 技术为主要基石,在 Extended RAC,ASM,Sharding,Active Data Guard,Site Guard,Flashback,RMAN+ZDLRA,Global Data Service,Application Continuity,Transaction Guard,Online Redefinition,Edition-based Redefinition 等技术加持下已形成完备的数据保护体系,帮助众多关键客户实现了高水平的最高可用性架构。根据 2022 年 4 月 Oracle 发布的最新 MAA 参考架构,MAA 架构已经细分为了基于本地部署、Exadata 部署、云端部署三大平台。Oracle MAA 最佳实践定义了四种高可用性参考架构(白金级、黄金级、白银级和青铜级)来解决各行各业中大大小小企业的各种可用性和数据保护需求。 在此基础之上,随着 2022 年 7 月 DGPDB 特性的发布,欧博百家乐我们将被带入到完美 MAA 架构的”最后一公里“。什么是 DGPDB 特性,我们不得不从它的基础环境多租户开始说起,在 2013 年发布的 12c 中 Oracle 引入了多租户架构,深刻的改变了 Oracle 数据库的原有架构,打开了数据库新的整合能力和创建周期,经过多年的发展,多租户架构不断增强,在不同的版本中都引入了新的特性,包括热克隆,可刷新的克隆,在线迁移等等。 测试数据表明,多租户在数据库整合能力上与使用相同系统资源(CPU、内存和 I/O)的单实例数据库相比可实现: 整合密度提高 50%(整合的数据库数量),同时每个数据库可达到相同的吞吐量。 整合相同数量的数据库时,总吞吐量增加 80%。 从另一个角度看,这些测试证实了 Oracle 多租户架构如何带来真正的硬件和软件许可成本的节省。相信在很多需要实现”两地三中心“架构的客户中大家都反映过一个共同的问题,多租户整合能力变强,但基于 ADG 技术的复制和切换还是以 CDB 实例为单位。CDB 实例内不同的 PDB 往往对应不同的业务系统,业务系统的切换需求实际是“众口难调”,例如,按照银行业监管部门要求,有的业务系统需要一年三次切换,有的一年一次切换就可以,有的可能三年一次就可以,有的管理类系统不需要切换;同样的,在某个业务系统出现故障,需要切换它对应的数据库时,PDB 对应的 CDB 实例不得不整体切换,势必会影响其他业务系统的正常运行,所以从切换演练和故障切换的角度来说,传统的基于 CDB 的 ADG 切换其实带来了另一种风险和不确定性,由此可见,多租户虽然实现了高效的整合和有效的隔离,但整合的灵活性和跨设备资源的利用率都还有待加强。在同城双中心之间网络带宽和时延都比较理想的情况下,PDB级别不具备ADG切换的功能离大家心目中真正的“双活”,甚至“多活”还差了那么一点点,达不到大家心中对技术”完美“的追求。 2022 年 7 月,Oracle 在 21.7 版本引入了 PDB 层的 Data Guard 可用性特性(简称:DGPDB),这个多租户新的 Data Guard 特性将用来替代传统的 CDB 架构层的 Data Guard。它允许客户实施高效的 CDB 层的 Data Guard,或者更灵活的 PDB 层 Data Guard(在每个 PDB 上配置、维护和独立的 Switchover、Failover 操作)。 1. 传统的 CDB 架构层的 Data Guard 传统的 CDB 架构层面的 Data Guard 环境 CDB 在传统的 Data Guard 配置中,一个 CDB 是主库,另一个 CDB 是备库,因此在主 CDB中的每个 PDB 将一直是主库的状态(以读写模式打开),同样,在备 CDB 中的每个 PDB 将一直是备库的状态(最多以实时应用日志的只读模式打开),当 CDB 转变为新的角色,其中的所有 PDB 同样也跟着转换。 2. 什么是 PDB 层的 Data Guard? 从名称就不能看出,PDB 层的 Data Guard 保护的是单个 PDB,而不是整个 CDB。它的含义是一个 DGPDB 配置将有两个主 CDB 替代一个主 CDB 和一个备用 CDB。每个 CDB 都将包含以读写模式打开的 PDB 和在远程 CDB 中的目标 PDB。 新的PDB层面的Data Guard环境 在 PDB 层的 Data Guard 保护允许用户独立的 Switchove r或者 Failover 一个 PDB 到远程站点。在这种架构下包含两个重大的进步: 客户能够在两个不同的站点之间平衡业务负载,同时维持多租户的整合优势。 针对单一 PDB 的角色转换比在相同的 CDB 层转换更快。 3. PDB 层 Data Guard 架构 DGPDB 利用传统 Data Guard 相同的 Redo 传输服务架构。在主数据库实例,利用日志写进程(LGWR)将整个 CDB 的 Redo 信息写到在线 Redo 日志(ORLs),ASYNC 传输进程(TTnn)异步发送相同的信息到远程 CDB 的目标端存放。 接收进程(RFS)将从主库接收的 Redo 写到备库的 Redo 日志(SRLs),到目前为止,和传统的Data Guard 相比传输机制没有任何改变,同时提供精确的缺失 Redo 重传解决机制。 每个 PDB 有一个”应用”进程(TTnn)用于过滤,应用和目标 PDB 相关的数据。这个恢复能够在PDB 层面启动和停止。 PDB 层 Data Guard 架构 DGPDB 配置由两个主数据库组成。因此,Redo 传输服务进程是对称的,如下图所示: 跨 CDB 的 PDB 之间传输和应用对称架构 该架构会将完整的 Redo 流传输到远程的 CDB:如果 CDB 中只有部分 PDB 受到保护,这可能会有较大的开销。因此,任何存在大量写的 PDB,如果不要求受到保护,那么应该将它放到单独的 CDB 中,以防止多余的 Redo 传输。 4. PDB 层 Data Guard 的局限性 第一个版本的 DGPDB 主要有以下的限制: Oracle 已经计划在未来的版本中解决以上的部分限制。 5. DGPDB 基础功能验证 下面我们通过 21.7 的数据库版本对 DGPDB 的基本功能做验证,DGPDB 的配置我们使用Broker 来完成,操作比较简单。 5.1. 安装 21.7 软件 下面是我们测试使用到的操作系统和数据库环境: 操作系统 Centos 7.9 x86 64bit Oracle Database 单机 21.7 主机 oradb2101, oradb2102 5.2. 创建测试 CDB 和多个 PDB。 下面是我们测试使用到的两个 CDB 和其中的 PDB 定义: 我们会测试源端 pdb2 到目标端 dgpdb_pdb2 的实时同步,并且将原有的 pdb2 主库切换(Switchover)到 dgpdb_pdb2 作为主库,dgpdb_pdb2 并不需要提前创建好。 ORACDB01 源 CDB 包含的 PDB: 代码语言:javascript 复制 SQL> show pdbs u> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 READ WRITE NO ORACDB02 目标 CDB 包含的 PDB: 代码语言:javascript 复制 SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 PDB4 READ WRITE NO 5 PDB3 READ WRITE NO 5.3. 配置 DGPDB 准备工作 下面是 DGPDB 配置前的主要准备工作: 1) 将 ORACDB01 和 ORACDB02 两个 CDB的DG_BROKER_START 设置为 TRUE。 2) 确保 ORACDB0 和 ORACDB02 两个 CDB 都使用的是 SPFILE,并且都是用 SPFILE 启动的数据库实例。 3) 源数据库和目标数据库之间必须通过 TCP/IP 协议进行连接,在 ORADB01 和 ORADB02 的两个主机端配置连接到两个 CDB 的 tnsnames.ora 文件: 代码语言:javascript 复制 ORACDB01 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.27.21.64)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracdb01) )) ORACDB02 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.27.21.65)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracdb02) )) 5.4 配置 DGPDB 我们利用 DGPDB 特性实现 ORACDB01 下的 PDB2 到 ORACDB02 下的 dgpdb_pdb2的同步作为例子,DG PDB 配置由以下的内容组成: 保护模式:最大性能;传输模式:ASYNC 1) 关于 dgmgrl 登录 在下面的大部分操作中 Broker 内部都需要在不同的 CONFIGURATION 之间交互,登录dgmgrl 需要使用到密码,否则交互时会受到 ORA-1017 的报错。可以通过以下两种方式用密码登录: 代码语言:javascript 复制 方式一: [oracle@oradb2101~]$ dgmgrl sys/oracle123 方式二: [oracle@oradb2101~]$ dgmgrl DGMGRL>connect sys Password:<<<<输入密码 2) 在源和目标端创建 CONFIGURATION: 在 ORACDB01 实例创建源端 CONFIGURATION: 代码语言:javascript 复制 [oracle@oradb2101 admin]$ dgmgrl DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 14 15:27:58 2022 Version 21.7.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates.All rights reserved. Welcome to DGMGRL, type "help" for information. DGMGRL> connect sys Password: Connected to "oracdb01" Connected as SYSDBA. DGMGRL>CREATE CONFIGURATION 'MyConfig1' AS PRIMARY DATABASE IS 'oracdb01' CONNECT IDENTIFIER IS oracdb01; Connected to "oracdb01" Configuration "MyConfig1" created with primary database "oracdb01" 在 ORACDB02 实例创建目标端 CONFIGURATION: 代码语言:javascript 复制 [oracle@oradb2102 admin]$ dgmgrl DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 14 15:30:00 2022 Version 21.7.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates.All rights reserved. Welcome to DGMGRL, type "help" for information. DGMGRL> connect sys Password: Connected to "oracdb02" Connected as SYSDBA. DGMGRL>CREATE CONFIGURATION 'MyConfig2' AS PRIMARY DATABASE IS 'oracdb02' CONNECT IDENTIFIER IS oracdb02; Connected to "oracdb02" Configuration "MyConfig2" created with primary database "oracdb02" 3) 在两个 CONFIGURATION 之间建立连接: 在源数据库 ORADB01 节点执行以下命令将源端和目标端的 CONFIGURAITON 关联起来: 代码语言:javascript 复制 DGMGRL>ADD CONFIGURATION 'MyConfig2' CONNECT IDENTIFIER IS oracdb02; Configuration MyConfig2 added. 注意:执行这步之前需要将 ORACDB01 实例的密码文件拷贝到 ORACDB02 实例下, 并按实例名称重命名,确保两个 CDB 使用的是相同的密码文件及拷贝。 在源数据库 ORACDB01 端执行以下命令查看关联的CONFIGURATION: 代码语言:javascript 复制 DGMGRL> show configuration; Configuration - MyConfig1 Protection Mode: MaxPerformance Members: oracdb01 - Primary database oracdb02 - Primary database in MyConfig2 configuration <<<<出现了两个主数据库,其中oracdb02是目标端的数据库 Fast-Start Failover:Disabled Configuration Status: DISABLED 在目标数据库 ORACDB02 端执行以下命令查看关联的 CONFIGURATION: 代码语言:javascript 复制 DGMGRL> show configuration; Configuration - MyConfig2 Protection Mode: MaxPerformance Members: oracdb02 - Primary database oracdb01 - Primary database in MyConfig1 configuration <<<< oracdb01主数据库被自动添加到MyConfig2中。 Fast-Start Failover:Disabled Configuration Status: DISABLED 4) 拷贝数据文件: 在目标数据库开始恢复之前,确保源数据库相应的数据文件被拷贝到了目标数据库,可以使用RMAN或者操作系统 copy 命令。拷贝源和目标数据库的数据文件位置必须符合ADD PLUGGABLE DATABASE 命令指定的 PDBFileNameConvert 子句。 测试过程我们使用的是操作系统命令进行的拷贝。 5) 启用所有的 CONFIGURATION: 在源数据库 ORADB01 节点执行以下命令启用所有的配置: 两个主数据库的 CONFIGURATION 都被启用成功。 代码语言:javascript 复制 DGMGRL>enable configuration all; Succeeded. DGMGRL> show configuration; Configuration - MyConfig1 Protection Mode: MaxPerformance Members: oracdb01 - Primary database oracdb02 - Primary database in MyConfig2 configuration Fast-Start Failover:Disabled Configuration Status: SUCCESS(status updated 45 seconds ago) 6) 创建源 PDB 的 Data Guard(添加目标 PDB): 在目标数据库 ORADB02 节点执行以下命令添加 DGPDB: 代码语言:javascript 复制 [oracle@oradb2102 ~]$ dgmgrl sys/oracle123 DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 14 18:24:13 2022 Version 21.7.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates.All rights reserved. Welcome to DGMGRL, type "help" for information. Connected to "oracdb02" Connected as SYSDBA. DGMGRL>ADD PLUGGABLE DATABASE 'dgpdb_pdb2' AT 'oracdb02' SOURCE IS 'pdb2' AT 'oracdb01' PDBFileNameConvert IS "'/opt/oracle/oradata/ORACDB01/pdb2/','/opt/oracle/oradata/ORACDB02/dgpdb_pdb2/'"; Connected to "oracdb01" Connected to "oracdb02" Pluggable Database "DGPDB_PDB2" added …… SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 DGPDB_PDB2 MOUNTED 4 PDB4 READ WRITE NO 5 PDB3 READ WRITE NO 执行完以上命令之后,目标端的 CDB 中就会多一个 DGPDB_PDB2 的新 PDB。 注意: 1. 当目标 PDB 被添加之后,在两个 CONFIGURAITON 中的主数据库之间会自动建立 Redo传输。 2. PDBFileNameConvert 关键字指定如何将源 PDB 的数据文件转换到目标 PDB。 7).强制日志记录: 在 ORACDB01 和 ORACDB02 实例下执行以下命令打开 FORCE LOGGING: 代码语言:javascript 复制 SQL>alter database force logging; Database altered. SQL> SQL> SQL> select force_logging from v$database; FORCE_LOGGING --------------------------------------- YES 8).添加 Standby Redo Log: 在 ORACDB01 和 ORACDB02 实例下执行以下命令添加 4 组 Standby Redo Log: 代码语言:javascript 复制 SQL> select group#,thread#,sequence#,bytes/1024/1024 mb,status from v$log; GROUP# THREAD# SEQUENCE# MB STATUS ---------- ---------- ---------- ---------- ---------------- 1 1 10 200 INACTIVE 2 1 11 200 INACTIVE 3 1 12 200 CURRENT SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 ('/opt/oracle/oradata/ORACDB01/sredo01.log') SIZE 200M; Database altered. 5.5 验证 DGPDB 传输和应用 1) 查看 CONFIGURATION 状态: 在源端执行以下的命令查看 MyConfig1 配置的状态: 代码语言:javascript 复制 DGMGRL> show configuration; Configuration - MyConfig1 Protection Mode: MaxPerformance Members: oracdb01 - Primary database oracdb02 - Primary database in MyConfig2 configuration Data Guard for PDB:Enabled in SOURCE role <<<<表明DGPDB是源库的角色 Configuration Status: SUCCESS(status updated 54 seconds ago) 2) 查看源 PDB 状态: 代码语言:javascript 复制 DGMGRL>show pluggable database pdb2 at oracdb01; Pluggable database 'pdb2' at database 'oracdb01' Data Guard Role: Primary Con_ID: 4 Active Target: con_id 3 at oracdb02 Pluggable Database Status: SUCCESS 在源端执行以下的命令查看 pdb2 在 oracdb01 上的状态: 代码语言:javascript 复制 DGMGRL>show pluggable database pdb2 at oracdb01; Pluggable database 'pdb2' at database 'oracdb01' Data Guard Role: Primary Con_ID: 4 Active Target: con_id 3 at oracdb02 Pluggable Database Status: SUCCESS 表明了 pdb2 的 DGPDB 角色为主库。 3) 查看目标 PDB 状态: 在源端执行以下的命令查看 dgpdb_pdb2 在 oracdb02 上的状态: 代码语言:javascript 复制 DGMGRL>show pluggable database dgpdb_pdb2 at oracdb02; Connected to "oracdb02" Pluggable database 'dgpdb_pdb2' at database 'oracdb02' Data Guard Role: Physical Standby Con_ID: 3 Source: con_id 4 at oracdb01 Transport Lag: 0 seconds (computed 64 seconds ago) Intended State: APPLY-ON Apply State: Running Apply Instance: oracdb02 Average Apply Rate: 22 KByte/s Real Time Query: OFF Pluggable Database Status: SUCCESS 表明 Redo 传输和应用都是实时的。 5.6 Switchover PDB DG Switchover 常被称为计划内的切换,是最常用的 ADG 切换方式,下面我们通过将 PDB2 Switchove r到 DGPDB_PDB2 来验证基于 PDB 层的 ADG 切换。 1.Switchover 前的必要条件: 1).主数据库的传输状态为 TRANSPORT-ON,对应的目标 PDB 的应用状态为 APPLY-ON。 2).源数据库和目标数据库都是健康状态,没有任何报错和告警。 3).在源数据库创建了 Standby Redo 日志。 2.检查源数据库和源 PDB 的状态: 执行如下的命令查看源数据库和源 PDB 的状态和属性: 代码语言:javascript 复制 DGMGRL> show database oracdb01; Database - oracdb01 Role: PRIMARY Intended State: TRANSPORT-ON PDB Data Guard Role: SOURCE Data Guard Source PDB(s): 1 Instance(s): oracdb01 Database Status: SUCCESS DGMGRL> show pluggable database pdb2 at oracdb01; Pluggable database 'pdb2' at database 'oracdb01' Data Guard Role: Primary Con_ID: 4 Active Target: con_id 3 at oracdb02 Pluggable Database Status: SUCCESS 以上命令没有任何报错。 3.查看目标数据库和目标 PDB 的状态: 执行如下的命令查看目标数据库和目标 PDB 的状态和属性: 代码语言:javascript 复制 DGMGRL> show database oracdb02; Database - oracdb02 Role: PRIMARY Intended State: TRANSPORT-ON PDB Data Guard Role: TARGET Data Guard Target PDB(s): 1 Instance(s): oracdb02 Database Status: SUCCESS DGMGRL> show pluggable database dgpdb_pdb2 at oracdb02; Connected to "oracdb02" Pluggable database 'dgpdb_pdb2' at database 'oracdb02' Data Guard Role: Physical Standby Con_ID: 3 Source: con_id 4 at oracdb01 Transport Lag: 0 seconds (computed 29 seconds ago) Intended State: APPLY-ON Apply State: Running Apply Instance: oracdb02 Average Apply Rate: 22 KByte/s Real Time Query: OFF Pluggable Database Status: SUCCESS 以上命令没有任何报错。 4.执行 SWITCHOVER TO 命令切换到目标数据库 执行以下的命令将主数据库从 pdb2 切换到 dgpdb_pdb2: 代码语言:javascript 复制 DGMGRL>SWITCHOVER TO PLUGGABLE DATABASE dgpdb_pdb2 AT oracdb02; Verifying conditions for Switchover... Connected to "oracdb02" Connected to "oracdb01" Source pluggable database is 'PDB2' at database 'oracdb01' Performing switchover NOW, please wait... Closing pluggable database 'PDB2'... Switching 'PDB2' to standby role... Connected to "oracdb02" Waiting for 'DGPDB_PDB2' to recover all redo data... Stopping recovery at 'DGPDB_PDB2'... Converting 'DGPDB_PDB2' to primary role... Opening new primary 'DGPDB_PDB2'... Connected to "oracdb01" Waiting for redo data from new primary 'DGPDB_PDB2'... Starting recovery at new standby 'PDB2'... Switchover succeeded, new primary is "DGPDB_PDB2" Switchover 切换成功,新的主数据库变成了 DGPDB_PDB2。 5.验证 Switchover 操作: 在源端数据库执行以下的命令显示源和目标数据库切换后的 DG PDB 配置: 代码语言:javascript 复制 DGMGRL> SHOW CONFIGURATION; Configuration - MyConfig1 Protection Mode: MaxPerformance Members: oracdb01 - Primary database oracdb02 - Primary database in MyConfig2 configuration Data Guard for PDB:Enabled in TARGET role <<<<MyConfig1角色变更为了TARGET Configuration Status: SUCCESS(status updated 35 seconds ago) 通过以上的例子我们简单验证了在 Oracle Database 21.7 的环境下,如何通过 Broker 工具实现 PDB 层面的 DG 配置与 DGPDB 的 Switchover。当然如文章前面所说,这是 DGPDB 的第一个特性版本,相信在未来的版本中,DGPDB 的功能会有更多的改进。 (责任编辑:) |