この記事は Moving MySQL Databases from AWS to OCI Using MySQL Shell の翻訳版です。

以前の記事では、MySQL Shellを使ってデータベースをダンプ・ロードする方法(訳者註:2023年6月現在未翻訳のため英語記事へのリンク)とOracle Cloud Infrastructure(OCI)のバケットにデータをダンプ・ロードする方法(訳者註:同じく英語記事へのリンク)について取り上げました。この記事ではMySQL Shellを使用して、MySQL RDS DatabaseからS3バケットにデータをダンプし、それをOCIで稼働しているMySQL HeatWave Databaseのインスタンスにロードする方法を紹介します。

前提

この話題について取り掛かる前に、必要な前提条件がいくつかあります。

  1. OCIアカウント。アカウントをお持ちでなければ、こちらでサインアップできます。
  2. MySQL HeatWave Databaseサービスのインスタンス。
  3. OCIコマンドラインインタフェース(CLI)がインストールされ、OCIユーザー向けに構成されていること。
    • これはAWSからMySQL HeatWave Databaseインスタンスにデータをロードする際に用います。
  4. MySQLコマンドを実行するシステムへのMySQL Shellのインストール。
  5. 以下を持つAWSアカウント:
    • ダンプ対象のRDS MySQL Database
    • データベースからダンプできるS3バケット
  6. AWS CLIがインストールされ、上記のAWSユーザ向けに構成されていること。

データベースのダンプ

RDS MySQLデータベースをダンプするコマンドは、以前の記事(訳者註:未翻訳)で使用したコマンドと同じです。データをS3バケットにダンプするため、options オブジェクトの中にいくつかの差異が発生します。

まず、MySQL ShellインスタンスをRDS MySQL Databaseに接続します:

mysqlsh {user name}@{database server}

ここで、{user name}はデータベースユーザー、{database server}はデータベースサーバーのIPアドレスまたはドメイン名です。過去にMySQL Shellを用いてこのインスタンスに接続したことがない(あるいは、MySQL Shellのパスワード記憶を設定していない)場合、パスワード入力を要求されます。接続すると、画面は次のようになります。

MySQL Shell 接続

簡単のため本記事では、HOSTSファイルでのエイリアスを使用して、パブリックにアクセス可能なRDS MySQLインスタンスに接続しています。通常は、RDS MySQLインスタンスに接続するためにデータベースを世界に公開するには、十分な注意を払うことが必要になります。

RDSデータベースに接続したら、次のコマンドを使用して選択したスキーマをダンプします。

util.dumpSchemas(["my_database"], "my-database-dump", {s3BucketName: "sstroz-mysql-shell-dumps", threads:8, ocimds:true, compatibility: ["strip_definers"]})

このコマンドでの最初の引数は、ダンプするスキーマ名の配列です。2番目の引数は、S3バケットに作成されるフォルダの名前です。3番目の引数は、options JSONオブジェクトです。options の中の各プロパティが表す内容は以下のとおりです。

  • s3BucketName – データのダンプ先となるS3バケットの名前。
  • threads –  ダンプの実行に使用するスレッドの数で、デフォルトは4。
  • ocimds – このデータベースを最終的にはOCIのMySQL HeatWaveインスタンスにロードし移行するため、これをtrueに設定します。これをtrueに設定すると、データベースのダンプ結果がOCIで実行可能であることを確認するための互換性チェックを、MySQL Shellは実行します。
  • compatibility – MySQLデータベースをダンプするときに、データベースの互換性を確認する際のオプションを指定できます。この例では、strip_definers 互換性オプションが設定されています。このオプションは、ストアドプロシージャ、ユーザー定義関数などの定義者の情報をダンプから削除します。この処理を行ったデータをロードすると、関数などの定義者はMySQL Shellで接続しているユーザーになります。

データベースのサイズによっては、このプロセスは時間がかかる場合があります。プロセスが完了すると、以下のような出力が得られます。

