在以 Linux 為基礎的 Azure 虛擬機器上實作 Oracle Data Guard
適用於:✔️ Linux VM
您可以使用 Azure CLI 從命令列或在指令碼中建立和管理 Azure 資源。 本文說明如何使用 Azure CLI,從 Azure Marketplace 映像部署 Oracle Database 19c Release 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 Marketplace 映像為 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 服務,可協助保護您的資料庫免於公開存取。 第二個子網會裝載兩個 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 為虛擬網路內裝載的所有服務提供安全通道。 其可作為 Jumpbox,以排除對 Oracle 資料庫的直接存取。
建立公用 IP 位址以存取 Azure Bastion 服務:
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 Marketplace 映像安裝 Oracle 軟體。
設定 OracleVM1 (主要)
停用防火牆:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
設定 oracle
使用者密碼:
sudo passwd oracle
輸入 azureuser
密碼:OracleLab123
。
將 oracle
使用者密碼變更為 OracleLab123
。 (再次輸入以驗證。)
在 OracleVM1 上建立資料庫 (主要)
Oracle 軟體已安裝於 Azure Marketplace 映像上,因此下一個步驟是安裝資料庫。
切換至 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;
開啟 Flashback (這可讓復原更容易)並設定 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 Broker:
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 (待命)
使用下列內容建立參數檔案 /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 Recovery Manager (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 Broker:
sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> EXIT;
在 OracleVM1 (主要) 上設定 Data Guard Broker
啟動 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 上切換資料庫 (主要)
從主要切換為待命 (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上切換資料庫 (待命)
若要切換,請在 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