你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在基于 Linux 的 Azure 虚拟机上实现 Oracle Data Guard

适用于:✔️ Linux VM

Azure CLI 可用于从命令行或脚本创建和管理 Azure 资源。 本文将介绍如何使用 Azure CLI 从 Azure 市场映像部署 Oracle Database 19c 版本 3 数据库。 本文将分步演示如何在 Azure 虚拟机 (VM) 上安装和配置 Data Guard。 为了帮助保护环境,任何端口都无法公开访问,而 Azure Bastion 实例将提供对 Oracle VM 的访问权限。

开始之前,请先确保已安装 Azure CLI。 有关详细信息,请参阅 Azure CLI 安装指南

准备环境

假设

若要安装 Oracle Data Guard,需要在同一可用性集中创建两个 Azure VM:

  • 主 VM (OracleVM1) 有一个正在运行的 Oracle 实例。
  • 备用 VM (OracleVM2) 仅安装了 Oracle 软件。

用于创建 VM 的 Azure 市场映像为 Oracle:oracle-database-19-3:oracle-database-19-0904:latest

注意

请注意已终止生命周期 (EOL) 且不再受 Red Hat 支持的版本。 在业务上尽一切合理努力,支持处于或超出 EOL 的上传映像。 有关详细信息,请参阅产品生命周期的 Red Hat 网页

登录 Azure

使用 az login 命令登录到 Azure 订阅,并遵照屏幕指示操作。

az login

设置环境变量。

调整环境的 LOCATION 变量:

LOCATION=eastus
RESOURCE_GROUP="Oracle-Lab"
VM_USERNAME="azureuser"
VM_PASSWORD="OracleLab123"
VNET_NAME="${RESOURCE_GROUP}VNet"

启用 Azure Bastion 扩展

在 Azure CLI 中包含 Azure Bastion 扩展:

az extension add \
  --name bastion

创建资源组

使用 az group create 命令创建资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

创建包含两个子网的虚拟网络

创建一个虚拟网络,你将在其中连接所有计算服务。 一个子网将托管 Azure Bastion,这是一项 Azure 服务,用于帮助保护数据库免受公共访问。 第二个子网将托管 2 个 Oracle 数据库 VM。

另外,创建一个网络安全组,所有服务都将引用该组来确定公开的端口。 仅公开端口 443。 Azure Bastion 服务在创建该服务实例时会自动打开此端口。

az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --name $VNET_NAME \
  --address-prefix "10.0.0.0/16"
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name AzureBastionSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.0.0/24
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name OracleSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.1.0/24
az network nsg create \
  --name OracleVM-NSG \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

创建可用性集

创建可用性集是可选的,但我们建议执行此操作。 有关详细信息,请参阅 Azure 可用性集指南

az vm availability-set create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVMAvailabilitySet \
  --platform-fault-domain-count 2 \
  --platform-update-domain-count 2

创建两个虚拟机

使用 az vm create 命令创建两个 VM。 以下示例创建名为 OracleVM1OracleVM2 的 VM。

创建 OracleVM1主要):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM1 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

创建 OracleVM2(备用):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM2 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

创建 Azure Bastion 服务实例

Azure Bastion 为虚拟网络中托管的所有服务提供安全隧道。 它用作跳转盒,以免去对 Oracle 数据库的直接访问。

创建用于访问 Azure Bastion 服务的公共 IP 地址:

az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name OracleLabBastionPublicIP \
  --sku Standard

创建 Azure Bastion 服务实例:

az network bastion create \
  --location $LOCATION \
  --name OracleLabBastion \
  --public-ip-address OracleLabBastionPublicIP \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --sku basic

连接到虚拟机

现在,你将使用 Azure 门户中的 Azure Bastion 服务访问 OracleVM1

在窗口顶部的搜索框中,输入 OracleVM1。 在结果列表中,选择“OracleVM1”以打开该 VM。

该示意图显示了搜索框和第一个 Oracle VM 的结果。

在窗格顶部,选择“连接”>“Bastion”。

该示意图显示选择通过 Azure Bastion 进行连接。

输入用户名和密码,然后选择“连接”按钮。

该示意图显示如何输入凭据来通过 Azure Bastion 进行连接。

此时会打开一个新标签页,并与你的虚拟机建立起安全连接,该虚拟机已通过 Azure 市场映像安装了 Oracle 软件。

该示意图显示在浏览器中通过 Azure Bastion 进行的连接。

