[SQL][Azure]SQL Server 2014 管理新功能─資料庫放置在 Azure Storage
在 Techday 2014 的時候剛好有聽到這一段,但之前在 CTP 的時候測試效果不佳,這次剛好聽到有介紹一個新的資料庫參數 Delayed Durability,就順便一起測試看看了。
基本上要測試資料庫檔案存放在 Azure,那就要先在 Azure 上面建立一個「儲存體」,這裡我先建立一個叫做 database 的 storage,並且在這個下面建立一個 dbf 的「容器」。
因為要把資料庫檔案放在 Azure 上面,因此我們必須建立一個「Shared Access Signature」, 但因為設定比較麻煩,因此就直接使用 Azure Storage Explorer 使用 GUI 介面來做設定。
我們先設定連線的資訊的時候,要記得這裡要勾選「Use HTTPS」
連上之後就選擇到我們所要放置檔案的容器,按下上方的「Security」的按鈕
開啟之後選擇「Shared Access Signatures」的頁籤,在這裡要注意有兩個地方要設定,一個是設定截止的日期,一個是存取的權限。這裡我們設定允許一年的期間可以對資料進行讀取和修改,設定好之後按下下方「Gererate Signature」的按鈕
此時要記得將下方這部分的資料給紀錄起來,等一下使用 SSMS 建立「認證」的時候會需要這些資訊。
當我們使用 SSMS 去建立認證的時候,「認證名稱」就是前一個步驟的第一行資訊 ( 不包含那個 ? ),「識別」的部分則是固定寫入「SHARED ACCESS SIGNATURE」,至於「密碼」的部分就是前一個步驟第二行到結尾的資訊。
等完成之後,就可以下指令手動去建立資料庫,並且將檔案指定存放在 Azure Storage 內了。
CREATE DATABASE TestDB1
ON ( NAME = TestDB1_data, FILENAME = 'https://database.blob.core.windows.net/dbf/TestDB1Data.mdf')
LOG ON (NAME = TestDB1_log, FILENAME = 'https://database.blob.core.windows.net/dbf/TestDB1Log.ldf')
GO
這樣我們就建立好資料庫了,從下了那段指令,會發覺這個跟以往建立在本機電腦上比較起來,會有感覺稍微慢一點,因此我們寫了一段程式來測試看看。首先先建立一個資料表 Table_1,裡面有兩個欄位 A1 和 A2,測試指令如下:
-- 清除資料表
TRUNCATE TABLE Table_1;
-- 不顯示訊息
SET NOCOUNT ON;
DECLARE @PTR INT ;
SET @PTR = 0 ;
-- 顯示開始時間
PRINT 'Start at ' + CAST( GETDATE() AS VARCHAR(20) ) ;
-- 跑迴圈填入 1000 筆資料
WHILE @PTR < 1000
BEGIN
INSERT INTO Table_1(A1,A2) VALUES ( @PTR , CAST( GETDATE() AS VARCHAR(20) ) );
SET @PTR += 1 ;
END ;
-- 顯示結束時間
PRINT 'End at ' + CAST( GETDATE() AS VARCHAR(20) ) ;
利用這樣的方式,我們連續測試 5 次取平均時間,大約花費 114 秒的時間。接著我們更改資料庫的屬性,在「選項」→「延遲持久性」的部分,將參數調整為「Forced」
接著我們在利用之前的測試程式,再連續測試 5 次取平均時間,調整之後大約花費 15 秒的時間,看起來時間有明顯的提升。因此如果使用 Azure Storage 來存放資料庫檔案的時候,可以配合 Delayed_Durability 的參數,縮短等待 Log 檔案寫入的時間。但上述的這些設定,只能改善因為要寫入 Log 檔案所造成的延遲,但如果要改善讀取的速度,則最好是再搭配「緩衝集區擴充」,利用 SSD 當成 Cahce 來做加速。
而將檔案放置在 Azure Storage 上的好處,最主要是可以讓不同的 SQL Server Instance 來使用,因此如果當我們把資料放入到資料庫內,需要將該資料庫給其他 SQL Server 來使用的話,只要在來源的 SQL Server 主機將該資料庫給「卸離」,另外的機器建立相同的認證資訊之後,就可以利用 「CREATE DATABASE FOR ATTACH」 的方式將資料庫給掛載上去。
CREATE DATABASE TestDB1onDest
ON
(NAME = TestDB1_data,
FILENAME = 'https://database.blob.core.windows.net/dbf/TestDB1Data.mdf' )
LOG ON
(NAME = TestDB1_log,
FILENAME = 'https://database.blob.core.windows.net/dbf/TestDB1Log.ldf')
FOR ATTACH
看起來這個算是一個不錯的資料交換方式,如果多台 SQL Server 之間需要交換資料,看起來可以很快地透過 Azure Storage ,大家很快地來掛上資料庫並且可以做資料維護,當維護完畢之後就把資料庫給「卸離」,讓其他主機也可以繼續使用。