在 Azure VM 中建立 Oracle 資料庫

適用於:✔️ Linux VM

本文說明如何使用 Azure CLI 從 Oracle Marketplace 資源庫映像部署 Azure 虛擬機器 (VM) 以建立 Oracle Database 19c 資料庫。 部署伺服器後,您會透過 SSH 與伺服器連線來設定 Oracle 資料庫。

必要條件

  • 如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶

  • Azure Cloud Shell 或 Azure CLI。

    您可在 Azure Cloud Shell 中以互動方式執行此快速入門中的 Azure CLI 命令。 若要在 Cloud Shell 中執行命令,請選取程式碼區塊右上角的 [開啟 Cloud Shell]。 選取 [複製] 以複製程式碼,並將其貼至 Cloud Shell 以加以執行。 您也可從 Azure 入口網站內執行 Cloud Shell。 Cloud Shell 一律使用最新版本的 Azure CLI。

    此外,您也可在本機執行 Azure CLI 以執行命令。 本文中的步驟需要 Azure CLI 2.0.4 或更新版本。 執行 az version 以查看您安裝的版本和相依程式庫,然後執行 az upgrade 以升級。 如果您使用的是本機安裝,請使用 az login 命令登入 Azure。

建立資源群組

使用 az group create 命令來建立資源群組。 Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。

下列範例在 eastus 位置建立名為 rg-oracle 的資源群組。

az group create --name rg-oracle --location eastus

注意

本快速入門會在美國東部區域建立 Standard_DS2_v2 SKU VM。 若要依區域檢視支援的 SKU 清單,請使用 az vm list-skus 命令。

建立虛擬機器

使用 az vm create 命令建立虛擬機器 (VM)。

下列範例會建立名為 vmoracle19c 的 VM。 如果預設的金鑰位置沒有 SSH 金鑰,則也會建立該金鑰。 若要使用一組特定的金鑰,您可使用命令以使用 --ssh-key-value 選項。

az vm create \
    --name vmoracle19c \
    --resource-group rg-oracle \
    --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
    --size Standard_DS2_v2 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --public-ip-address-allocation static \
    --public-ip-address-dns-name vmoracle19c

在您建立 VM 後,Azure CLI 會顯示類似下列範例的資訊。 請記下 publicIpAddress 屬性的值。 您會使用此 IP 位址來存取 VM。

{
  "fqdns": "",
  "id": "/subscriptions/{snip}/resourceGroups/rg-oracle/providers/Microsoft.Compute/virtualMachines/vmoracle19c",
  "location": "eastus",
  "macAddress": "00-0D-3A-36-2F-56",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "13.64.104.241",
  "resourceGroup": "rg-oracle"
}

建立 Oracle 資料檔案的磁碟

使用 az vm disk attach 命令,建立和連結 Oracle 資料檔案的新磁碟和快速復原區域 (FRA)。

下列範例會建立名為 oradata01 的磁碟。

az vm disk attach \
    --name oradata01 --new \
    --resource-group rg-oracle \
    --size-gb 64 --sku StandardSSD_LRS \
    --vm-name vmoracle19c

開始連接埠進行連線

在此工作中,您必須設定可保護 VM 的 Azure 網路安全性群組 (NSG),以設定一些外部端點供資料庫接聽程式使用。

  1. 使用 az network nsg create 命令來建立 VM 的 NSG。 此命令會建立 vmoracle19cNSG NSG 以供規則控制 VM 的存取:

    az network nsg create --resource-group rg-oracle --name vmoracle19cNSG
    
  2. 使用 az network nsg rule create 命令來建立 NSG 規則。 此命令會建立 allow-oracle NSG 規則,以開啟端點供遠端存取 Oracle 資料庫:

    az network nsg rule create \
        --resource-group rg-oracle \
        --nsg-name vmoracle19cNSG \
        --name allow-oracle \
        --protocol tcp \
        --priority 1001 \
        --destination-port-range 1521
    
  3. 建立第二個 NSG 規則,以開啟端點供遠端存取 Oracle。 此命令會建立 allow-oracle-EM NSG 規則:

    az network nsg rule create \
        --resource-group rg-oracle \
        --nsg-name vmoracle19cNSG \
        --name allow-oracle-EM \
        --protocol tcp \
        --priority 1002 \
        --destination-port-range 5502
    
  4. 視需要使用 az network public-ip show 命令以取得 VM 的共用 IP 位址:

    az network public-ip show \
        --resource-group rg-oracle \
        --name vmoracle19cPublicIP \
        --query "ipAddress" \
        --output tsv
    