配置 OracleVM1(主 VM)

禁用防火墙:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

设置 oracle 用户密码:

sudo passwd oracle

输入 azureuser 密码:OracleLab123

oracle 用户密码更改为 OracleLab123。 (再次输入以进行验证。)

在 OracleVM1(主 VM)上创建数据库

Oracle 软件已基于 Azure 市场映像进行了安装,因此下一步是安装数据库。

切换到 Oracle 超级用户:

sudo su - oracle

创建数据库:

dbca -silent \
   -createDatabase \
   -datafileDestination /u01/app/oracle/cdb1 \
   -templateName General_Purpose.dbc \
   -gdbname cdb1 \
   -sid cdb1 \
   -responseFile NO_VALUE \
   -characterSet AL32UTF8 \
   -sysPassword OracleLab123 \
   -systemPassword OracleLab123 \
   -createAsContainerDatabase true \
   -numberOfPDBs 1 \
   -pdbName pdb1 \
   -pdbAdminPassword OracleLab123 \
   -databaseType MULTIPURPOSE \
   -automaticMemoryManagement false \
   -storageType FS

输出应类似于以下响应:

Copying database files
1% complete
2% complete
8% complete
13% complete
19% complete
27% complete
Creating and starting Oracle instance
29% complete
32% complete
33% complete
34% complete
38% complete
42% complete
43% complete
45% complete
Completing Database Creation
48% complete
51% complete
53% complete
62% complete
70% complete
72% complete
Creating Pluggable Databases
78% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/cdb1/cdb1.log" for further details.

设置 ORACLE_SIDORACLE_HOME 变量:

$ ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
$ ORACLE_SID=cdb1; export ORACLE_SID

(可选)可以将 ORACLE_HOMEORACLE_SID 添加到 /home/oracle/.bashrc 文件,以便为将来登录保存这些设置:

# add oracle home
export ORACLE_HOME= /u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

配置 Data Guard

在 myVM1(主)上启用存档日志模式

启用日志模式:

sqlplus / as sysdba
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

启用强制日志记录,并确保至少存在一个日志文件:

SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER SYSTEM SWITCH LOGFILE;

创建备用重做日志,设置与主数据库重做日志相同的大小和数量:

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo01.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo02.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo03.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo04.log') SIZE 200M;

启用闪回(这会使恢复轻松很多)并将 STANDBY_FILE_MANAGEMENT 设置为 AUTO。 此后退出 SQL*Plus。

SQL> ALTER SYSTEM SET db_recovery_file_dest_size=50G scope=both sid='*';
SQL> ALTER SYSTEM SET db_recovery_file_dest='/u01/app/oracle/cdb1' scope=both sid='*';
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
SQL> EXIT;

在 OracleVM1(主要)上设置服务

编辑或创建 tnsnames.ora 文件,它位于 $ORACLE_HOME/network/admin 文件夹中。

添加以下条目:

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

编辑或创建 listener.ora 文件,它位于 $ORACLE_HOME/network/admin 文件夹中。

添加以下条目:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

启用 Data Guard 代理:

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> CREATE pfile FROM spfile;
SQL> EXIT;

将参数文件复制到备用服务器:

scp -p $ORACLE_HOME/dbs/initcdb1.ora oracle@OracleVM2:$ORACLE_HOME/dbs/

启动侦听器:

 lsnrctl stop
 lsnrctl start

在 OracleVM2(备用)上设置服务

返回到 Azure 门户。 搜索“OracleVM2”,然后在结果列表中选择资源。

屏幕截图为搜索框和第二个 Oracle VM 的结果。

在窗格顶部,选择“连接”>“Bastion”。

示意图显示选择通过 Azure Bastion 进行连接。

输入用户名和密码,然后选择“连接”按钮。

屏幕截图为输入用户名和密码以通过 Azure Bastion 进行连接。

在 OracleVM2(备用)上禁用防火墙

sudo systemctl stop firewalld
sudo systemctl disable firewalld

为 OracleVM1 配置环境

设置 oracle 用户密码:

sudo passwd oracle

输入 azureuser 密码:OracleLab123

oracle 用户密码更改为 OracleLab123。 (再次输入以进行验证。)

切换为 oracle 超级用户:

$ sudo su – oracle

设置 ORACLE_SIDORACLE_HOME 变量:

ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=cdb1; export ORACLE_SID

