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

在 Azure VM 上创建 Oracle 数据库

适用于:✔️ Linux VM

本文介绍如何使用 Azure CLI 从 Oracle Marketplace Gallery 映像部署 Azure 虚拟机 (VM) 以创建 Oracle Database 19c 数据库。 部署服务器后,通过 SSH 连接服务器以配置 Oracle 数据库。

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

  • Azure Cloud Shell 或 Azure CLI。

    可以在 Azure Cloud Shell 中以交互方式运行本快速入门中的 Azure CLI 命令。 要在 Cloud Shell 中运行命令,请选择代码块右上角的“打开 Cloudshell”。 选择“复制”以复制代码,并将其粘贴到 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

注意

此快速入门将在美国东部地区创建标准 _DS2_V2 SKU 虚拟机。 要按地区查看支持的 SKU 列表,请使用 az vm list-skus 命令。

创建虚拟机

使用 az vm create 命令创建虚拟机 (VM)。

以下示例创建名为 vmoracle19c 的虚拟机。 此外,它还在默认密钥位置中不存在 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 命令为虚拟机创建 NSG。 此命令为规则创建 vmoracle19cNSG NSG 以控制对虚拟机的访问:

    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 命令获取虚拟机的公共 IP 地址:

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

准备虚拟机环境

  1. 创建与虚拟机的 SSH 会话。 将 <publicIPAddress> 部分替换为虚拟机的公共 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. 以 root 用户身份,使用 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. 将虚拟机的域名添加到 /etc/hostname 文件中。 以下命令假定资源组和 VM 是在 eastus 区域中创建的:

    sed -i 's/$/\.eastus\.cloudapp\.azure\.com &/' /etc/hostname
    
  12. 打开防火墙端口。

    由于 SELinux 对于市场映像是默认启用的,因此我们需要为数据库侦听端口 1521 和企业管理器快速端口 5502 打开防火墙以接受流量。 以 root 用户身份运行以下命令:

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

创建数据库

该 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. 以 root 用户身份登录:

    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

后续步骤