使用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伺服器。
建立防火牆規則
預設SQL Database不允許任何外部連線,您可以將目前電腦的IP位址加入至SQL Database防火牆規則,並允許所有的Windows Azure服務存取該SQL Database伺服器。
下列指令碼示範透過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
執行結果如下圖:
管理防火牆規則
防火牆規則建立之後,可以使用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
執行結果如下圖:
若要移除特定防火牆規則,可以使用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
執行結果如下圖:
刪除SQL Database伺服器及SQL Database
若要移除SQL Databae只要使用Remove-AzureSqlDatabase cmdlet,下列指令碼示範移除單一SQL Database:
#刪除資料庫 #伺服器名稱及資料庫名稱 $servername='yip9i8y1gc' $dbname='masd-basic2' Remove-AzureSqlDatabase -ServerName $servername -DatabaseName $dbname
預設情況會出現對話視窗來詢問是否確定刪除,您也可以加入-force引數來直接刪除資料庫,但使用時請注意以免誤刪。
或是您也可以以迴圈方式批次刪除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 }