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 Migrateを使ったIaaS移行

    はじめまして。新人クラウドエンジニアの三醍醐です。今回は、新機能が実…

  3. Azure

    Azure Monitor を利用したメトリックの静的しきい値監視

    メトリックについてAzureの一部のリソースは、メト…

  4. Azure

    Loganalyticsを利用してログを分析する

    取得したログを分析、必要なログを確認する Loga…

  5. Azure

    WindowsVirtualDesktopがGAされているので(その3)

    その2からかなり時間が空いていますが今回はオートスケールについてと…

  6. Azure

    Azure AD Connectの構築トラブルメモ

    今回はAzure AD Connect(AADC)を構築した際に色々…

関連記事

  1. Azure

    Azure VPNについてあれこれ
  2. Azure

    Azureで作るカスタムDNSの記事
  3. Azure

    祝日判定を使った自動起動について:Azure Automation
  4. Office 365

    Office 365 F3(旧F1)
  5. Azure

    Azure 資格試験の更新(2020年版)AZ-203編
PAGE TOP