使用 Azure PowerShell 在 Azure VM 上建立 SQL Server

適用於:Azure VM 上的 SQL Server

本指南將說明使用 PowerShell 在 Azure 虛擬機器 (VM) 上佈建 SQL Server 的選項。 如需依賴預設值的簡化版 Azure PowerShell 範例,請參閱<Azure VM PowerShell 上的 SQL Server 快速入門>。

如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶

注意

本文使用 Azure Az PowerShell 模組,這是與 Azure 互動時建議使用的 PowerShell 模組。 若要開始使用 Az PowerShell 模組,請參閱安裝 Azure PowerShell。 若要瞭解如何遷移至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 遷移至 Az。

設定您的訂用帳戶

  1. 開啟 PowerShell,然後執行 Connect-AzAccount 命令來建立存取您 Azure 帳戶的權限。

    Connect-AzAccount
    
  2. 出現提示時,請輸入您的認證。 請使用與登入 Azure 入口網站相同的電子郵件和密碼。

定義映像變數

若想要重複使用值並簡化建立指令碼的作業,請先定義數個變數。 視需要變更參數值,但在修改所提供的值時,請注意與名稱長度和特殊字元相關的命名限制。

位置和資源群組

定義您要在其中建立其他 VM 資源的資料區域和資源群組。

視需要進行修改,然後執行這些 Cmdlet 來初始化這些變數。

$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

儲存體屬性

定義儲存體帳戶和虛擬機器所要使用的儲存體類型。

視需要進行修改,然後執行下列 Cmdlet 來初始化這些變數。 我們建議針為生產環境工作負載使用進階 SSD

$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

網路屬性

定義要由虛擬機器中的網路使用的屬性。

  • Linux
  • TCP/IP 配置方法
  • 虛擬網路名稱
  • 虛擬子網路名稱
  • 虛擬網路的 IP 位址範圍
  • 子網路的 IP 位址範圍
  • 公用網域名稱標籤

視需要進行修改,然後執行此 Cmdlet 來初始化這些變數。

$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$TCPIPAllocationMethod = "Dynamic"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$DomainName = $ResourceGroupName

虛擬機器屬性

定義下列屬性:

  • 虛擬機器名稱
  • 電腦名稱
  • 虛擬機器大小
  • 虛擬機器的作業系統磁碟名稱

視需要進行修改,然後執行此 Cmdlet 來初始化這些變數。

$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

選擇 SQL Server 映像

使用下列變數來定義用於虛擬機器的 SQL Server 映像。

  1. 首先,使用 Get-AzVMImageOffer 命令,列出所有 SQL Server 映像供應項目。 此命令會列出 Azure 入口網站中可用的最新映像,以及只能搭配 PowerShell 安裝的較舊映像:

    Get-AzVMImageOffer -Location $Location -Publisher 'MicrosoftSQLServer'
    

    注意

    SQL Server 2008 和 SQL Server 2008 R2 已超出延伸支援,無法再從 Azure Marketplace 取得。

  2. 在本教學課程中,會使用下列變數,以在 Windows Server 2022 上指定 SQL Server 2022。

    $OfferName = "SQL2022-WS2022"
    $PublisherName = "MicrosoftSQLServer"
    $Version = "latest"
    
  3. 接著列出您供應項目的可用版本。

    Get-AzVMImageSku -Location $Location -Publisher 'MicrosoftSQLServer' -Offer $OfferName | Select Skus
    
  4. 在本教學課程中,使用的是 SQL Server 2022 Developer 版本 (SQLDEV)。 Developer 版本免費授權用於測試及開發,而且只需要支付執行 VM 的費用。

    $Sku = "SQLDEV"
    

建立資源群組

在 Resource Manager 部署模型中,您所建立的第一個物件是資源群組。 使用 New-AzResourceGroup \(英文\) Cmdlet,來建立 Azure 資源群組及其資源。 指定您先前針對資源群組名稱和位置所初始化的變數。

執行此 Cmdlet 來建立新的資源群組。

New-AzResourceGroup -Name $ResourceGroupName -Location $Location

建立儲存體帳戶

虛擬機器需要作業系統磁碟和 SQL Server 資料和記錄檔的儲存體資源。 為了簡單起見,您會針對兩者建立單一磁碟。 您可以在之後使用 Add-Azure Disk Cmdlet 來附加額外的磁碟,以將您的 SQL Server 資料和記錄檔放在專用的磁碟上。 使用 New-AzStorageAccount \(英文\) Cmdlet,在新的資源群組中建立標準儲存體帳戶。 指定您先前針對儲存體帳戶名稱、儲存體 SKU 名稱及位置所初始化的變數。

執行此 Cmdlet 來建立新的儲存體帳戶。