(可选)可以将 ORACLE_HOMEORACLE_SID 添加到 /home/oracle/.bashrc 文件,以便为将来登录保存这些设置:

# add oracle home
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

编辑或创建 tnsnames.ora 文件,它位于 $ORACLE_HOME/network/admin 文件夹中。

添加以下条目:

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

编辑或创建 listener.ora 文件,它位于 $ORACLE_HOME/network/admin 文件夹中。

添加以下条目:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

启动侦听器:

 lsnrctl stop
 lsnrctl start

将数据库还原为 OracleVM2(备用 VM)

创建包含以下内容的参数文件“/tmp/initcdb1_stby.ora”:

*.db_name='cdb1'

创建文件夹:

$ mkdir -p /u01/app/oracle/cdb1
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdb1
$ mkdir -p /u01/app/oracle/fast_recovery_area/cdb1
$ mkdir -p /u01/app/oracle/admin/cdb1/adump

创建密码文件:

$ orapwd file=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwcdb1 password=OracleLab123 entries=10 force=y

启动 OracleVM2 上的数据库:

 export ORACLE_SID=cdb1
 sqlplus / as sysdba
SQL> CREATE spfile from pfile;
SQL> STARTUP NOMOUNT PFILE='/tmp/initcdb1_stby.ora';
SQL> EXIT;

使用 Oracle 恢复管理器 (RMAN) 工具还原数据库:

$ rman TARGET sys/OracleLab123@cdb1 AUXILIARY sys/OracleLab123@cdb1_stby

在 RMAN 中运行以下命令:

DUPLICATE TARGET DATABASE
  FOR STANDBY
  FROM ACTIVE DATABASE
  DORECOVER
  SPFILE
    SET db_unique_name='CDB1_STBY' COMMENT 'Is standby'
  NOFILENAMECHECK;

命令完成后将显示如下所示的消息:

media recovery complete, elapsed time: 00:00:00
Finished recover at 29-JUN-22
Finished Duplicate Db at 29-JUN-22

退出 RMAN:

RMAN> EXIT;

启用 Data Guard 代理:

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> EXIT;

在 OracleVM1(主 VM)上配置 Data Guard 代理

启动 Data Guard Manager,并使用 SYS 和密码登录。 (不使用 OS 身份验证。)

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS cdb1 CONNECT IDENTIFIER IS cdb1;
Configuration "my_dg_config" created with primary database "cdb1"
DGMGRL> ADD DATABASE cdb1_stby AS CONNECT IDENTIFIER IS cdb1_stby MAINTAINED AS PHYSICAL;
Database "cdb1_stby" added
DGMGRL> ENABLE CONFIGURATION;
Enabled.

查看配置:

DGMGRL> SHOW CONFIGURATION;
Configuration - my_dg_config
  Protection Mode: MaxPerformance
  Members:
  cdb1      - Primary database
  cdb1_stby - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS   (status updated 26 seconds ago)

已完成 Oracle Data Guard 设置。 下一节将介绍如何测试连接和切换。

从客户端计算机连接数据库

在客户端计算机上更新 tnsnames.ora 文件。 此文件通常位于 $ORACLE_HOME/network/admin。

cdb1=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM1)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1)
    )
  )
cdb1_stby=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM2)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1_stby)
    )
  )

启动 SQL*Plus:

$ sqlplus sys/OraPasswd1@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

测试 Data Guard 配置

在 OracleVM1(主 VM)上切换数据库

从主要 VM 切换到备用 VM(cdb1 切换到 cdb1_stby):

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1_stby;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1_stby"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1_stby" is opening...
Operation requires start up of instance "cdb1" on database "cdb1"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1_stby"
DGMGRL>

现可连接到备用数据库。 启动 SQL*Plus:

$ sqlplus sys/OracleLab123@cdb1_stby
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

在 OracleVM2(备用 VM)上切换数据库

若要进行切换,请在 OracleVM2 上运行以下代码:

$ dgmgrl sys/OracleLab123@cdb1_stby
DGMGRL for Linux: Version 190.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1" is opening...
Operation requires start up of instance "cdb1" on database "cdb1_stby"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1"

同样,现在应该可以连接到主数据库。 启动 SQL*Plus:

$ sqlplus sys/OracleLab123@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

已在 Oracle linux 上完成了 Data Guard 的安装和配置。

删除虚拟机

如果不再需要 VM,可以使用以下命令删除资源组、VM 和所有相关的资源:

az group delete --name $RESOURCE_GROUP

后续步骤