準備 VM 環境

  1. 建立與 VM 的 SSH 工作階段。 將 <publicIPAddress> 部分取代為 VM 的公用 IP 位址,例如 10.200.300.4

    ssh azureuser@<publicIPAddress>
    
  2. 切換至根使用者:

    sudo su -
    
  3. 找出您要格式化以保存 Oracle 資料檔案的最近建立磁碟裝置:

    ls -alt /dev/sd*|head -1
    

    輸入類似於此範例:

    brw-rw----. 1 root disk 8, 16 Dec  8 22:57 /dev/sdc
    
  4. 以根使用者身分,使用 parted 命令來格式化裝置。

    1. 首先建立磁碟標籤:

      parted /dev/sdc mklabel gpt
      
    2. 接下來,建立跨整個磁碟的主要磁碟分割:

      parted -a optimal /dev/sdc mkpart primary 0GB 64GB	
      
    3. 最後,列印裝置的中繼資料,以檢查其詳細資料:

      parted /dev/sdc print
      

      輸入類似於此範例:

      Model: Msft Virtual Disk (scsi)
      Disk /dev/sdc: 68.7GB
      Sector size (logical/physical): 512B/4096B
      Partition Table: gpt
      Disk Flags:
      Number   Start    End      Size     File system   Name     Flags
      1        1049kB   64.0GB   64.0GB   ext4          primary
      
  5. 在裝置磁碟分割上建立檔案系統:

    mkfs -t ext4 /dev/sdc1
    

    輸入類似於此範例:

    mke2fs 1.42.9 (28-Dec-2013)
    Discarding device blocks: done                            
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    3907584 inodes, 15624704 blocks
    781235 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2164260864
    477 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
         4096000, 7962624, 11239424
     Allocating group tables: done                            
     Writing inode tables: done                            
     Creating journal (32768 blocks): done
     Writing superblocks and filesystem accounting information: done   
    
  6. 建立掛接點:

    mkdir /u02
    
  7. 掛接磁碟:

    mount /dev/sdc1 /u02
    
  8. 變更掛接點的權限:

    chmod 777 /u02
    
  9. 將掛接新增至 /etc/fstab 檔案:

    echo "/dev/sdc1               /u02                    ext4    defaults        0 0" >> /etc/fstab
    

    重要

    此命令會掛接沒有特定 UUID 的 /etc/fstab 檔案,可防止成功重新開機磁碟。 嘗試重新開機磁碟前,請先更新 /etc/fstab 項目以包含掛接點的 UUID。

  10. 使用公用 IP 位址和位址主機名稱更新 /etc/hosts 檔案。 變更 <Public IP> 和兩個 <VMname> 部分以反映您實際的值:

    echo "<Public IP> <VMname>.eastus.cloudapp.azure.com <VMname>" >> /etc/hosts
    
  11. 將 VM 的網域名稱新增至 /etc/hostname 檔案。 下列命令假設已在 eastus 區域中建立資源群組和 VM:

    sed -i 's/$/\.eastus\.cloudapp\.azure\.com &/' /etc/hostname
    
  12. 開啟防火牆連接埠。

    由於 SELinux 在 Marketplace 映像上預設為啟用,我們需要在防火牆開放資料庫接聽連接埠 1521 和 Enterprise Manager Express 連接埠 5502 來接受流量。 以 root 使用者身分執行下列命令:

    firewall-cmd --zone=public --add-port=1521/tcp --permanent
    firewall-cmd --zone=public --add-port=5502/tcp --permanent
    firewall-cmd --reload
    

建立資料庫

