Microsoft Fabric のミラーリング機能で Azure SQL Database と連携する

## はじめに
Microsoft Fabric (以降 Fabric) では、Ignite 2024 で Azure SQL Database とのミラーリングが一般公開されましたので、その機能に関して触れてみたいと思います。

Microsoft Fabric Advent Calendar 2024 の 17 日目の記事です。

https://qiita.com/advent-calendar/2024/msfabric

:::note warn
本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。
:::

## ミラーリング とは
ミラーリングは Fabric と外部のソースをほぼリアルタイムで連携する機能になります。ミラーリングには 3 種類ありますが、ここではテーブルのレプリケーションを示すデータベースミラーリングを対象にします。

以下の表にあるように、様々な種類の外部データソースが対象となっています。Ignite 2024 では他社製品の Snowflake へのミラーリングの一般公開に加えて、Azure SQL Database への機能も一般公開されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/b7a9b618-6539-4427-4605-b16b078d1317.png)

[ミラーリングの種類](https://learn.microsoft.com/ja-jp/fabric/database/mirrored-database/overview#types-of-mirroring)

ミラーリング機能によって、リレーショナルデータベースである Azure SQL Database で生じたトランザクションをほぼリアルタイムで Fabirc に連携することができます。その結果、トランザクションで生じたデータも Fabric 上のデータと組み合わせて分析を行うことが可能です。

## 制限事項

利用に際して対象となるテーブル、列に関していくつか制限がありますが、それはこちらにまとめられています。特に利用可能な Fabric のリージョンに関しては、一覧がありますので試される際にはご確認ください。

[Azure SQL データベースからの Microsoft Fabric ミラー化データベースの制限事項](https://learn.microsoft.com/ja-jp/fabric/database/mirrored-database/azure-sql-database-limitations)

その他には、ミラーリング機能の対象となる Azure SQL Database 側のサービスレベルについても記載があります。

[階層と購入モデルのサポート](https://learn.microsoft.com/ja-jp/fabric/database/mirrored-database/azure-sql-database#tier-and-purchasing-model-support)

## 手順
以下の公開情報に具体的な手順がありますので、こちらを参考に進めていきます。

[チュートリアル: Azure SQL Database から Microsoft Fabric ミラー化データベースを構成する](https://learn.microsoft.com/ja-jp/fabric/database/mirrored-database/azure-sql-database-tutorial)

1.Azure SQL Database を作成する
既に Azure SQL Database が存在する場合は、手順 1 はスキップしても問題ありません。
以下の公開情報に沿って Azure SQL Database を作成することができます。

その際には、ミラーリングがサポートされるサービスレベルである必要があります。今回は、Standard S3 (DTU 100) で作成しました。

[クイックスタート: 単一データベースを作成する - Azure SQL Database](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/single-database-create-quickstart?view=azuresql&tabs=azure-portal)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/bba06b7e-331a-3ae0-daf9-5682deb31504.png)

2.マネージド ID を有効にします
Azure Portal 上の Azure SQL Database の論理サーバーの [ID] から、マネージド ID を有効化します。
ここではシステム割り当て ID とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/5c7f7d05-b8a2-f6e7-1e53-80d0ff8c4805.png)


3.Azure SQL Database にアクセスします
SQL Server Management Studio (SSMS) などから権限のあるユーザーで、Azure SQL Database にログインします。

[クイック スタート:SSMS を使用して Azure SQL Database または Azure SQL Managed Instance に接続してクエリを実行する](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/connect-query-ssms?view=azuresql)

4.ログインを生成します
作成した Azure SQL Database の master データベースにアクセスし、ログインを生成するため以下のクエリを実行します。

```sql
CREATE LOGIN fabric_login WITH PASSWORD = '<strong password>';
ALTER SERVER ROLE [##MS_ServerStateReader##] ADD MEMBER fabric_login;
```

5.ユーザーの作成します
上記ログインに紐づくユーザーを作成するため、ミラーリング対象データベースにアクセスし、以下のクエリを実行します。

```sql
CREATE USER fabric_user FOR LOGIN fabric_login;
GRANT CONTROL TO fabric_user;
```

6.データベース上にテーブルを作成します
以下のクエリでテーブルを作成しておきます。
こちらのリンクのデータを参考に、New York のタクシーの乗車に関するトランザクションデータが生じるようなシナリオを想定します。

[TLC Trip Record Data](https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page)

```sql
-- テーブルの作成
CREATE TABLE YellowTaxiTripRecords (
    TripID INT PRIMARY KEY,
    PickupDateTime DATETIME,
    DropoffDateTime DATETIME,
    PickupLocationID INT,
    DropoffLocationID INT,
    TripDistance FLOAT,
    FareAmount DECIMAL(10, 2),
    RateCodeID INT,
    PaymentType INT,
    PassengerCount INT
);
```


7.ミラー化 Azure SQL データベースを選択します
Fabric ポータルにアクセスして、ワークスペースから [作成] アイコンを選択します。
[データ ウェアハウス] セクションにおいて、[ミラー化された Azure SQL Database] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/7b4a6e05-3e6d-6827-bb0d-2fba256c9d1f.png)


8.ミラー化 Azure SQL データベースを設定します
[新しいソース] で [Azure SQL Database] を選択し、[新規接続] から以下を入力していきます。

- サーバー: server-name.database.windows.net の形式で、Azure portal の対象サーバーの [概要] ページから確認できます
- データベース: Azure SQL データベースの名前を入力します
- 接続: 新規接続を作成します
- 接続名: 自動的に名前が指定されますが、変更も可能です
- 認証の種類: 基本 (SQL 認証)
- ユーザー名: 手順 4 で作成した fabric_login に該当するログイン名を入力します
- パスワード: 手順 4 のログイン作成時に設定したパスワードを入力します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/cf786b9c-c8a4-60b7-4e03-99c4f89816e4.png)

