この記事は、Using MySQL Shell to Dump Data To And Read Data From OCI Storage Buckets の翻訳版です。
MySQL Shellを使ったマルチスレッド処理によるデータダンプおよびロードは、こちらのブログで紹介しました。この記事の中で、Oracle Cloud Infrastructure(OCI)などのクラウドサービスへのデータダンプやデータロードができることに触れました。そこで、今回はOCI Storage Bucketsを使ってデータのダンプとロードを行う方法をご説明します。
前提
下記をあらかじめご準備ください。
- OCIアカウントがない場合は、こちらから登録してください。
- OCIコマンドライン(CLI)をインストールし、OCIユーザを設定してください。OCIバゲットにデータをダンプする際に、OCI CLIの設定により認証されます。
- データをダンプするデーターベースを用意してください。今回の実施例では、エアポートサンプルデータを使用します。
- MySQL Shellをインストールしてください。
ストレージバケットの作成
データーベースのデータをダンプする前に、OCIでストレージバケットを作ります。
OCIアカウントにログインし、3本線のメニューアイコンをクリックします。

「バケット」を検索し、選択します。

バケットのページに入ったら、「バケットの作成」ボタンをクリックします。

「バケットの作成」フォームの中で、(1)新しいバケットの名前を入力します。実施例では database_dumps という名前を使用し、他の項目はデフォルトの設定で(2)「作成」ボタンを押します。

新しいバケットが作成できたら、コンパートメントのバケットの一覧に表示されます。クリックで詳細を確認できます。

詳細ページで「ネームスペース」の値を確認します。この値はダンプおよびロードを実行する際に必要になります。

MySQLインスタンスに接続
データベースをダンプするために、MySQL ShellをMySQLインスタンスに接続します。下記のようなコマンドになります。
mysqlsh {user}@{server}
上記コマンドで、{user}は接続するときのMySQLユーザ名、{server}はMySQLインスタンスのIPまたはドメインアドレスです。実施例ではOCIのMySQL HeatWaveインスタンスに接続していますが、OCIにダンプするのにMySQL HeatWaveインスタンスである必要はありません。
データダンプ
MySQLインスタンスのスキーマを見るために、下記のコマンドを実行します。
session.getSchemas()
出力結果は下記のようになります。
[
<Schema:airportdb>,
<Schema:information_schema>,
<Schema:mysql>,
<Schema:performance_schema>,
<Schema:sys>]
今回はairportdbという名前のデータベースをダンプするので、コマンドは下記のようになります。
ネームスペースの値とバケット名も忘れずに入力してください。
util.dumpSchemas(["airportdb"], "airport_dump", {osBucketName:"database_dumps", osNamespace:"{namespace value}", ocimds: true})
実施例ではocimdsの値をtrueにしています。このオプションをtrueに設定すことで、ソースとなるデータベースがMySQL HeatWaveと互換性があることが確認できます。
実行すると下記のようにダンプに関する情報が表示されます。
Acquiring global read lock
Global read lock acquired
Initializing - done
1 schemas will be dumped and within them 14 tables, 0 views.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.33
NOTE: Database `airportdb` 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 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
110% (19.38M rows / ~17.46M rows), 548.97K rows/s, 17.63 MB/s uncompressed, 4.41 MB/s compressed
Dump duration: 00:00:34s
Total duration: 00:00:35s
Schemas dumped: 1
Tables dumped: 14
Uncompressed data size: 673.93 MB
Compressed data size: 218.77 MB
Compression ratio: 3.1
Rows written: 19378298
Bytes written: 218.77 MB
Average uncompressed throughput: 19.42 MB/s
Average compressed throughput: 6.30 MB/s
バケットの確認
ダンプが完了したら、ストレージバケットを確認します。
OCIのWebページで、先ほど作成したバケットのページに戻ります。バケットの詳細で「オブジェクト」を参照すると、airport_dumpという名前のフォルダができていることが確認できます。このフォルダには、データダンプの実行により作成されたファイルが格納されます。

データロード
OCIにダンプが格納されていることを確認したので、次はこのデータをMySQLインスタンスにロードします。今回は、同じインスタンスに異なる名前でデータロードを行います。下記はその実行例です。.
util.loadDump("airport_dump", {schema: "airportdb_2", osBucketName:"database_dumps", osNamespace:"{namespace value"})
最初の引数airport_dumpはバケットに作ったフォルダ名です。バケットにはネームスペースの値を使用してください。
データのロードはダンプよりも時間がかかることがあります。実行すると、データロードに関する情報が下記のように表示されます。
Loading DDL and Data from OCI ObjectStorage bucket=database_dumps, prefix='airport_dump' using 4 threads.
Opening dump...
Target is MySQL 8.0.33-u2-cloud (MySQL Database Service). Dump was produced from MySQL 8.0.33-u2-cloud
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
2 thds loading | 100% (673.93 MB / 673.93 MB), 2.13 MB/s, 14 / 14 tables done
Recreating indexes - done
Executing common postamble SQL
39 chunks (19.38M rows, 673.93 MB) for 14 tables in 1 schemas were loaded in 2 min 2 sec (avg throughput 5.85 MB/s)
0 warnings were reported during the load.
総括
MySQL Shellによって、マルチスレッド処理によるデータのダンプおよびロードに加えて、OCIストレージバケットを利用したダンプの保存と読み取りができることをご紹介しました。本記事ではutil.dumpSchemas()を使用しましたが、 util.dumpInstance()とutil.dumpTables()の場合も同様のオプションが利用できます。オプションについて詳しくは、下記の公式ドキュメントをご覧ください。
OCIの機能を使用したデータのダンプおよびロードに関しては、Frederic Descamps によるこちらのブログをご覧ください。
