Azure

AzureのDMSでデータを移行してみる記事 ~MySQL編~

皆様、こんにちは。
夏の暑さ対策、エアコンより扇風機派です。
×3です。

いきなりですが、皆様はネットで「DMS 移行」のような検索をしたことはありますでしょうか?
検索をしたことがない人は是非してみてください。
【AWS】のDMSを使ってみた記事がたくさんヒットします・・・

Azure のDMSに関連する記事は少ないようです。
なので、少ないなら自分で書いてしまおうの精神で本記事を作成しました。

というわけで、今回はAzureのデータ移行サービスである、
Azure Database Migration Serviceを使用して、データを移行してみます。

注意点
今回はMySQLを使用します。
サービス名が長いので、それぞれ以下の様に呼称します。
・Azure Database for MySQL:Azure MySQL
・Azure Database Migration Service:DMS

それではまずはDMSを使用するための前提条件から見ていきましょう。

前提条件

  • 移行元と移行先のMySQLのバージョンは同一でないといけない
    元:5.6.xx 先:5.7.yy→×  元:5.6.xx 先:5.6.yy→〇
  • DMS専用の仮想ネットワークが必要
  • DMSへの以下通信の許可(インバウント: 443、53、9354、445、12000 )
  • DMSが移行元MySQLへアクセスできるよう移行元でポート3306を開放しておく
  • 移行先のAzure Database for MySQLのファイアウォールに、DMS用に作成したサブネットの範囲を許可する設定を入れておく
  • Azure MySQLはInnoDBのみサポートされている。
    移行元のMySQLでMyISAMなどを使用している場合、変換が必要。
  • 移行元のMySQLでバイナリログを有効にしておく

多いですね・・・・前提条件の詳細はブログの最後に載せている参考ページをご覧ください。

今回の構成

それでは今回の簡単な構成を見てみましょう。

ざっと説明すると、onpre-vnetのonpre-mysqlがデータ移行元、
Azure MySQLが移行先、両者をつなげる真ん中のDMSとなっています。

また、onpre-vnetとDMS-vnetはピアリングでvnetをつなげています。

今回は移行元MySQL(onpre-mysql)、Azure MySQLは作成した状態から進めていきます。

DMSを作っていきましょう。

さっそくDMSを作りましょう、と言いたいところですが、
作成するにはリソースプロバイダーの登録というひと手間が必要となります。
なので、そこからやっていきます。

まずはDMSを作成するサブスクリプションのブレードから、リソース プロバイダーを押下します。
Microsoft.DataMigrationと入力して、リソースプロバイダーを登録します。

画像では横着して「Data」としか入力してないです・・・

登録が出来たら、Portalの検索窓でAzure Database Migration Serviceと入力し、追加か作成を押下します。
価格レベルですが、Premiumでも最初の183日は無料で使用できるそうです。
今回はオンライン移行をしたいのでPremiumで作成します。

必要情報を入力したら、作成します。
少し時間が掛かるので、休憩しましょう。

作成出来たら、移行元サーバーでいくつかコマンドを実行します。

移行対象のデータベースからスキーマを抜きだし、Azure MySQLへ転送します。

mysqldump -u root -p --databases reptest --no-data > ./reptest.sql

reptestは今回移行する対象のデータベース名です。
–no-dataで中身のデータ以外の情報を抜き出します。

mysql -h xxxxxxx.mysql.database.azure.com -u kakeadmin@xxxxxxx -p reptest < ./reptest.sql

引数にAzure MySQLのホスト名とユーザー名を指定し、スキーマの転送を実施します。

ちなみに、移行対象のデータベースの中身はこんな感じで、

mysql> show tables ;
+-------------------+
| Tables_in_reptest |
+-------------------+
| blogtest          |
| kake              |
+-------------------+
2 rows in set (0.00 sec)

テーブルの中身はこんな感じです。

mysql> select * from blogtest;
+------+--------------+------+
| id   | name         | hoge |
+------+--------------+------+
| 123  | NULL         | NULL |
| 132  | あげあげ     | NULL |
| 145  | すいさん     | hoge |
| 200  | ばえ         | hoge |
+------+--------------+------+

ではここで、移行先を確認してみます。
スキーマを転送したreptestデータベースをshow tablesした結果

mysql> use reptest;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_reptest |
+-------------------+
| blogtest          |
| kake              |
+-------------------+
2 rows in set (0.02 sec)

show table statusの結果

+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name     | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| blogtest | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |         0 |           NULL | 2020-07-09 17:08:08 | NULL        | NULL       | utf8_general_ci   |     NULL |                |         |
| kake     | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |         0 |           NULL | 2020-07-09 17:08:08 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+

先ほどの--no-dataで、このスキーマだけ転送しているんですね。
Rowsが0ですね。(Rowsはテーブルの中のデータの行数)

これで準備は完了です、後は移行するだけです。

さあ移行しましょう

先ほど作成したDMSの概要ページにて、「新しい移行プロジェクト」を押下します。