NOTE: Backup lock is not available to the account 'the_user'@'%' and DDL changes will not be blocked. The dump may fail with an error if schema changes are made while dumping.
Acquiring global read lock
WARNING: The current user lacks privileges to acquire a global read lock using 'FLUSH TABLES WITH READ LOCK'. Falling back to LOCK TABLES...
Table locks acquired
Initializing - done
1 schemas will be dumped and within them 7 tables, 0 views.
Gathering information - done
All transactions have been started
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.33
NOTE: Database `my_database` had unsupported ENCRYPTION option commented out
Compatibility issues with MySQL Database Service 8.0.33 were found and repaired. Please review the changes made before loading them.
Validating MDS compatibility - done      
Writing global DDL files
Running data dump using 8 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done      
Writing DDL - done      
NOTE: Backup lock is not available to the account 'sstroz'@'%' and DDL changes were not blocked. The DDL is consistent, the world may resume now.
Writing table metadata - done      
Starting data dump
...
101% (136.38K rows / ~134.72K rows), 58.09K rows/s, 10.73 MB/s uncompressed, 2.56 MB/s compressed
Dump duration: 00:00:02s                                                                        
Total duration: 00:00:05s                                                                       
Schemas dumped: 1                                                                               
Tables dumped: 7                                                                                
Uncompressed data size: 22.85 MB                                                                
Compressed data size: 5.44 MB                                                                   
Compression ratio: 4.2                                                                          
Rows written: 136382                                                                            
Bytes written: 5.44 MB                                                                          
Average uncompressed throughput: 8.48 MB/s                                                      
Average compressed throughput: 2.02 MB/s

S3にダンプされたファイルを確認するには、次のようなコマンドが使えます。

aws s3 ls s3://sstroz-mysql-shell-dumps/my-database-dump/ --recursive --human-readable --summarize

注意: 上のコマンド例のS3パスの、バケットおよびフォルダ名をご利用のものと一致するように変更してください。

このコマンドが完了すると、次のような出力が表示されます。

2023-06-16 13:30:48  719 Bytes my-database-dump/@.done.json
2023-06-16 13:30:45 1008 Bytes my-database-dump/@.json
2023-06-16 13:30:46  242 Bytes my-database-dump/@.post.sql
2023-06-16 13:30:45  242 Bytes my-database-dump/@.sql
2023-06-16 13:33:36    3.4 KiB my-database-dump/load-progress.d2289553-f576-11ed-8e08-020017219a59.json
2023-06-16 13:30:46  672 Bytes my-database-dump/my_database.json
2023-06-16 13:30:46  605 Bytes my-database-dump/my_database.sql
...

この例で使った options JSONオブジェクトは、util.dumpTables()util.dumpInstanceといったAPIでも同じように機能します。

データベースをダンプが完了しました。いよいよ、このデータをMySQL HeatWaveインスタンスにリストアできます。

OCIにデータベースをロードする

続けるには、MySQL ShellをMySQL HeatWaveインスタンスに接続する必要があります。MySQL HeatWaveインスタンスへ接続するには、いくつかの方法があります。この記事では、以前のこの記事(訳者註:未翻訳)に記載された手順に従ったVPN接続により接続しています。

再び、以下のようなコマンドでMySQLインスタンスに接続します。

mysqlsh {user name}@{database server}

ここで、{user name}はデータベースユーザー、{database server}はデータベースサーバーのIPアドレスまたはドメイン名です。過去にMySQL Shellを用いてこのインスタンスに接続したことがない(あるいは、MySQL Shellのパスワード記憶を設定していない)場合、パスワード入力を要求されます。

OCIでMySQLに接続できた後、次のコマンドを実行します。

util.loadDump("my-database-dump", {s3BucketName:"sstroz-mysql-shell-dumps", threads:8})

最初の引数 my-database-dump は、ダンプ実施時に作成されたS3内のフォルダ名です。2番目の引数である options JSONオブジェクトには、次の2つのプロパティが存在します。

  • s3BucketName – データのダンプ先となったS3バケットの名前。
  • threads – ダンプのロードに使用するスレッドの数で、やはりデフォルトは4。

大きなデータベースでは、このプロセスには時間がかかります。プロセスが完了すると、以下のようなロードプロセスに関する情報が表示されます。

Loading DDL and Data from AWS S3 bucket=sstroz-mysql-shell-dumps, prefix='my-database-dump' using 8 threads.
Opening dump...
Target is MySQL 8.0.33-u3-cloud (MySQL Database Service). Dump was produced from MySQL 8.0.33
Fetching dump data from remote location...
Listing files - done
Scanning metadata - done      
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done      
Executing view DDL - done      
Starting data load
1 thds loading \ 100% (22.85 MB / 22.85 MB), 9.01 MB/s, 6 / 7 tables done
Recreating indexes - done      
Executing common postamble SQL                                          
7 chunks (136.38K rows, 22.85 MB) for 7 tables in 1 schemas were loaded in 5 sec (avg throughput 9.01 MB/s)
0 warnings were reported during the load.

エラーが発生しない限りは、OCIに移行され実行されているこの新しいデータベースは、既に使える状態になっています。

まとめ

MySQL Shellは、クラウドストレージのバケットとの間でデータをダンプしたりロードしたりできるなど、MySQLデータベースのインスタンスを管理できる強力なツールです。この記事で紹介したたった2つのコマンドで、使いやすくパワフルなこのツールの力を活用し、データベースをAWSからOCIに移行できます。