[SQL][Azure]SQL Server 2012 將備份資料放至Microsoft Azure儲存體內

[SQL][Azure]SQL Server 2012 也可以將備份資料放至 Microsoft Azure 儲存體內

在前一篇「將資料庫備份存放至 Microsoft Azure 儲存體內」所介紹的方式,主要是搭配 SQL Server 2014 的新功能來做的。雖然 SQL Server 2012 SP1 CU2 之後也有這樣的功能,但 CU 畢竟不算是正式的 Service Pack,因此以下我們將使用 SSIS,來完成這樣的工作。

 

首先會比較麻煩,要先取得 Azure SDK 的相關檔案

image

 

因為我們後續要採用 SSIS 的「指令碼工作」來負責上傳處理,因此要先透過 gacutil 的工具程式,將上述的 Assembly 檔案註冊到全域組件快取(GAC) 內,這樣才有辦法正常使用。這裡要特別注意的有兩個部分:

1. 當使用 gacutil 的時候,必須要「以系統管理員身份執行」,否則會無法將檔案正常註冊。

2. 如果使用 gacutil 的時候,要注意是否有出現訊息,如果沒有任何訊息,則可能是缺少了 gacutlrc.dll 的檔案。

 

當我們進行註冊之後,就會出現類似以下的訊息,則表示有順利將檔案註冊到全域組件快取內了。

image

 

此時我們可以使用 Visual Studio 2012 ( 必須先安裝 Business Intelligence for Visual Studio 2012 ) ,建立一個新的 「Integration Services 專案」,分別貼上三個元件:

1. 「運算式工作」 : 更改名稱為 "組合備份指令",將參數所指定的資料庫名稱($Package::Database)、備份檔案路徑($Package::BackupPath)、備份檔案名稱($Package::BackupFile) 這三個組合成為備份指令,存放到變數內 (User:: SQL) 內

image

 

2. 「執行SQL工作」: 更改名稱為"資料庫備份",主要是執行前面一個組合備份指令中的變數,將指定的資料庫備份先備份到檔案中

image

 

3. 「指令碼工作」: 更改名稱為"Azure上傳",主要是將前面所備份出來的檔案上傳到 Azure 的儲存體,這一段內比較複雜,我分幾個小段說明

a. 設定傳入到指令碼內可讀取的變數 (ReadOnlyVariable),我們設定將備份檔名和備份路徑給傳入image

 

b. 將 「Microsoft.WindowsAzure.Storage」 這個 Assembly 加入參考

image

 

c. 在程式碼中 Namespaces 區域內加入關聯 「Microsoft.WindowsAzure.Storage」、「Microsoft.WindowsAzure.Storage.Auth」、「Microsoft.WindowsAzure.Storage.Blob

image

 

d. 加入一段負責上傳的程序 UploadToAzure,並且在 Main() 的程序內加入上傳到 Azure 的相關參數值後,呼叫 UploadToAzure 的程序進行上傳

image

 

完成之後會排列成為這樣

image

 

接下來我們就可以在設定一些參數的預設值來進行測試

image

image

 

測試沒有問題之後,我們就可以採用「專案佈署模式」 ( Project Depolyment Model ) ,將這個封裝上傳到 SSISDB 內,那麼以後有需要備份的時候,就可以直接傳入參數使用該封裝,或者是由其他封裝來呼叫該封裝進行備份到 Azure。

 

後記 : 在測試過程中發現一些狀況,由於不小心測試到一個很大的資料庫,加上又沒有採用備份壓縮,導致上傳過程中被迫臨時斷線,但很麻煩的是造成上傳的檔案會卡在 Azure 的 Storage 上無法刪除,感謝 Azure 的神人小朱大大提供的範例,讓我順利透過 PowerShell 來解決,如果有類似狀況的朋友,可以參考以下兩篇資料:

1. SQL Server Backup to Cloud – Managing Interrupted backups

2. Breaking leases on locked blobs - SQL Server backups to Cloud