SQL Server Express を Azure SQL Database に移行する

この記事は、[Data Platform for Microsoft Azure Advent Calendar 2021](https://qiita.com/advent-calendar/2021/azure-data-platform)のための記事となります。
__本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。__

# はじめに
## SQL Server Express とは？
SQL Server には Express と Developer という２つの無償で利用可能なエディションがあります。なかでも、Express は、小規模で機能や容量の制限があるものの、現場主体でAccessのVBAアプリなんかを使っていたお客さんのマルチユーザー化に伴う規模拡大（それでも小さい）なんて用途でよく利用されています。

> SQL Server 2019 Express は、デスクトップ、Web、小規模サーバー向けのアプリケーションの開発と運用に最適な、SQL Server の無料エディションです。

引用元：[オンプレミスまたはクラウドで SQL Server をお試しください](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads#:~:text=SQL%20Server%202019%20Express%20is,web%2C%20and%20small%20server%20applications.) 

> Express Edition はエントリレベルの無料のデータベースで、学習や、デスクトップおよび小規模サーバー データ ドリブン アプリケーションの構築などに適しています。 このエディションは、独立系ソフトウェア ベンダー、開発者、クライアント アプリケーションを趣味で開発する開発者などに最適です。 さらに高度なデータベース機能が必要な場合には、 SQL Server Express を SQL Serverの他の上位バージョンにシームレスにアップグレードできます。 SQL Server Express LocalDB は、Express の簡易バージョンです。Express のプログラミング機能をすべて備えており、ユーザー モードで実行され、前提条件が少なく構成不要の高速インストールが可能です。

引用元：[SQL Server 2019 (15.x)の各エディションとサポートされる機能](https://docs.microsoft.com/ja-jp/sql/sql-server/editions-and-components-of-sql-server-version-15?view=sql-server-ver15)

違いについてやダウンロードは参考リンクをご覧ください。

## SQL Server Express を Azure SQL Database 移行するモチベーション
普通にOS上にインストールされて構築された SQL Server と PaaS である Azure SQL Database にはまず、[クラウドにおける共同責任](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/shared-responsibility#division-of-responsibility)で書かれているようにユーザー側が管理する部分が全く異なるというのが大きな違いとなります。さらに、Azure SQL Database はどのサービスを使用しても、必ず4ノードクラスタ構成をとるので、可用性、冗長性においてかなりのアドバンテージがあります。__手塩にかけてサーバのお世話がしたい__というモチベーションが無い限り、一般的にはPaaSでのおまかせ運用のほうがメリットがあります。

## データ移行のながれ
### DMA によるアセスメント
DMA (Data Migration Assistant) はSQL Serverをバージョンアップしたり、Azure SQL Database や SQL Managed Instance との互換性上問題になりうる項目をアセスメントするツールです。詳細は [Data Migration Assistant の概要](https://docs.microsoft.com/ja-jp/sql/dma/dma-overview?view=sql-server-ver15)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/c25f1fd5-d30c-e26e-56aa-1ec4fc5e2ae0.png)
今回のアセスメント結果はこんな感じ。Trace flag って機能がSQL Databaseでは対応してないよって言われてます。
互換性レベルの違いは特に問題なし。なので、なんの修正もせずに移行しちゃいます。


### 移行用 DMS （Azure Database Migration Service) のセットアップ
DMS（Azure Database Migration Service) は、Azure へのデータベースの移行を容易にするツールです。今回は__規模が小さい__ので、無償提供されている__Standardで充分__だと判断しました。
- サービスだけ先につくっておきます。残りのプロジェクト、アクティビティは移行元先をセットアップしてから作成します。


# 検証のながれ
今回の作業では、本番環境を想定してすべて仮想ネットワークに閉じた構成で実施しました。仮想マシンの存在する仮想ネットワークに PaaS である SQL Database と DMS をプライベートエンドポイント構成でつなぐだけです。
実環境であれば、この仮想ネットワークに対して企業のオフィスなどからVPNを張ったり、Express Routeを張るような形でセキュアにアクセスすればいいと思います。


## Express Edition の準備
- Azure 上の仮想マシンに適当にインストールします。Express Edition をインストールしたマシン以外からアクセスするためにはちょっとした設定が必要です。docs に[明記されています](https://docs.microsoft.com/ja-jp/sql/relational-databases/lesson-2-connecting-from-another-computer?view=sql-server-ver15&branch=main)のでご覧ください。
- Windows Firewall と Network Security Group のポートの確認もお忘れなく。
- Adventure Works をリストア。バックアップファイルは適当にOLTPあたりのものを使用。

## SQL Database の準備
- Serverless で作成します。論理サーバのネットワーク構成でプライベートエンドポイント以外設定しません。
- なぜ Serverless かというと、ずっと稼働している必要が無いからです。不要な時にストップしてくれるほうがコスト的に大満足。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/8be89b12-4af7-eb68-fa72-9b50b0b58377.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/25a8201d-ca35-9835-787b-af32de0a2f1e.png)

## DMS のプロジェクト、アクティビティ準備
ネットワーク構成さえできれば、基本的にウィザードポチポチで設定できてしまいます。ポイントだけスクリーンショット貼っておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/385a0568-f5e7-f95d-31f8-48f4b6309735.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/89123e29-43ab-3ea8-2c74-038a200cc0a5.png)
既存のVNET選択

出来上がったらプロジェクトをつくります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/beca7d05-94d5-edeb-76e6-01be1047b643.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/7ba39cc6-7aa9-fd95-78d1-a191eb102fe3.png)
このあたりもウィザードで選択していくだけですが、自分が迷ったのは SQL Server のインストールされたVMのホスト名の名前解決がDMSからはできなかったので、IPアドレス直打ちで対処しました。
お客様環境ではDNSフォワーダなどで名前解決の仕組み実装してると思いますので、この場では暫定対応を行いました。
Windows 認証でサーバー証明書を信頼するにチェックボックスを入れるとうまくいきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/3757037d-7d63-4128-a65f-6949779ad9d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/f2d62eaa-e7a0-3604-caf6-db38bcbd6310.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/82f90eba-b8b0-255d-f6b0-bd316f5228a3.png)
プロジェクトのできあがり。

### アクティビティの作成と実行
さて、プロジェクトができたのでアクティビティ（活動？）を作成します。
DMSではスキーマのみもしくはデータ移行かいずれかを選択することができます。
移行先にテーブルつくってない場合はスキーマをまず移行しましょう。
ウィザードポチポチで（略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/28ecb070-5fa0-2cd0-b462-76069b9b68c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/22375e4d-9aec-d2f5-d69f-2fa18dd8b6a1.png)
警告つきで完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/57b87fe5-2c3e-406d-5674-ea692967e4bd.png)
警告はこんな感じ。内容によっては対処してください。

