使用 PowerShell 创建 SQL Server VM 的指南

适用于: Azure VM 上的 SQL Server

本指南介绍使用 PowerShell 在 Azure 虚拟机 (VM) 上创建 SQL Server 的选项。 有关依赖于默认值的简化 Azure PowerShell 示例,请参阅 Azure VM 上的 SQL Server PowerShell 快速入门;或者有关端到端脚本,请参阅使用 PowerShell 脚本创建 SQL Server VM

先决条件

若要完成本指南,你应具有:

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用订阅
  • 最新版本的 Azure PowerShell

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

定义变量

若要重复使用值并简化脚本创建,请先定义一些变量。 根据需要更改参数值,但在修改提供的值时,请注意与名称长度和特殊字符相关的命名限制。

首先定义要在整个脚本中使用的参数,例如资源组的位置、资源组的名称、要使用的 SQL Server 映像和存储帐户,以及网络和虚拟机属性。

位置和资源组

定义要在其中创建 SQL Server VM 和关联资源的数据区域、资源组和订阅。

根据需要进行修改,然后运行这些 cmdlet 以初始化这些变量。

$SubscriptionId = "<Enter Subscription ID>"
$Location = "<Enter Location>"
$ResourceGroupName = "<Enter Resource Group Name>"
$userName = "<Enter User Name for the virtual machine"

存储属性

定义存储帐户,以及虚拟机使用的存储类型。

根据需要进行修改,然后运行以下 cmdlet 以初始化这些变量。 我们建议将高级 SSD 用于生产工作负载。

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

注意

存储帐户名称的长度必须在 3 到 24 个字符之间,并且只能使用数字和小写字母,因此请确保你的资源组名称没有任何特殊字符,或者修改存储帐户的名称,以使用与 $ResourceGroupName 不同的名称。

网络属性

在虚拟机中定义网络使用的属性。

  • 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 映像。

可以使用 PowerShell 部署 Azure 门户中不可用的较旧的 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 市场获取。

  2. 使用 Get-AzVMImageSku 列出产品/服务的可用版本。

    Get-AzVMImageSku -Location $Location -Publisher 'MicrosoftSQLServer' -Offer $OfferName | Select Skus
    

在本教程中,请在 Windows Server 2022 上使用 SQL Server 2022 开发人员版 (SQLDEV-GEN2)。 Developer Edition 针对测试和开发自由授权,用户只需支付运行 VM 的成本:

$OfferName = "SQL2022-WS2022"
$PublisherName = "MicrosoftSQLServer"
$Version = "latest"
$Sku = "SQLDEV-GEN2"
$License = 'PAYG'

# Define a credential object
$SecurePassword = ConvertTo-SecureString '<strong password>' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)

创建资源组

打开 PowerShell,并通过运行 Connect-AzAccount 命令建立对 Azure 帐户的访问权限,然后使用 Set-AzContext 设置订阅上下文。 在系统提示时输入凭据。 使用登录 Azure 门户时所用的相同电子邮件和密码。

建立订阅上下文后,创建的第一个对象是资源组。 使用 Connect-AzAccount 命令连接到 Azure,并使用 Set-AzContext 设置订阅上下文。 使用 New-AzResourceGroup cmdlet 创建 Azure 资源组及其资源。 指定前面初始化的资源组名称和位置变量。

运行此 cmdlet 以连接到 Azure,建立订阅上下文并创建新的资源组:

# Set subscription context
Connect-AzAccount -Environment AzureChinaCloud
$subscriptionContextParams = @{
    SubscriptionId = $SubscriptionId
}
Set-AzContext @subscriptionContextParams

# Create a resource group
$resourceGroupParams = @{
    Name = $resourceGroupName
    Location = $Location
    Tag = @{Owner="SQLDocs-Samples"}
}
$resourceGroup = New-AzResourceGroup @resourceGroupParams

创建存储帐户

虚拟机需要使用存储资源来存储操作系统磁盘及 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 来创建虚拟子网配置。

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

创建虚拟网络

接下来,使用 New-AzVirtualNetwork cmdlet 在新资源组中创建虚拟网络。 指定前面初始化的名称、位置和地址前缀变量。 使用在上一步骤中定义的子网配置。

运行此 cmdlet 来创建虚拟网络:

# Create a virtual network
$VNet = New-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName -Location $Location -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig

创建公共 IP 地址

定义虚拟网络后,必须配置 IP 地址才能连接到虚拟机。 本教程使用动态 IP 地址创建公共 IP 地址,以支持 Internet 连接。 使用 New-AzPublicIpAddress cmdlet 在新资源组中创建公共 IP 地址。 指定前面初始化的名称、位置、分配方法和 DNS 域名标签变量。

注意

可以使用此 cmdlet 来定义公共 IP 地址的其他属性,但这已超出本初步教程的范围。 也可以创建专用地址或具有静态地址的地址,但这也超出了本教程的范围。