$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName `
   -Name $StorageName -SkuName $StorageSku `
   -Kind "Storage" -Location $Location

提示

建立儲存體帳戶可能需要幾分鐘的時間。

建立網路資源

虛擬機器需要數個網路資源才能連接網路。

  • 每部虛擬機器都需要虛擬網路。
  • 虛擬網路必須定義至少一個子網路。
  • 網路介面必須以公用或私人 IP 位址定義。

建立虛擬網路子網路組態

首先要建立虛擬網路的子網路設定。 針對本教學課程,使用 New-AzVirtualNetworkSubnetConfig \(英文\) Cmdlet 來建立預設子網路。 指定您先前針對子網路名稱和位址前置詞所初始化的變數。

注意

您可以使用這個 Cmdlet 來定義虛擬網路子網路組態的其他屬性,但這已超出本教學課程的範圍。

執行此 Cmdlet 來建立虛擬子網路設定。

$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix

建立虛擬網路

接著,使用 New-AzVirtualNetwork \(英文\) Cmdlet,在新的資源群組中建立虛擬網路。 指定您先前針對名稱、位置及位址前置詞所初始化的變數。 使用您在上一個步驟中所定義的子網路設定。

執行此 Cmdlet 來建立虛擬網路。

$VNet = New-AzVirtualNetwork -Name $VNetName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig

建立公用 IP 位址

您已定義虛擬網路,現在必須設定 IP 位址以連線至該虛擬機器。 針對本教學課程,請使用動態 IP 位址來建立公用 IP 位址,以支援網際網路連線。 使用 New-AzPublicIpAddress \(英文\) Cmdlet,在新的資源群組中建立公用 IP 位址。 指定您先前針對名稱、位置、配置方法及 DNS 網域名稱標籤所初始化的變數。

注意

您可以使用這個 Cmdlet 來定義公用 IP 位址的其他屬性,但這已超出本初期教學課程的範圍。 您也可以建立私人位址或具有靜態位址的位址,但這也已超出本教學課程的範圍。

執行此 Cmdlet 來公用 IP 位址。

$PublicIp = New-AzPublicIpAddress -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName

建立網路安全性群組

若要保護 VM 和 SQL Server 的流量,請建立網路安全性群組。

  1. 首先,建立遠端桌面 (RDP) 的網路安全性群組規則,以允許 RDP 連線。

    $NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp `
       -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
    
  2. 設定網路安全性群組規則,允許 TCP 通訊埠 1433 上的流量。 如此即可透過網際網路連線至 SQL Server。

    $NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp `
       -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
    
  3. 建立網路安全性群組。

    $Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName `
       -Location $Location -Name $NsgName `
       -SecurityRules $NsgRuleRDP,$NsgRuleSQL
    

建立網路介面

您現在已準備好建立虛擬機器的網路介面。 使用 New-AzNetworkInterface Cmdlet,在新的資源群組中建立網路介面。 指定先前所定義的名稱、位置、子網路及公用 IP 位址。

執行此 Cmdlet 來建立網路介面。

$Interface = New-AzNetworkInterface -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id `
   -NetworkSecurityGroupId $Nsg.Id

設定 VM 物件

您已定義儲存體和網路資源,現在已準備好定義虛擬機器的計算資源。

  • 指定虛擬網路大小和各種作業系統屬性。
  • 指定您先前所建立的網路介面。
  • 定義 Blob 儲存體。
  • 指定作業系統磁碟。

建立 VM 物件

首先要指定虛擬機器的大小。 針對此教學課程,請指定 [DS13]。 使用 New-AzVMConfig \(英文\) Cmdlet,來建立可設定的虛擬網路物件。 指定您先前針對名稱和大小所初始化的變數。

執行此 Cmdlet 來建立虛擬機器物件。

$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize

建立認證物件,以保留本機系統管理員認證的名稱和密碼

在您可以設定虛擬機器的作業系統屬性之前,您必須先以安全字串的形式提供本機系統管理員帳戶的認證。 為了達成此目的,要使用 Get-Credential Cmdlet。

執行下列 Cmdlet。 您必須在 PowerShell 認證要求視窗中,鍵入 VM 的本機系統管理員名稱和密碼。

$Credential = Get-Credential -Message "Type the name and password of the local administrator account."

設定虛擬機器的作業系統屬性

您現在已準備好使用 Set-AzVMOperatingSystem \(英文\) Cmdlet,來設定虛擬機器的作業系統屬性。

  • 將作業系統的類型設定為 [Windows]。
  • 需要安裝虛擬機器代理程式
  • 指定該 Cmdlet 會啟用自動更新。
  • 指定您先前針對虛擬機器名稱、電腦名稱及認證所初始化的變數。

執行此 Cmdlet 來設定虛擬機器的作業系統屬性。

$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine `
   -Windows -ComputerName $ComputerName -Credential $Credential `
   -ProvisionVMAgent -EnableAutoUpdate

將網路介面新增至虛擬機器

接下來,使用 Add-AzVMNetworkInterface \(英文\) Cmdlet,以您稍早定義的變數來新增網路介面。

執行此 Cmdlet 來設定虛擬機器的網路介面。

$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id

設定虛擬機器所要使用之磁碟的 Blob 儲存體位置

接下來,使用您稍早所定義的變數設定 VM 磁碟的 Blob 儲存體位置。

執行此 Cmdlet 來設定 Blob 儲存體位置。

$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"

設定虛擬機器的作業系統磁碟屬性

接著,使用 Set-AzVMOSDisk \(英文\) Cmdlet,來設定虛擬機器的作業系統磁碟屬性。

  • 指定虛擬機器的作業系統將會來自映像。
  • 將快取設定成唯讀 (因為 SQL Server 會安裝到相同的磁碟上)。
  • 指定您先前針對 VM 名稱和作業系統磁碟所初始化的變數。

執行此 Cmdlet 來設定虛擬機器的作業系統磁碟屬性。

$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name `
   $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