Marketplace 映像上已安裝 Oracle 軟體。 建立範例資料庫,如下所示。

  1. 切換至 Oracle 使用者:

    sudo su - oracle
    
  2. 啟動資料庫接聽程式:

    lsnrctl start
    

    輸出類似於下列範例:

    LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 20-OCT-2020 01:58:18
    
    Copyright (c) 1991, 2019, Oracle.  All rights reserved.
    
    Starting /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr: please wait...
    
    TNSLSNR for Linux: Version 19.0.0.0.0 - Production
    Log messages written to /u01/app/oracle/diag/tnslsnr/vmoracle19c/listener/alert/log.xml
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmoracle19c.eastus.cloudapp.azure.com)(PORT=1521)))
    
    Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
    Start Date                20-OCT-2020 01:58:18
    Uptime                    0 days 0 hr. 0 min. 0 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Log File         /u01/app/oracle/diag/tnslsnr/vmoracle19c/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmoracle19c.eastus.cloudapp.azure.com)(PORT=1521)))
    The listener supports no services
    The command completed successfully
    
  3. 建立 Oracle 資料檔案的資料目錄:

    mkdir /u02/oradata
    
  4. 執行「資料庫建立輔助程式」:

    dbca -silent \
        -createDatabase \
        -templateName General_Purpose.dbc \
        -gdbname oratest1 \
        -sid oratest1 \
        -responseFile NO_VALUE \
        -characterSet AL32UTF8 \
        -sysPassword OraPasswd1 \
        -systemPassword OraPasswd1 \
        -createAsContainerDatabase false \
        -databaseType MULTIPURPOSE \
        -automaticMemoryManagement false \
        -storageType FS \
        -datafileDestination "/u02/oradata/" \
        -ignorePreReqs
    

    建立資料庫需要幾分鐘的時間。

    輸出類似於下列範例:

         Prepare for db operation
        10% complete
        Copying database files
        40% complete
        Creating and starting Oracle instance
        42% complete
        46% complete
        50% complete
        54% complete
        60% complete
        Completing Database Creation
        66% complete
        69% complete
        70% complete
        Executing Post Configuration Actions
        100% complete
        Database creation complete. For details check the logfiles at: /u01/app/oracle/cfgtoollogs/dbca/oratest1.
        Database Information:
        Global Database Name:oratest1
        System Identifier(SID):oratest1
        Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/oratest1/oratest1.log" for further details.
    
  5. 設定 Oracle 變數:

    在連線之前,您需要設定環境變數 ORACLE_SID

    export ORACLE_SID=oratest1
    

    您也應該使用下列命令,將 ORACLE_SID 變數新增至 oracle 使用者的 .bashrc 檔案,供未來登入時使用:

    echo "export ORACLE_SID=oratest1" >> ~oracle/.bashrc
    

自動進行資料庫啟動和關機

當您重新啟動 VM 時,Oracle 資料庫預設不會自動啟動。 若要將 Oracle 資料庫設定為自動啟動,請先以 root 的身分登入。 接著,建立並更新一些系統檔案。

  1. 以根使用者身分登入:

    sudo su -
    
  2. 在 /etc/oratab 檔案中,將自動啟動旗標從 N 變更為 Y

    sed -i 's/:N/:Y/' /etc/oratab
    
  3. 建立名為 /etc/init.d/dbora 的檔案,並將下列 Bash 命令新增至檔案:

    #!/bin/sh
    # chkconfig: 345 99 10
    # Description: Oracle auto start-stop script.
    #
    # Set ORA_HOME to be equivalent to $ORACLE_HOME.
    ORA_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
    ORA_OWNER=oracle
    
    case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the Oracle sign-in
        # will not prompt the user for any values.
        # Remove "&" if you don't want startup as a background process.
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME" &
        touch /var/lock/subsys/dbora
        ;;
    
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the Oracle sign-in
        # will not prompt the user for any values.
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME" &
        rm -f /var/lock/subsys/dbora
        ;;
    esac
    
  4. 使用 chmod 命令來變更檔案的權限:

    chgrp dba /etc/init.d/dbora
    chmod 750 /etc/init.d/dbora
    
  5. 建立用於啟動和關閉的符號連結:

    ln -s /etc/init.d/dbora /etc/rc.d/rc0.d/K01dbora
    ln -s /etc/init.d/dbora /etc/rc.d/rc3.d/S99dbora
    ln -s /etc/init.d/dbora /etc/rc.d/rc5.d/S99dbora
    
  6. 若要測試您的變更,請重新啟動 VM:

    reboot
    

清除資源

完成在 Azure 上探索第一個 Oracle 資料庫而且不再需要 VM 之後,就可以使用 az group delete 命令移除資源群組、VM 和所有相關資源。

az group delete --name rg-oracle

下一步