Azure Database for MySQL Import を使ってシングルサーバーからフレキシブルサーバーに移行した

2024.01.28

いわさです。

Azure Database for MySQL にはシングルサーバーと、フレキシブルサーバーの 2 つのデプロイオプションがあります。
フレキシブルサーバーは 2020 年 9 月にプレビューリリースされた新しいデプロイオプションで、現在はこちらの利用が推奨されています。

そして旧型のシングルサーバーは 2024 年 9 月 16 日に廃止される予定となっており、実際に本日時点では Azure ポータルからは新規シングルサーバーを作成することは出来ません。

移行してみるか...

私もシングルサーバーで、現在はほぼ使っていないリソースがいくつかありました。
これまでは Azure Database Migration Service を使って移行する方法が推奨されており、公式ドキュメント上もそのように案内されていましたが、ちょっと重いというか、どうにもやる気が出ませんでした。

しかし、先日の Azure アップデートでシングルサーバーからフレキシブルサーバーへのインポート機能が一般提供されました。

なんと Azure CLI のコマンド一発で、環境設定やデータを引き継いだ状態でフレキシブルサーバーを起動出来るようです。これは簡単そうで良いですね。

本日は事前にお試ししておこうと、新規のシングルサーバーからフレキシブルサーバーへの移行を試してみましたので、その様子を紹介します。

新規シングルサーバーを Azure CLI で作成

前述のとおり、現在は Azure ポータルから Azure Database for MySQL のシングルサーバーを作成する導線は削除されています。
ただし既存シングルサーバーの設定変更や操作は引き続きポータル上からも可能な状態で、新規作成についても Azure CLI を使うと作成することが可能です。

今回もaz mysql server createで作成しました。

adminiwasa [ ~ ]$ az mysql server create --resource-group 20240128 --name hoge0128mysql --admin-user myadmin --admin-password ************ --sku-name B_Gen5_1 --location eastus2
Checking the existence of the resource group '20240128'...
Resource group '20240128' exists ? : True 
Creating mysql Server 'hoge0128mysql' in group '20240128'...
Your server 'hoge0128mysql' is using sku 'B_Gen5_1' (Paid Tier). Please refer to https://aka.ms/mysql-pricing  for pricing details

Azure CLI で作成が完了した後、「Azure Database for MySQL 単一サーバー」のリソースが確認出来ますね。
作成直後にアクセスするとリソースが見つからない場合がありましたが、ちょっと時間おくと参照出来るようになりました。

MySQL クライアントで接続して適当なデータベース、テーブル、レコードを作成しておきました。

% mysql -h hoge0128mysql.mysql.database.azure.com -u myadmin@hoge0128mysql -D hogedb -p 
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 63334
Server version: 5.6.47.0 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from fuga;
+------+------+
| id   | text |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
3 rows in set (0.03 sec)

mysql>

フレキシブルサーバーに Azure Database Migration Service を使って移行しなさいとメッセージが表示されていますね。

フレキシブルサーバーへの移行

今回 GA となった Azure Database for MySQL Import CLI を使ってフレキシブルサーバーへの移行をしてみたいと思います。

この機能を使うと対象のシングルサーバーから設定やデータを引き継いだ状態でフレキシブルサーバーが新規作成されます。
既存のフレキシブルサーバーをターゲットにインポート出来るわけではないので注意してください。最初そうなのかと思ってました。
そして、もしオンライン移行を行いたい場合は、この手順の後にデータインレプリケーションを構成してシングルからマスターへの同期が追加で必要になります。

また、次の公式ドキュメントに手順や注意事項など記載されていますのでよく見ておいたほうが良いです。
メジャーバージョン・マイナーバージョンあたりの制約は観測範囲ではほぼ問題ないと思いますが、lower_case_table_namesとパーティションテーブルあたりは注意したほうが良いかもしれない。
あと、同じサブスクリプション・リソースグループ・リージョンである必要があります。

条件に問題がなければコマンド一発で終わりです。簡単だ。

adminiwasa [ ~ ]$ az mysql flexible-server import create --data-source-type "mysql_single" --data-source "hoge0128mysql" --resource-group "20240128" --name "hoge0128mysql2"
Command group 'mysql flexible-server import' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Checking the existence of the resource group '20240128'...
Resource group '20240128' exists ? : True 
IOPS is 360 which is either your input or free(maximum) IOPS supported for your storage size and SKU.
Creating MySQL Server 'hoge0128mysql2' in group '20240128'...
Your server 'hoge0128mysql2' is using sku 'Standard_B1ms' (Paid Tier). Please refer to https://aka.ms/mysql-pricing for pricing details
Make a note of your password. If you forget, you would have to reset your password with'az mysql flexible-server update -n hoge0128mysql2 -g 20240128 -p <new-password>'.
Try using az 'mysql flexible-server connect' command to test out connection.
{
  "connectionString": "mysql --host hoge0128mysql2.mysql.database.azure.com --user myadmin --password={password}",
  "host": "hoge0128mysql2.mysql.database.azure.com",
  "id": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/20240128/providers/Microsoft.DBforMySQL/flexibleServers/hoge0128mysql2",
  "location": "East US 2",
  "password": "*****",
  "resourceGroup": "20240128",
  "skuname": "Standard_B1ms",
  "username": "myadmin",
  "version": "5.7"
}

上記記事に移行時間についても記述されており、移行元のストレージサイズやデーブルの数に依存するようです。
あまりこのあたり計測出来ていないのですが、デフォルト設定のシングルサーバーでたぶん 5 分くらいかかったと思います。
完了後、次のようにフレキシブルサーバーが作成されています。

ネットワーク設定を確認してみると、シングルサーバーのファイアウォール設定が引き継がれていますね。
その他にもサーバーパラメータや、パブリック・アクセス設定、バックアップルールなども引き継がれています。
ただ、全てが引き継がれているわけではなく、リードレプリカの設定や監視周りの設定は手動でフレキシブルサーバーに設定してやる必要があります。

MySQL クライアントからそのまま接続し、データなど確認出来ました。

% mysql -h hoge0128mysql2.mysql.database.azure.com -u myadmin@hoge0128mysql2 -D hogedb -p 
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.43-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from fuga;
+------+------+
| id   | text |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
3 rows in set (0.19 sec)

mysql>

後は必要であれば、以下に従ってデータインレプリケーションを設定してやります。

やりますが...私はちょっとうまく同期出来なかったので調査中です。

さいごに

本日は Azure Database for MySQL Import を使ってシングルサーバーからフレキシブルサーバーに移行する手順を確認してみました。

これは簡単ですね。DMS 用意するのはちょっと億劫だったのでこれなら気楽に出来そうですし、何ならポータルにフレキシブルサーバーへの移行ボタンみたいなのが追加されても良いなと思いました。