データの移行をはじめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/0a3fb746-5150-6c82-18f4-84daba6641d1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/6a0236e0-bfa4-1938-757d-608fdf6419dd.png)
ウィザードにしたがって（略）とできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/f5f79547-bec4-2f73-1d26-263d7c88e1a1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/63bbf74f-e303-73cb-651a-aabe87fcc978.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/688a393e-0ed5-a35b-0a28-6be4ca952617.png)
本番だとソースを読み取りのみにして移行→切替ってこともできるのですが、今回はこのまま突っ走ります。
ターゲットデータベース、黒くてわかりにくいのですがプルダウンになってるのでSQL Database側のデータベースを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/f5b64c6c-c992-7809-4d1c-8caac7ff6130.png)
スキャンするのにちょっと時間かかって…こういう感じ
対象のテーブルを選択して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/5aa8e231-fc1d-a5fc-d9b3-fb9a1408ce76.png)
途中経過。

さて、これで移行できました。通常の SQL Server から PaaS 構成に移行することで、よりアプリケーションやデータそのものに集中できますね！
それでは素敵なクリスマスをお迎えください。



# 参考リンク
- [オンプレミスまたはクラウドで SQL Server をお試しください](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads#:~:text=SQL%20Server%202019%20Express%20is,web%2C%20and%20small%20server%20applications.)
- [SQL Server 2019 (15.x)の各エディションとサポートされる機能](https://docs.microsoft.com/ja-jp/sql/sql-server/editions-and-components-of-sql-server-version-15?view=sql-server-ver15)
- [クラウドにおける共同責任](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/shared-responsibility#division-of-responsibility)
- [Data Migration Assistant の概要](https://docs.microsoft.com/ja-jp/sql/dma/dma-overview?view=sql-server-ver15)
- [Azure Database Migration Service とは何ですか。](https://docs.microsoft.com/ja-jp/azure/dms/dms-overview)
- [Lesson 2: Connecting from Another Computer](https://docs.microsoft.com/ja-jp/sql/relational-databases/lesson-2-connecting-from-another-computer?view=sql-server-ver15&branch=main)
- [AdventureWorks サンプルデータベース](https://docs.microsoft.com/ja-jp/sql/samples/adventureworks-install-configure?view=sql-server-ver15&tabs=ssms)