プロジェクト名、ソースサーバーのDBの種類、ターゲット(移行先)のDBの種類、移行方式を選択します。
終わったら、「アクティビティの作成と実行」を押下します。

ソースサーバー、ターゲットの詳細を入力する画面へ移ります。

ソースサーバー名はVNETピアリングしているので、プライベートIPを指定します。
入力して保存します。

ターゲットサーバー名、ユーザー名は、Azure MySQL にログインするときの情報を使用します。
入力して保存します。

移行対象のデータベースを指定します。

移行設定を選択します。
移行対象DBが複数ある場合、対象DB分選択項目が表示されます。

LOBデータの設定ですが、LOBサイズを制限すると、
制限を超えたデータは移行されないようです。
ご自身の環境を見て、設定してください。

これまでに入力した内容が表示されます、問題なければ活動名を決めて移行を実行します。

移行活動のページに移ります、移行対象のデータベース名を押下します。

移行の詳細が「一括準備完了」となるまで、更新をし続けます。

「一括準備完了」となったら、上の一括で開始を押下します。

一括実施メニューが表示されます。
保留中の変更が0となったら、確認、適用の順に押下します。

移行状況が表示されます、完了となるまで待ちます。

完了後、移行の詳細が「すべての変更が適用されました」となっていたら無事終了です。

Azure MySQLで実際にデータを確認してみましょう。

mysql> show table status;
+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name                 | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| blogtest             | InnoDB |      10 | Compact    |    4 |           4096 |       16384 |               0 |            0 |         0 |           NULL | 2020-07-09 17:08:08 | NULL        | NULL       | utf8_general_ci   |     NULL |                |         |
| dms_apply_exceptions | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |         0 |           NULL | 2020-07-09 17:39:47 | NULL        | NULL       | utf8_unicode_ci   |     NULL |                |         |
| kake                 | InnoDB |      10 | Compact    |    4 |           4096 |       16384 |               0 |            0 |         0 |           NULL | 2020-07-09 17:08:08 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+

Rowsは4となり、増えていることが確認できます。
ただデータの中身は・・・?

mysql> select * from blogtest;
+------+----------+------+
| id   | name     | hoge |
+------+----------+------+
| 123  | NULL     | NULL |
| 132  | あげあげ | NULL |
| 145  | すいさん | hoge |
| 200  | ばえ     | hoge |
+------+----------+------+

問題ないですね、きちんと移行されていました。

ちなみに、移行先のテーブルで1つ「dms_apply_exceptions」というテーブルが増えているのが確認できます。
移行途中に失敗があった時は、このテーブルに情報が入るそうです。
移行後はこちらにデータが入っていないか確認しましょう。

その他注意点

AzureのDMSには文字コード変換機能はありません。
AWSのDMSにはそのような機能がある感じでしたが、Azureにはないのでご注意ください。
文字コードは移行元、移行先同一が推奨です。

最後に

DMSを使うとサービスを止めないでデータ移行が出来るので便利ですね。
とはいえ、移行元と移行先を同期するようなサービスではないので、
移行活動の後、アプリケーション切り替えの間に移行元にデータが入ってしまった場合は再移行しないといけなさそうです。

ただ、Portalポチポチで簡単に移行できるので、もし要件に合えば使用を検討してみはいかがでしょうか。

参考リンク

・チュートリアル:DMS を使用して MySQL をオンラインの Azure Database for MySQL に移行する
https://docs.microsoft.com/ja-jp/azure/dms/tutorial-mysql-azure-mysql-online

Azure FilesをLinuxからマウントする記事前のページ

WindowsVirtualDesktopのARM次のページ

関連記事

  1. Azure

    Azure 資格試験の更新(2020年版の更新)

    新型コロナウイルスが世界中で猛威を振るっている状況ですが、早…

  2. Azure

    Azure料金に関する豆知識①

    こんにちは。新人クラウドエンジニアの三醍醐です。今回は、Az…

  3. Azure

    Azure Site Recoveryの課金について

    少々わかりにくい、Azure Site Recovery の…

  4. Azure

    Azure FilesをLinuxからマウントする記事

    皆様、こんにちは。在宅勤務による運動不足を解消するために縄跳びをやっ…

  5. ID管理とセキュリティ

    Azure AD Connectで オンプレADをAzureADへ同期

    ■初めに初めまして。JMTの北島と申します。今回はAzure AD …

  6. Azure

    Managed InstanceへのDB移行・アプリとの連携時の注意Point

    そがひろです。今回は、OnPremiseからAzure Manage…

関連記事

  1. Azure

    普通のAzure Windows VMを、従量課金のSQL VMにしたい
  2. Azure

    Azure Key Vaultでみんなしあわせ(その2)
  3. Application Gateway

    L7 負荷分散 Azure Application Gateway について:2…
  4. Azure

    AADDSを構築する記事
  5. Azure

    Runbookで管理タスクを自動化する。
PAGE TOP