你当前正在访问 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。 以下示例创建名为 OracleVM1
和 OracleVM2
的 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。
在窗格顶部,选择“连接”>“Bastion”。
输入用户名和密码,然后选择“连接”按钮。
此时会打开一个新标签页,并与你的虚拟机建立起安全连接,该虚拟机已通过 Azure 市场映像安装了 Oracle 软件。
配置 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_SID
和 ORACLE_HOME
变量:
$ ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
$ ORACLE_SID=cdb1; export ORACLE_SID
(可选)可以将 ORACLE_HOME
和 ORACLE_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”,然后在结果列表中选择资源。
在窗格顶部,选择“连接”>“Bastion”。
输入用户名和密码,然后选择“连接”按钮。
在 OracleVM2(备用)上禁用防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
为 OracleVM1 配置环境
设置 oracle
用户密码:
sudo passwd oracle
输入 azureuser
密码:OracleLab123
。
将 oracle
用户密码更改为 OracleLab123
。 (再次输入以进行验证。)
切换为 oracle
超级用户:
$ sudo su – oracle
设置 ORACLE_SID
和 ORACLE_HOME
变量:
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=cdb1; export ORACLE_SID
(可选)可以将 ORACLE_HOME
和 ORACLE_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
后续步骤
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