OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア(@araidon,@kazunishi,@yama6)による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。
移行するサービス:Amazon Aurora MySQL
今回、移行対象とするのはAmazon Aurora MySQLです。
MySQL Shellを利用したDumpの作成と、Dumpファイルを元にしたOCI MySQL HeatWave Database Serviceの作成手順をガイドします。
移行イメージ
前提条件
- AWSとOCI、それぞれに接続するための踏み台・作業用サーバがパブリックサブネット上に構築されていること
- 移行先のMySQL HeatWave Database Serviceは作成済みとすること
MySQL公式サイトにて案内されていた以下ドキュメント内の手順を参照しています。
動作検証用データベース
本ブログでは、以下サンプルのemployees databaseを利用して移行前後のテーブル内容を確認します。
Amazon Aurora MySQLでの動作確認結果
動作確認結果(長文のため折りたたみ)
$ mysql -h xxxxxx.cluster-xxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u admin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 103
Server version: 5.7.12 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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql>
mysql> show tables;
+----------------------+
| Tables_in_employees |
+----------------------+
| current_dept_emp |
| departments |
| dept_emp |
| dept_emp_latest_date |
| dept_manager |
| employees |
| salaries |
| titles |
+----------------------+
8 rows in set (0.00 sec)
mysql> select * from employees limit 30;
+--------+------------+------------+-------------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-------------+--------+------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
| 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 |
| 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 |
| 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 |
| 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 |
| 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 |
| 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 |
| 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 |
| 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 |
| 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 |
| 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 |
| 10021 | 1960-02-20 | Ramzi | Erde | M | 1988-02-10 |
| 10022 | 1952-07-08 | Shahaf | Famili | M | 1995-08-22 |
| 10023 | 1953-09-29 | Bojan | Montemayor | F | 1989-12-17 |
| 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 |
| 10025 | 1958-10-31 | Prasadram | Heyers | M | 1987-08-17 |
| 10026 | 1953-04-03 | Yongqiao | Berztiss | M | 1995-03-20 |
| 10027 | 1962-07-10 | Divier | Reistad | F | 1989-07-07 |
| 10028 | 1963-11-26 | Domenick | Tempesti | M | 1991-10-22 |
| 10029 | 1956-12-13 | Otmar | Herbst | M | 1985-11-20 |
| 10030 | 1958-07-14 | Elvis | Demeyer | M | 1994-02-17 |
+--------+------------+------------+-------------+--------+------------+
30 rows in set (0.00 sec)
mysql> select gender,count(*) from employees group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| M | 179973 |
| F | 120051 |
+--------+----------+
2 rows in set (0.13 sec)
mysql> show columns from employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> exit
移行フロー
- OCIのObject Storageに、Dumpファイル保存用バケットを作成
- AWSの作業用EC2に、OCI接続用設定を実施
- AWSの作業用EC2に、MySQL Shellをインストール
- MySQL Shellを利用して、Aurora MySQLのDumpファイルを作成
- OCIの作業用Computeに、OCI接続用設定を実施
- MySQL Shellを利用して、MySQL HeatWave Database Serviceへのロードを実施
1. OCI Object Storage: Dumpファイル保存用バケットを作成
Dumpファイル保存用のバケットを作成します。
既存でWork用バケットがあれば、手順2のAWS EC2に進んでください。
OCIコンソール画面
→ 左上のハンバーガーメニュー
→ 「ストレージ」→ 「オブジェクト・ストレージとアーカイブ・ストレージ」→ 「バケット」を選択
項目名 | 設定 |
---|---|
バケット名 | (任意のバケット名) |
デフォルト・ストレージ層 | 標準 |
暗号化 | Oracle管理キーを使用した暗号化 |
バケットが作成された事を確認します。
2. AWSの作業用EC2に、OCI接続用設定を実施
EC2の作業ユーザーのホームディレクトリに、 ./.oci/config ファイルを作成します。
既に作成済みの場合は手順3に進んでください。
2-1. OCIコンソールから、APIキーを作成
「秘密キーのダウンロード」を押下し、保存後に、「追加」を選択
構成ファイルのプレビューの内容をコピーします。
後で利用しますので、テキストエディタ等に保存してください。
2-2. 作業用EC2に、OCI構成ファイルを作成
作業用EC2にログインします。
ログイン後に、Touchコマンドで./.oci/config作成します。
touch ~/.oci/config
作成した .oci/config を編集します。
[DEFAULT]
user=(2-1でコピーした内容)
fingerprint=(2-1でコピーした内容)
tenancy=(2-1でコピーした内容)
region=(2-1でコピーした内容)
key_file=oci_api_key.pem
2-2. 作業用EC2に、OCI APIキーをアップロード
手順2-1でダウンロードした秘密キーをアップロードします。
- ファイル名: oci_api_key.pemとします。
- 保存先フォルダ: ~/.oci/
$ ls -l ~/.oci/
total 12
-rw------- 1 ubuntu ubuntu 301 Oct 1 08:26 config
-rw------- 1 ubuntu ubuntu 1704 Oct 1 08:26 oci_api_key.pem
$
3. AWSの作業用EC2に、MySQL Shellをインストール
既にインストール済の場合は手順4に進んでください。
以下公式の手順を参照してインストールします。
https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-install-linux-quick.html
インストール出来ていることを確認
$ mysqlsh --version
mysqlsh Ver 8.0.34 for Linux on x86_64 - for MySQL 8.0.34 (MySQL Community Server (GPL))
$
4. EC2にて、MySQL Shellを利用して、Aurora MySQLのDumpファイルを作成
4-1. EC2にて、MySQL Shellを実行
$ mysqlsh
MySQL Shell 8.0.34
Copyright (c) 2016, 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 '\?' for help; '\quit' to exit.
4-2. MySQL Shellから、対象のAurora MySQLのエンドポイントに接続
\connect Auroraのユーザ名@Auroraのエンドポイント
途中でAuroraユーザのパスワードを聞かれます。
MySQL JS > \connect xxxxxx@xxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
Creating a session to 'xxxxxx@xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com'
Please provide the password for 'xxxxxx@xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com': ********
Save password for 'xxxxxx@xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 319
Server version: 8.0.33 Source distribution
No default schema selected; type \use <schema> to set one.
MySQL xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 ssl JS >
4-3. Aurora MySQLのDumpファイルをOCIのObject Storageに作成
以下のコマンドでDumpファイルを作成
> util.dumpInstance("outputurl", {osBucketName: "bucketname", osNamespace: "namespace", threads:1, consistent:false, ocimds: true, compatibility: ["strip_restricted_grants", "strip_definers"]})
項目 | 説明 |
---|---|
outputurl | バケット直下に作成される親ディレクトリ名。任意でOK |
osBucketName | OCIで作成したObject Storageのバケット名を入力 |
osNamespace | OCIテナントのNameSpace名を入力。OCIコンソールの右上人型アイコンのテナンシをクリックすることで、オブジェクト・ストレージ・ネームスペースが確認出来ます。 |
threads | EC2のvCPU数を指定 |
consistent | Instanceに対し、グローバル読み取りロックを設定のロックをします。AuroraのDumpを取得する際には、falseにする必要があります。 |
ocimds | このオプションを true に設定すると、MySQL Database Service との互換性のチェックおよび変更が可能になります。 |
compatibility | MySQL Database Service との互換性のために指定された要件を適用します。 |
strip_restricted_grants | MySQL Database Service によって制限されている特定の権限を GRANT ステートメントから削除して、ユーザーおよびそのロールにこれらの権限を付与できないようにします |
strip_definers | ビュー、ルーチン、イベントおよびトリガーから DEFINER 句を削除して、これらのオブジェクトがデフォルト定義者 (スキーマを起動するユーザー) で作成されるようにし、ビューおよびルーチンの SQL SECURITY 句を変更して、DEFINER のかわりに INVOKER を指定します。 |
項目の詳細は以下公式サイトを参照してください。
https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-utilities-dump-instance-schema.html
実行結果
MySQL xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 ssl JS > util.dumpInstance("outputurl", {osBucketName: "bucketname", osNamespace: "namespace", threads:1, consistent: xfalse, ocimds: true, compatibility: ["strip_restricted_grants", "strip_definers"]})
Initializing - done
1 out of 5 schemas will be dumped and within them 6 tables, 2 views.
2 out of 3 users will be dumped.
Gathering information - done
(中略)
Dump duration: 00:00:05s
Total duration: 00:00:07s
Schemas dumped: 1
Tables dumped: 6
Uncompressed data size: 141.50 MB
Compressed data size: 36.82 MB
Compression ratio: 3.8
Rows written: 3919015
Bytes written: 36.82 MB
Average uncompressed throughput: 25.96 MB/s
Average compressed throughput: 6.76 MB/s
MySQL xxxxxx.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 ssl JS >
5. OCIの作業用Computeに、OCI接続用設定を実施
OCIの作業ユーザーのホームディレクトリに、 ./.oci/config ファイルを作成します。
既に作成済みの場合は手順6に進んでください。
以下手順5-1,5-2は、手順2-1,2-2で実施した内容と全く同じ内容です。
作成するConfigファイル・APIキー共に全く同じ内容でOKです。(key-fileのPATHには注意)
5-1. OCIコンソールから、APIキーを作成
「秘密キーのダウンロード」を押下し、保存後に、「追加」を選択
構成ファイルのプレビューの内容をコピーします。
後で利用しますので、テキストエディタ等に保存してください。
5-2. 作業用EC2に、OCI構成ファイルを作成
作業用EC2にログインします。
ログイン後に、Touchコマンドで./.oci/config作成します。
touch ~/.oci/config
作成した .oci/config を編集します。
[DEFAULT]
user=(5-1でコピーした内容)
fingerprint=(5-1でコピーした内容)
tenancy=(5-1でコピーした内容)
region=(5-1でコピーした内容)
key_file=oci_api_key.pem
5-2. 作業用EC2に、OCI APIキーをアップロード
手順5-1(2-1)でダウンロードした秘密キーをアップロードします。
- ファイル名: oci_api_key.pemとします。
- 保存先フォルダ: ~/.oci/
$ ls -l ~/.oci/
total 8
-rw-r--r--. 1 opc opc 298 Oct 6 07:50 config
-rw-r--r--. 1 opc opc 1704 Oct 6 07:39 oci_api_key.pem
$
6. Computeにて、MySQL Shellを利用して、MySQLへのロードを実施
6-1. Computeにて、MySQL Shellを実行
$ mysqlsh
MySQL Shell 8.0.34
Copyright (c) 2016, 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 '\?' for help; '\quit' to exit.
6-2. MySQL Shellから、MySQL Heatwave Database Serviceのエンドポイントに接続
\connect <ユーザー名>@<MySQL Heatwave Database Serviceのエンドポイント>
途中でユーザのパスワードを聞かれます。
MySQL JS > \connect admin@xxxxxxxxxxxxxxx
Creating a session to 'admin@xxxxxxxxxxxxxx'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 23804
Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
MySQL xxxxxxxxxxxx:3306 ssl JS >
6-3. MySQL HeatWave Database Serviceへのロードを実施
以下のコマンドでLoadを実施
> util.loadDump("<url>", {osBucketName: "<bucketname>", osNamespace: "<namespace>", threads:1})
項目 | 説明 |
---|---|
url | Dumpファイルが保存されている親ディレクトリ名。手順4-3で指定したoutputurl。 |
osBucketName | OCIで作成したObject Storageのバケット名を入力 |
osNamespace | OCIテナントのNameSpace名を入力。OCIコンソールの右上人型アイコンのテナンシをクリックすることで、オブジェクト・ストレージ・ネームスペースが確認出来ます。 |
threads | Computeの OCPU数を指定 |
ignoreVersion | MySQLのバージョンに違いがある場合は、このオプションをTrueにします。(5.7 → 8.0にするときなど) |
項目の詳細は以下公式サイトを参照してください。
実行結果
MySQL 10.0.0.240:3306 ssl JS > util.loadDump("auroradump", {osBucketName: "mds_fromaws", osNamespace: "xxxxxxxxxxxxxx", threads:1, ignoreVersion:true})
Loading DDL and Data from OCI ObjectStorage bucket=mds_fromaws, prefix='auroradump' using 1 thread.
Opening dump...
Target is MySQL 8.0.34-u3-cloud (MySQL Database Service). Dump was produced from MySQL 5.7.12
WARNING: Destination MySQL version is newer than the one where the dump was created. Loading dumps from different major MySQL versions is not fully supported and may not work. The 'ignoreVersion' option is enabled, so loading anyway.
Fetching dump data from remote location...
(中略)
Starting data load
100% (141.50 MB / 141.50 MB), 4.13 MB/s, 5 / 6 tables done
Recreating indexes - done
Executing common postamble SQL
6 chunks (3.92M rows, 141.50 MB) for 6 tables in 1 schemas were loaded in 33 sec (avg throughput 4.42 MB/s)
0 warnings were reported during the load.
MySQL 10.0.0.240:3306 ssl JS >
動作確認
MySQL HeatWave Database Serviceのエンドポイントにログインし、動作確認をします。
動作確認結果(長文のため折りたたみ)
$ mysql -h 10.0.0.240 -u admin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23822
Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud
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>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| employees |
| information_schema |
| mysql |
| mysql_audit |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> show tables;
+----------------------+
| Tables_in_employees |
+----------------------+
| current_dept_emp |
| departments |
| dept_emp |
| dept_emp_latest_date |
| dept_manager |
| employees |
| salaries |
| titles |
+----------------------+
8 rows in set (0.01 sec)
mysql> select * from employees limit 30;
+--------+------------+------------+-------------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-------------+--------+------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
| 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 |
| 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 |
| 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 |
| 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 |
| 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 |
| 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 |
| 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 |
| 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 |
| 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 |
| 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 |
| 10021 | 1960-02-20 | Ramzi | Erde | M | 1988-02-10 |
| 10022 | 1952-07-08 | Shahaf | Famili | M | 1995-08-22 |
| 10023 | 1953-09-29 | Bojan | Montemayor | F | 1989-12-17 |
| 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 |
| 10025 | 1958-10-31 | Prasadram | Heyers | M | 1987-08-17 |
| 10026 | 1953-04-03 | Yongqiao | Berztiss | M | 1995-03-20 |
| 10027 | 1962-07-10 | Divier | Reistad | F | 1989-07-07 |
| 10028 | 1963-11-26 | Domenick | Tempesti | M | 1991-10-22 |
| 10029 | 1956-12-13 | Otmar | Herbst | M | 1985-11-20 |
| 10030 | 1958-07-14 | Elvis | Demeyer | M | 1994-02-17 |
+--------+------------+------------+-------------+--------+------------+
30 rows in set (0.00 sec)
mysql> select gender,count(*) from employees group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| M | 179973 |
| F | 120051 |
+--------+----------+
2 rows in set (0.19 sec)
mysql> show columns from employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
まとめ
MySQL Shellを利用して簡単に移行することができました。
Amazon EC2や、OCI Computeから、OCI Object Storageにつなぐ設定は慣れるまで時間がかかるかもしれません。
Auroraに対し、MySQL Shellによるdumpを実施する際には、グローバル読み取りロックをすることが出来ないため、dump取得時にはアプリケーション側で更新処理が入らないようにする必要がありそうです。