9.ミラーリングするテーブルを選択します
ミラーリングの構成が適切に完了すると、Fabric 側の設定画面から [YellowTaxiTripRecords] テーブルを確認できるためミラーリングの対象として選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/67e9612c-0c66-0a77-8aa7-fe842dda620a.png)

10.データベース側で更新を行います
再度 Azure SQL Database に接続し、データベース側でトランザクションが生じたとして、以下のクエリを実行します。

```sql
INSERT INTO YellowTaxiTripRecords (TripID, PickupDateTime, DropoffDateTime, PickupLocationID, DropoffLocationID, TripDistance, FareAmount, RateCodeID, PaymentType, PassengerCount)
VALUES
(1, '2024-12-01 08:00:00', '2024-12-01 08:15:00', 1, 2, 3.5, 12.50, 1, 1, 1),
(2, '2024-12-01 09:00:00', '2024-12-01 09:25:00', 3, 4, 5.0, 18.75, 1, 2, 2),
(3, '2024-12-01 10:00:00', '2024-12-01 10:20:00', 5, 6, 2.8, 10.00, 2, 1, 1),
(4, '2024-12-01 11:00:00', '2024-12-01 11:20:00', 7, 8, 4.2, 15.00, 1, 1, 3),
(5, '2024-12-01 12:00:00', '2024-12-01 12:30:00', 9, 10, 6.0, 20.50, 2, 2, 1),
(6, '2024-12-01 13:00:00', '2024-12-01 13:15:00', 11, 12, 3.0, 12.00, 1, 1, 2),
(7, '2024-12-01 14:00:00', '2024-12-01 14:25:00', 13, 14, 5.5, 18.00, 2, 2, 1),
(8, '2024-12-01 15:00:00', '2024-12-01 15:20:00', 15, 16, 4.0, 14.75, 1, 1, 3),
(9, '2024-12-01 16:00:00', '2024-12-01 16:30:00', 17, 18, 6.5, 22.00, 2, 2, 2),
(10, '2024-12-01 17:00:00', '2024-12-01 17:15:00', 19, 20, 3.2, 11.50, 1, 1, 1);
```

11.テーブルが更新されていることを確認する
上記クエリを実行してから少々待機すると、[レプリケーションの監視] にて、10 行更新されたことが表示されます。
[ミラー化された Azure SQL Database] の右上から [SQL 分析エンドポイント] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/1a25c507-58a8-6b1c-cb32-33a2e0eb26c0.png)

以下のように [Tables] の配下に YellowTaxiTripRecords テーブルが作成されており、ID 10 まで反映されていることが見受けられます。
これでデータベースにて生じた更新を Fabric でほぼリアルタイムにレプリケートされることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/10b16c82-b9e4-f34e-9dae-3a2085f18ff2.png)

## ミラーリングしたデータの活用
ミラーリングしたことで Fabric 上から Azure SQL Database のデータを確認できましたが、これをレイクハウス上に存在するテーブルと組み合わせて分析したいと思います。

1.レイクハウスでショートカットを作成します
対象のレイクハウスの Tables から [新しいショートカット] を選択し、内部ソースの [Microsoft OneLake] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/004b9c18-5286-9630-2ccc-12668b8a807f.png)

2.データソースの種類を選択します
データソースとして、先ほど作成した [ミラー化された Azure SQL Database] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/9ee7bbba-810c-6c16-0b1d-f86bd4c25c72.png)

3.テーブルを選択します。
対象となるテーブル YellowTaxiTripRecords を選択し作成を行うことで、テーブルをレイクハウス上に作成することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/a89a00dd-b103-04cc-99b4-6596ef91304c.png)

4.レイクハウスの SQL 分析エンドポイントからデータを参照します。
対象レイクハウスの [SQL 分析エンドポイント] から以下のクエリを実行することで、YellowTaxiTripRecords を参照可能できます。

```sql
SELECT * FROM YellowTaxiTripRecords;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/a81c4c6c-cd63-8d65-3d02-80f56c941340.png)

今回のシナリオでは、参照した New York のタクシーのサイトから、zone id と紐づくデータが保存されている taxi_zone_lookup.csv を予めダウンロードし、レイクハウス上にテーブルとして取り込んでいます。
こちらも同様に SELECT クエリで参照することができ、以下のような出力結果になります。

```sql
SELECT * FROM taxi_zone_lookup;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/c7792382-c257-f276-61c9-4a4c384d855c.png)

taxi_zone_lookup テーブルの結果を参考に YellowTaxiTripRecords と JOIN することで、Azure SQL Database に存在するデータと Fabric 上に存在するデータを組み合わせて分析が可能です。

```sql
SELECT * FROM YellowTaxiTripRecords as YR join taxi_zone_lookup TZ on YR.PickupLocationID = TZ.LocationID;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/2a2437bf-8127-5ea6-cc27-6b3a8d2e5c0b.png)

## まとめ
Microsoft Fabric で一般公開された Azure SQL Database に対するミラーリング機能によって、データベースで生じた変更をほぼリアルタイムにレプリケートできることを確認しました。加えて、Fabric 上に存在するデータを組み合わせた分析に関しても検証しました。
ミラーリング機能に関しては今後もアップデートが期待されますので、様々な外部リソースとのスムーズな連携が注目されています。