使用PowerShell管理Microsoft Azure SQL Database

使用PowerShell管理Microsoft Azure SQL Database

說明

Microsoft Azure推出Automation(自動化)服務讓您可以運用可高度擴充且可靠的工作流程執行引擎,以自動化的方式來針對Microsoft Azure中各項資源,進行建立、部署、監控和維護作業。過去使用Azure管理入口網站所提供的GUI介面進行各項Azure服務的相關作業,隨著使用的服務越來越多以及雲端架構越來越複雜,必須要有一套更便捷的方法來幫助您更有效率的工作,通常這些重複性的工作都需要倚靠一些批次作業來完成,在這樣的情境下,Microsoft Azure PowerShell就相當適合用在這個地方,您可以單獨執行或是和Automation整合,對IT PRO管理Azure上所使用的服務而言,PowerShell是一個不可或缺的好幫手。

本文將介紹幾個使用PowerShell來管理SQL Database的範例,詳細內容請見下一節。

學習目標

一、建立SQL Database伺服器。

二、建立防火牆規則。

三、管理防火牆規則。

四、建立SQL Database。

五、刪除SQL Database伺服器及SQL Database。

建立SQL Database伺服器

透過New-AzureSqlDatabaseServer cmdlet可以幫助您以指令的方式來建立SQL Database伺服器,下列指令碼示範在Azure的東亞資料中心裡建立一台SQL Database伺服器。

#Azure SQL DB伺服器登入名稱、密碼以及資料中心
$login='dba'
$password='p@ssw0rD'
$region='East Asia'
#建立Azure SQL DB伺服器
$azuresqldbserver = New-AzureSqlDatabaseServer -Location $region -AdministratorLogin $login -AdministratorLoginPassword $password

您可以在執行完上述指令碼之後,連接到Azure管理入口網站來查看PowerShell是否幫我們建立SQL Database伺服器。

image

建立防火牆規則

預設SQL Database不允許任何外部連線,您可以將目前電腦的IP位址加入至SQL Database防火牆規則,並允許所有的Windows Azure服務存取該SQL Database伺服器。

image

下列指令碼示範透過New-AzureSqlDatabaseServerFirewallRule及Remove-AzureSqlDatabaseServerFirewallRule cmdlet來建立/移除SQL Database允許Windows Azure服務存取SQL Database伺服器的防火牆規則:

#建立允許所有Azure服務存取Azure SQL DB伺服器的防火牆規則
$azuresqldbserver | New-AzureSqlDatabaseServerFirewallRule -AllowAllAzureServices -RuleName 'AllowedServices'
#移除允許所有Azure服務存取Azure SQL DB伺服器的防火牆規則
$azuresqldbserver | Remove-AzureSqlDatabaseServerFirewallRule -RuleName 'AllowedServices'

在管理入口網站很貼心的在Current Client IP Address欄位顯示您的目前電腦的外部IP,若要允許您的電腦存取SQL Database伺服器,只要按右側的箭頭接著按儲存即可。而在PowerShell就沒這麼方便,筆者透過Aman Dhally所寫的一支PowerShell指令碼來取得外部IP,將下列指令碼儲存在一個名為取得外部IP的ps1檔案中。