指定虛擬機器的平台映像

最後一個設定步驟是指定虛擬機器的平台映像。 針對本教學課程,請使用最新的 SQL Server 2016 CTP 映像。 使用 Set-AzVMSourceImage \(英文\) Cmdlet,搭配您稍早定義的變數來使用此映像。

執行此 Cmdlet 來指定虛擬機器的平台映像。

$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine `
   -PublisherName $PublisherName -Offer $OfferName `
   -Skus $Sku -Version $Version

建立 SQL VM

您已完成設定步驟,現在已準備好建立虛擬機器。 使用 New-AzVM \(英文\) Cmdlet,以您定義的變數來建立虛擬機器。

提示

建立 VM 可能需要幾分鐘的時間。

執行此 Cmdlet 來建立虛擬機器。

New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

虛擬機器已建立。

注意

如果您收到有關開機診斷的錯誤,則可以忽略它。 由於針對虛擬機器磁碟所指定的儲存體帳戶是進階儲存體帳戶,因此系統會針對開機診斷建立標準儲存體帳戶。

下載 SQL IaaS 代理程式延伸模組

SQL Server 虛擬機器能以 SQL Server IaaS 代理程式延伸模組支援自動化管理功能。 若要向延伸模組註冊您的 SQL Server,請在建立虛擬機器之後執行 New-AzSqlVM 命令。 指定 SQL Server VM 的授權類型,透過 Azure Hybrid Benefit 選擇「隨用隨付」或「自備授權」。 如需授權模式的相關資訊,請參閱授權模式

New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

有三種方式可以向延伸模組註冊:

停止或移除 VM

如果您不需要持續執行 VM,您可以在不使用時將其停止,以避免不必要的費用。 下列命令會停止 VM,但會將其保留供未來使用。

Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

您也可以使用 Remove-AzResourceGroup 命令,將與虛擬機器相關聯的所有資源永久刪除。 這麼做也會永久刪除虛擬機器,因此請小心使用此命令。

範例指令碼

下列指令碼包含本教學課程的完整 PowerShell 指令碼。 我們假設您已經將 Azure 訂用帳戶設定為要與 Connect-AzAccountSelect-AzSubscription 命令搭配使用。

# Variables

## Global
$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

## Storage
$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

## Network
$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$TCPIPAllocationMethod = "Dynamic"
$DomainName = $ResourceGroupName

##Compute
$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

##Image
$PublisherName = "MicrosoftSQLServer"
$OfferName = "SQL2017-WS2016"
$Sku = "SQLDEV"
$Version = "latest"

# Resource Group
New-AzResourceGroup -Name $ResourceGroupName -Location $Location

# Storage
$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageName -SkuName $StorageSku -Kind "Storage" -Location $Location

# Network
$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix
$VNet = New-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName -Location $Location -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig
$PublicIp = New-AzPublicIpAddress -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName
$NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
$NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
$Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName -Location $Location -Name $NsgName -SecurityRules $NsgRuleRDP,$NsgRuleSQL
$Interface = New-AzNetworkInterface -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id -NetworkSecurityGroupId $Nsg.Id

# Compute
$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize
$Credential = Get-Credential -Message "Type the name and password of the local administrator account."
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $ComputerName -Credential $Credential -ProvisionVMAgent -EnableAutoUpdate #-TimeZone = $TimeZone
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id
$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

# Image
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName $PublisherName -Offer $OfferName -Skus $Sku -Version $Version

# Create the VM in Azure
New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

# Add the SQL IaaS Agent Extension, and choose the license type
New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

後續步驟

建立虛擬機器之後,您可以: