GCP Database Migration Serviceを使用してCloudSQL for MYSQLのバージョンアップをしてみた

## はじめに
この記事は、All About Group（株式会社オールアバウト） Advent Calendar 2022 16日目の記事です。

こんにちは、@deeenです。
社内でCloudSQL for MYSQLのバージョンを5.7から8.0に移行する際に「Database Migration Service」を使用したので、使用方法、注意点などまとめておきたいと思います。


## Database Migration Serviceとは？
サービス名の通り、GCPが提供するフルマネージドのデータベース移行サービスになります。
オンプレミス、Google Cloud、その他クラウドからCloudSQLやAlloyDB for PostgreSQLに移行が可能です。
最小限のダウンタイムで移行ができること、サーバレスで簡単なセットアップで実行可能である点が特徴です。

サービスページ: https://cloud.google.com/database-migration


## 今回やること
今回は弊社での実例を元に、GCPのCloudSQL for MYSQL5.7から8.0に移行するという内容のご紹介になります。

以下、イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/7720494c-e1d0-96d6-3649-bc0d6f5db6b9.png)


## 手順
それでは、以下順序でDatabase Migration Service（DMS)を使用した移行方法をご説明します。
1. 移行元DBのクライアント証明書の取得
2. DMS移行ジョブの作成
3. ジョブ実行
4. DBユーザの作成/権限付与
5. HA構成への変更

### 1. 移行元DBのクライアント証明書の取得
移行元インスタンスへ移動し、「接続」> 「セキュリティ」を開きます。
画面下部のクライアント証明書を作成ボタンをクリックし、クライアント証明書を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/14da8ebf-8781-2507-ce04-d4f76103c8be.png)


以下のような画面が表示されたら、各キーをダウンロードして完了です。
※キーのダウンロードはこの画面でしか実行できませんので、大切に保管してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/bb4b9067-dcf4-ed82-d3d7-014107ee7b52.png)

### 2. DMS移行ジョブの作成
CloudSQLのサービス画面上部の「データを移行」をクリックするか、
GCPの検索窓からデータベースの移行と入力し、Database Migration　Serviceのサービス画面へ移動します。

移行ジョブを作成 ボタンをクリックし、ウィザードに従ってジョブを作成します。
以下にウィザード入力の例を記載しますので参考にしてみてください。

|ステップ|項目名|入力パラメータ例|備考|
|---|---|---|---|
|移行ジョブの説明|移行ジョブの名前|dms-test| |
| |移行ジョブID|dms-test| |
| |移行元データベースエンジン|CloudSQL for MySQL|ただのMySQLではデータ転送されないので注意|
| |移行ジョブの種類|1回限り| |
|ソースの定義|Cloud SQLインスタンス|source-db|データ転送元になるCloudSQLインスタンス名|
| |接続プロファイルの名前|connection-test|移行元DBへの接続情報をまとめたものが接続プロファイルとなります。移行ジョブとは別リソースとして管理され、同一DBへの移行を別途行う際に使い回すことが可能です。|
| |接続プロファイルID|connection-test| |
| |ホスト名またはIPアドレス|xxx.xxx.xxx.xxx|移行元DBのプライベートIPアドレス|
| |ポート|3306| |
| |ユーザー名|root|rootでなければDMSは有効に機能しないので注意|
| |パスワード|****|rootのパスワード|
| |リージョン|DBが存在するリージョン| |
| |接続のセキュリティ保護|サーバークライアント| |
| |ソースCA証明書|server-ca.pem|1で入手したものを設定する|
| |ソースのクライアント証明書|client-cert.pem|1で入手したものを設定する|
| |ソースの秘密鍵|client-key.pem|1で入手したものを設定する|
| |最初にデータをダンプする場所の選択|初期ダンプを自動生成する| |
|移行先の作成|宛先インスタンスID|test-db|移行先CloudSQLインスタンス名|
| |パスワード|****|新規DBのrootパスワード|
| |データベースのバージョン|Cloud SQL for MySQL 8.0| |
| |リージョンとゾーン|任意| |
| |プライベートIP|チェック| |
| |パブリックIP|チェック||
| |マシンタイプ|標準|希望のスペックを記入|
| |ストレージの種類|SSD|希望のスペックを記入|
| |ストレージ容量|100GB|希望のスペックを記入|
| |ストレージの自動拡張を有効にする|チェック| |
| |顧客管理の暗号鍵(CMEK)を使用する|チェックしない|オプションの構成を表示をクリックしないと見えないので注意|
| |フラグ|character_set_server = utf8mb4|オプションの構成を表示をクリックしないと見えないので注意|
| |フラグ|default_time_zone = +09:00|オプションの構成を表示をクリックしないと見えないので注意。また、設定し忘れるとtimestamp型のデータがUTC時間で登録されてしまうので要注意|
| |ラベル|なし|オプションの構成を表示をクリックしないと見えないので注意|
|接続方法の定義|接続方法|移行元と移行先はプライベートIPを使用しています| |
| |移行元のVPCネットワークの選択|test-network| |

一通りの入力が完了したら、移行ジョブのテストを必ず実施しましょう。
以下のようにテストが成功したら、ジョブを作成　をクリックし、2のステップは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/3f356279-82f3-11b1-2185-4696a766472c.png)


### 3. ジョブの実行
移行ジョブのサービス画面に移動し、2で作成した移行ジョブを開始します。
正常に実行が開始されるとステータス「実行中　完全なダンプの処理中」に遷移し、最終的にステータス「完了」になります。

以下、開始直後の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/0d548cc0-d9c4-9f54-4415-8411fb09e9fb.png)

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988070/f0566c84-801a-cdf9-e431-d24d490b00e9.png)


### 4. DBユーザの作成、権限付与
DMSではDBユーザ情報は移行対象でないため、手動での作成と対象DBへの権限付与が必要となります。
以下、コマンド例
```
mysql -u root -h xxx.xxx.xxx.xxx -P 3306 -p
create user 'test_db_user'@'%' identified by 'xxxxxx';
GRANT ALL PRIVILEGES ON `test_db`.* TO 'test_db_user'@'%' ;
show grants for 'test_db_user'@'%';
```

### 5. HA構成への変更　(オプション)
移行ジョブ実行前は、移行先インスタンスはシングルゾーン構成となっておりかつ、変更不可になっています。
本番環境等では、移行ジョブ完了後に忘れずにHA構成に変更しておきます。

## 終わりに
ウィザードベースで複雑な設定も不要、移行元のインスタンスに負荷をかけることなく移行できるのは大変ありがたい機能ですね。
CloudSQLのバージョンアップ方法にお悩みの方はぜひ本記事を参考に挑戦してみてください。
また、本記事では紹介しきれませんでしたが、オンプレや他クラウドからGCPへのデータベース移行もほぼ同じ要領で可能でありますので、GCP未使用の方、これからGCPへ移行したいという方にとっても非常に有用な機能だと思います。

今後も業務の中で触った新しいサービスや、学習した内容を共有していきたいと思います。

最後までお読みいただきありがとうございました。