运行此 cmdlet 来创建公共 IP 地址。

# Create a public IP address
$PublicIp = New-AzPublicIpAddress -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName

创建网络安全组

为了保护 VM 和 SQL Server 流量,请创建网络安全组。

  1. 使用 New-AzNetworkSecurityRuleConfig 创建两个网络安全组规则,一个用于远程桌面 (RDP) 以允许 RDP 连接的规则,以及一个允许 TCP 端口 1433 上的流量的规则。 这样就可以通过 Internet 连接到 SQL Server。
# Create a network security group rule
$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
  1. 使用 New-AzNetworkSecurityGroup 创建网络安全组。
# Create a network security group
$Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName -Location $Location -Name $NsgName -SecurityRules $NsgRuleRDP,$NsgRuleSQL

创建网络接口

现在,可为虚拟机创建网络接口。 使用 New-AzNetworkInterface cmdlet 在新资源组中创建网络接口。 指定前面定义的名称、位置、子网和公共 IP 地址。

运行此 cmdlet 来创建网络接口。

# Create a network interface
$Interface = New-AzNetworkInterface -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id -NetworkSecurityGroupId $Nsg.Id

配置 VM 对象

现已定义存储和网络资源,接下来可以定义虚拟机的计算资源。

  • 指定虚拟机大小和各项操作系统属性。
  • 指定前面创建的网络接口。
  • 定义 Blob 存储。
  • 指定操作系统磁盘。

创建 SQL Server VM

若要创建 SQL Server VM,请先创建凭据对象,然后创建 VM。

创建一个凭据对象,以保留本地管理员凭据的名称和密码

必须先提供本地管理员帐户的凭据作为安全字符串,才能设置虚拟机的操作系统属性。 若要实现此目的,可使用 Get-Credential cmdlet。

运行以下 cmdlet。 需要在 PowerShell 凭据请求窗口中键入 VM 的本地管理员用户名和密码。

# Define a credential object
$SecurePassword = ConvertTo-SecureString '<strong password>' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)

定义属性并创建 VM

现在,你已准备好使用 New-AzVMConfig 设置虚拟机的操作系统属性,使用 New-AzVM 创建 VM,并使用 Add-AzVMNetworkInterface cmdlet 使用前面定义的变量添加网络接口。

示例脚本将执行以下操作:

  • 要求安装虚拟机代理
  • 指定 cmdlet 启用自动更新。
  • 指定前面初始化的虚拟机名称、计算机名和凭据变量。

运行此 cmdlet 来设置虚拟机的操作系统属性。

# Create a virtual machine configuration
$VMName = $ResourceGroupName + "VM"
$VMConfig = New-AzVMConfig -VMName $VMName -VMSize $VMSize |
    Set-AzVMOperatingSystem -Windows -ComputerName $VMName -Credential $Cred -ProvisionVMAgent -EnableAutoUpdate |
    Set-AzVMSourceImage -PublisherName $PublisherName -Offer $OfferName -Skus $Sku  -Version $Version |
    Add-AzVMNetworkInterface -Id $Interface.Id

# Create the VM
New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VMConfig

虚拟机已创建。

注意

如果收到有关启动诊断的错误,可将其忽略。 由于为虚拟机磁盘指定的存储帐户是高级存储帐户,因此会创建标准存储帐户用于启动诊断。

安装 SQL IaaS 代理扩展

SQL Server 虚拟机支持 SQL Server IaaS 代理扩展的自动管理功能。 若要将 SQL Server 注册到扩展,请在创建虚拟机后运行 New-AzSqlVM 命令。 指定 SQL Server VM 的许可类型,通过 Azure 混合权益 (AHUB) 在即用即付 (PAYG)、自带许可之间进行选择。 有关许可的详细信息,请参阅许可模式

若要将 SQL Server VM 注册到 SQL IaaS 代理扩展,请先使用 Register-AzResourceProvider 向资源提供程序注册订阅,然后使用 New-AzSqlVM 将 SQL Server VM 注册到 SQL IaaS 代理扩展:

# Register the SQL IaaS Agent extension to your subscription
Register-AzResourceProvider -ProviderNamespace Microsoft.SqlVirtualMachine

# Register SQL Server VM with the extension
New-AzSqlVM -Name $VMName -ResourceGroupName $ResourceGroupName -Location $Location -LicenseType $License

可通过三种方式注册到扩展:

停止或删除 VM

如果不需要让 VM 持续运行,可以在不使用它时将它停止,以免产生不必要的费用。 以下命令可停止 VM,但会保留它供将来使用。

Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

还可以使用 Remove-AzResourceGroup 命令永久删除与虚拟机关联的所有资源。 这样做也会永久删除虚拟机,因此请小心使用此命令。

完整脚本

有关提供端到端体验的完整 PowerShell 脚本,请参阅使用 PowerShell 在 Azure VM 上部署 SQL Server

创建虚拟机后,可以: