如何透過 T-SQL 快速建立 SQL 彈性集區中的資料庫 | The Will Will Web

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何透過 T-SQL 快速建立 SQL 彈性集區中的資料庫

Azure SQL DatabaseElastic pools (彈性集區) 對於我們這種需要大量測試用資料庫,但又大多都是低用量的用戶使用,可以節省大量的雲端費用。不過 Azure SQL Database 還是有幾個很雷的地方,一不小心就會燒掉很多錢。

瞭解 Azure SQL Database 與 Azure SQL Server 的基本概念

  • 基本架構

    • Azure SQL Server 主要用來管理伺服器層級的物件
      • 這個服務類型都是雲端代管的
      • 可以設定預設管理者帳戶
      • 可以設定設定防火牆,限制 IP 來源存取
      • 可以重置預設最高權限管理員的密碼
      • 可以設定 Active Directory admin (可授權到一個群組)
      • 可以新增刪除 Azure SQL Database 資料庫
      • 可以連結 SQL 彈性集區 (SQL elastic pools) 資源
    • Azure SQL Database 主要用來管理資料庫層級的物件
      • 你可以在資料庫中設定使用者登入的對應,跟你在地端的 SQL 資料庫一樣
      • 其他大部分物件都可以跟地端的 SQL Server 資料庫沒有太大差異 (只有些微差異)
  • 收費方式

    • 所有 Azure SQL Server 都是免費的
      • 你想在 master 資料庫建立多少 登入 (Login) 都可以
    • 所有 Azure SQL Database 都是收費的
      • 每個資料庫都可以設定服務等級,價格也落差很大!

使用 Azure Active Directory 授權

我們公司是使用 Azure AD 來進行授權,非常方便管理與設定。

關於 SQL 彈性集區 (SQL elastic pools)

SQL 彈性集區 (SQL elastic pools) 是一種獨立的資源,可以與其中一台 Azure SQL Server 進行綁定。

所謂的「彈性集區」就是一個可以幫你管理多個 Azure SQL Database 資料庫,並將所有加入到「彈性集區」的 Azure SQL Database 資料庫,全部當成「一個資料庫」來計費,所有資料庫的 DTU 全部加總之後,就是你必須購買的等級。

請注意,使用 SQL 彈性集區必須與一台 Azure SQL Server 連結,然後從 SQL 彈性集區建立 Azure SQL Database 資料庫,所有計費才會被算在集區中!

超大的計費地雷

首先,我們可以先透過 SQL Server Management Studio (SSMS) 連線到 Azure SQL Server 的 master 資料庫,並且直接在上面建立資料庫!

SQL Server Management Studio (SSMS) 建立資料庫

🔥 我勸你千萬不要這麼做,除非你口袋夠深! 🔥

因為透過 SSMS 建立的資料庫,即便 Azure SQL Server 與 Azure SQL elastic pool 連結,預設還是會以「單一資料庫」的方式計價,而且預設選用的等級為 GP_Gen5_232GB 資料量。講規格大家沒感覺,這份規格每個月至少約新台幣 NT$ 14,829 元,如果你只是想要拿來當測試資料庫的話,下個月看到帳單你就會想哭了!

當然,建立資料庫的時候,其實是可以選取 SLO (Service Level Objectives) 服務等級的!如下圖示:

SSMS 設定 SLO (Service Level Objectives)

如何直接從 SSMS 建立資料庫並使用 Azure SQL elastic pool 計費

我們建立資料庫之前,要先決定三個要素:

  1. 資料庫名稱:sampledb
  2. 資料定序名稱:Chinese_Taiwan_Stroke_CI_AS
  3. 彈性集區名稱:MyElasticPool

那麼你建立資料庫的命令就會是:

CREATE DATABASE [sampledb] COLLATE Chinese_Taiwan_Stroke_CI_AS
(
  SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
)

如何複製一個現有資料庫並直接加入 SQL 彈性集區

如果你想要對一份正式運作中的資料庫進行複製,可以在複製的同時直接加入 SQL 彈性集區,以節省費用!

假設有個既有的資料庫叫做 AIRDB,我們可以用以下語法快速複製一份完整的資料庫:

CREATE DATABASE [sampledb] AS COPY OF AIRDB
(
  SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
)

由於使用 SQL 彈性集區的關係,無論你建立多少資料庫副本,都不會增加額外的資料庫費用!👍

如果將既有的「單一資料庫」移至「SQL 彈性集區」

  1. 我們架設建立一個 Basic 等級的 SQL 資料庫

    CREATE DATABASE [sampledb] COLLATE Chinese_Taiwan_Stroke_CI_AS
    (
        EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic', MAXSIZE = 2 GB
    );
    
  2. 接著我們可以用以下語法將現有的資料庫移至既有的 SQL 彈性集區

    ALTER DATABASE [sampledb] MODIFY (
        SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
    );
    

查詢所有資料庫的 SLO 名稱與等級

你可以在特定 Azure SQL Server 伺服器下查詢所有資料庫的各種資源管理資訊,其中包含 SLO 名稱:

SELECT database_name, slo_name, cpu_limit, max_db_memory, max_db_max_size_in_mb
FROM sys.dm_user_db_resource_governance

相關連結