<# 
            " Satnaam WaheGuru Ji"     
             
            Author  :  Aman Dhally 
            E-Mail  :  amandhally@gmail.com 
            website :  www.amandhally.net 
            twitter : https://twitter.com/#!/AmanDhally 
            facebook: http://www.facebook.com/groups/254997707860848/ 
            Linkedin: http://www.linkedin.com/profile/view?id=23651495 
 
            Date    : 03-Oct-2012 
            File    : static-Ip 
            Purpose : Get Static Ip adress of the Internet 
             
            Version : 1 
 
            my Spider runned Away :(  
 
 
#> 
 
#Variables 
    # I am defining website url in a variable 
    $url = "http://checkip.dyndns.com"  
    # Creating a new .Net Object names a System.Net.Webclient 
    $webclient = New-Object System.Net.WebClient 
    # In this new webdownlader object we are telling $webclient to download the 
    # url $url  
    $Ip = $webclient.DownloadString($url) 
    # Just a simple text manuplation to get the ipadress form downloaded URL 
    # If you want to know what it contain try to see the variable $Ip 
    $Ip2 = $Ip.ToString() 
    $ip3 = $Ip2.Split(" ") 
    $ip4 = $ip3[5] 
    $ip5 = $ip4.replace("</body>","") 
    $FinalIPAddress = $ip5.replace("</html>","") 
 
#Write Ip Addres to the console 
    $FinalIPAddress 
 
### end of the script..... 
################################|-Aman Dhally - |-############################# 

然後利用下列指令碼來將外部IP存放在變數$ip裡。

$ip = &'.\SkyDrive\Windows Azure\取得對外IP.ps1'

最後就可以使用New-AzureSqlDatabaseServerFirewallRule cmdlet來建立允許本機電腦連接SQL Database伺服器:

#建立防火牆規則
$rulename='MyFWRule'
$azuresqldbserver | New-AzureSqlDatabaseServerFirewallRule -RuleName $rulename -StartIpAddress $ip -EndIpAddress $ip

執行結果如下圖:

image

管理防火牆規則

防火牆規則建立之後,可以使用Set-AzureSqlDatabaseServerFirewallRule cmdlet來修改防火牆規則,下列指令碼示範將MyFWRule的IP位址修改成2.2.2.2。

$newstartipaddr='2.2.2.2'
$newendipaddr='2.2.2.2'
$azuresqldbserver | Set-AzureSqlDatabaseServerFirewallRule -RuleName $rulename -StartIpAddress $newstartipaddr -EndIpAddress $newendipaddr

執行結果如下圖:

image

若要移除特定防火牆規則,可以使用Remove-AzureSqlDatabaseServerFirewallRule cmdlet:

Remove-AzureSqlDatabaseServerFirewallRule -ServerName 'yip9i8y1gc' -RuleName 'MyFWRule'

或是搭配Get-AzureSqlDatabaseServerFirewallRule cmdlet取得防火牆規則集合後再逐一刪除:

$fwrs = $azuresqldbserver | Get-AzureSqlDatabaseServerFirewallRule

#移除所有防火牆規則
foreach ($fwr in $fwrs)
{
   $fwr | Remove-AzureSqlDatabaseServerFirewallRule
}

建立SQL Database

下列的指令碼示範透過Get-AzureSqlDatabaseServer cmdlet取得SQL Database伺服器管道物件後,傳給New-AzureSqlDatabase cmdlet來建立SQL Database:

#Azure SQL DB的名稱、版本、大小上限以及定序 todo
$servername='yip9i8y1gc' 
$dbname='masd-basic'
$edition='Basic'
$maxdbsizegb = 2
$collate = 'Chinese_Taiwan_Stroke_CI_AS'
#建立Azure SQL DB
Get-AzureSqlDatabaseServer -ServerName $servername | New-AzureSqlDatabase -DatabaseName $dbname -Edition $edition -MaxSizeGB  $maxdbsizegb -Collation $collate

執行結果如下圖:

image

刪除SQL Database伺服器及SQL Database

若要移除SQL Databae只要使用Remove-AzureSqlDatabase cmdlet,下列指令碼示範移除單一SQL Database:

#刪除資料庫
#伺服器名稱及資料庫名稱
$servername='yip9i8y1gc' 
$dbname='masd-basic2'
Remove-AzureSqlDatabase -ServerName $servername -DatabaseName $dbname

預設情況會出現對話視窗來詢問是否確定刪除,您也可以加入-force引數來直接刪除資料庫,但使用時請注意以免誤刪。

image

或是您也可以以迴圈方式批次刪除SQL Database,例如下列指令碼:

#刪除SQL Database
foreach ($db in $sqldbs)
{
   Remove-AzureSqlDatabase -ServerName $servername -DatabaseName $db.Name
 }

除了逐一刪除資料庫之外,也可以直接以下列cmdlet直接刪除SQL Database伺服器:

#刪除SQL Database伺服器
$servername='yip9i8y1gc' 
Remove-AzureSqlDatabaseServer -ServerName $servername

完整程式碼

請將下列指令碼中出現todo的部分修改成您自己的內容。

建立SQL Database伺服器及防火牆

#取得認證 todo
$azuresubacct = 'Azure訂用帳戶'
$cre=Get-Credential -Credential $azuresubacct

#Azure訂用帳戶名稱
$selectsub='MSDN - VS Premium'
#選擇作用中的Azure訂用帳戶
$currentsub=Select-AzureSubscription -Name $selectsub

#Azure SQL DB伺服器登入名稱、密碼以及資料中心 todo
$login='dba'
$password='p@ssw0rD'
$region='East Asia'
#建立Azure SQL DB伺服器
$azuresqldbserver = New-AzureSqlDatabaseServer -Location $region -AdministratorLogin $login -AdministratorLoginPassword $password

#建立允許所有Azure服務存取Azure SQL DB伺服器的防火牆規則
$azuresqldbserver | New-AzureSqlDatabaseServerFirewallRule -AllowAllAzureServices -RuleName 'AllowedServices'
#移除允許所有Azure服務存取Azure SQL DB伺服器的防火牆規則
$azuresqldbserver | Remove-AzureSqlDatabaseServerFirewallRule -RuleName 'AllowedServices'

#取得對外IP位址
$ip = &'.\SkyDrive\Windows Azure\取得對外IP.ps1'

#建立防火牆規則
$rulename='MyFWRule'
$azuresqldbserver | New-AzureSqlDatabaseServerFirewallRule -RuleName $rulename -StartIpAddress $ip -EndIpAddress $ip

#取得防火牆規則
$myfwrule=$azuresqldbserver | Get-AzureSqlDatabaseServerFirewallRule
#更新防火牆規則
$newstartipaddr='2.2.2.2'
$newendipaddr='2.2.2.2'
$azuresqldbserver | Set-AzureSqlDatabaseServerFirewallRule -RuleName $rulename -StartIpAddress $newstartipaddr -EndIpAddress $newendipaddr

#取得防火牆規則
$fwrs = $azuresqldbserver | Get-AzureSqlDatabaseServerFirewallRule
#移除所有防火牆規則
foreach ($fwr in $fwrs)
{
  $fwr | Remove-AzureSqlDatabaseServerFirewallRule
}

建立SQL Database

 

#取得認證 todo
$azuresubacct = 'Azure訂用帳戶'
$cre=Get-Credential -Credential $azuresubacct

#Azure訂用帳戶名稱
$selectsub='MSDN - VS Premium'
#選擇作用中的Azure訂用帳戶
$currentsub=Select-AzureSubscription -Name $selectsub

#Azure SQL DB的名稱、版本、大小上限以及定序 todo
$servername='yip9i8y1gc' 
$dbname='masd-basic'
$edition='Basic'
$maxdbsizegb = 2
$collate = 'Chinese_Taiwan_Stroke_CI_AS'
#建立Azure SQL DB
Get-AzureSqlDatabaseServer -ServerName $servername | New-AzureSqlDatabase -DatabaseName $dbname -Edition $edition -MaxSizeGB  $maxdbsizegb -Collation $collate

查詢SQL Database伺服器及防火牆規則

 

#取得認證 todo
$azuresubacct = 'Azure訂用帳戶'
$cre=Get-Credential -Credential $azuresubacct

#Azure訂用帳戶名稱
$selectsub='MSDN - VS Premium'
#選擇作用中的Azure訂用帳戶
Select-AzureSubscription -Name $selectsub

#取得作用中Azure訂用帳戶中有哪些Azure SQL DB伺服器及防火牆規則
$azuresqldbserver=Get-AzureSqlDatabaseServer
if ($azuresqldbserver -eq $null)
{    
    $msg='Azure訂用帳戶'+$selectsub+'中找不到SQL Database伺服器。'
    Write-Verbose  $msg
}
else
{
    foreach($srv in $azuresqldbserver)
    {
      $srv | Select-Object ServerName,Location | Get-AzureSqlDatabaseServerFirewallRule | Select-Object RuleName,StartIpAddress,EndIpAddress    
    }
}

刪除SQL Database伺服器及SQL Database

#取得認證 todo
$azuresubacct = 'Azure訂用帳戶'
$cre=Get-Credential -Credential $azuresubacct

#Azure訂用帳戶名稱
$selectsub='MSDN - VS Premium'
#選擇作用中的Azure訂用帳戶
$currentsub=Select-AzureSubscription -Name $selectsub

#取得SQL Database伺服器
$servername='yip9i8y1gc' 
$sqldbsrv=Get-AzureSqlDatabaseServer -ServerName $servername

#取得SQL Database
$sqldbs=$sqldbsrv | Get-AzureSqlDatabase | Where-Object {$_.Edition -ne 'System'} | Select-Object Name,Edition

if ($sqldbs -eq $null)
{
    $msg='找不到任何SQL Database。'
    Write-Verbose $msg
}
else
{
    #刪除SQL Database
    foreach ($db in $sqldbs)
    {
     Remove-AzureSqlDatabase -ServerName $servername -DatabaseName $db.Name
    }
}

#刪除SQL Database伺服器
if ($sqldbsrv -eq $null)
{
    $msg='找不到SQL Database伺服器' + $servername + '。'
    Write-Verbose $msg
}
else
{
  Remove-AzureSqlDatabaseServer -ServerName $servername
}

參考資料

Azure SQL Database Cmdlets

Windows Azure SQL Database Management with PowerShell