Oracle 21c 新特性 | 基于 PDB 的 ADG
作者 | 刘炳林,李辉
来源 |公众号 甲骨文云技术
大家好,我是 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%。
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 保护允许用户独立的 Switchove r或者 Failover 一个 PDB 到远程站点。在这种架构下包含两个重大的进步:
客户能够在两个不同的站点之间平衡业务负载,同时维持多租户的整合优势。
针对单一 PDB 的角色转换比在相同的 CDB 层转换更快。
3. PDB 层 Data Guard 架构
PDB 层 Data Guard 架构
跨 CDB 的 PDB 之间传输和应用对称架构
4. PDB 层 Data Guard 的局限性
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 定义:
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:
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 文件:
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
1) 关于 dgmgrl 登录
方式一:
[oracle@oradb2101~]$ dgmgrl sys/oracle123
方式二:
[oracle@oradb2101~]$ dgmgrl
DGMGRL>connect sys
Password:<<<<输入密码
2) 在源和目标端创建 CONFIGURATION:
在 ORACDB01 实例创建源端 CONFIGURATION:
[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:
[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 关联起来:
DGMGRL>ADD CONFIGURATION 'MyConfig2' CONNECT IDENTIFIER IS oracdb02;
Configuration MyConfig2 added.
注意:执行这步之前需要将 ORACDB01 实例的密码文件拷贝到 ORACDB02 实例下,
并按实例名称重命名,确保两个 CDB 使用的是相同的密码文件及拷贝。
在源数据库 ORACDB01 端执行以下命令查看关联的CONFIGURATION:
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:
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 都被启用成功。
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:
[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:
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:
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 配置的状态:
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 状态:
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 上的状态:
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 上的状态:
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 的状态和属性:
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 的状态和属性:
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:
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"
5.验证 Switchover 操作:
在源端数据库执行以下的命令显示源和目标数据库切换后的 DG PDB 配置:
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 的功能会有更多的改进。
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————————————