はじめに
2021 年 7 月 23 日に、MySQL Database Service の HeatWave において、Auto Parallel Load 機能が追加されています。
これまで、HeatWave クラスタにデータをロードするためには、以下のように個々のテーブルで ALTER TABLE … SECONDARY_LOAD を実行する必要がありました。
今回追加された Auto Parallel Load 機能では、データをロードする際にデータベースや除外するテーブルなどを指定することが可能になり、複数のテーブルを一括でロードできるようになったので、その詳細について確認してみたいと思います。
使用方法
HeatWave の使用開始方法については、以下の記事に記載されているのでこちらもご参照ください。
MySQLで分析処理を高速化させる HeatWave を使ってみた
Auto Parallel Load 機能は MySQL の sys スキーマにある heatwave_load() という名前のストアドプロシージャとして実装されているため、HeatWave の有効化後は、このコマンドを実行します。
なお、インスタンスを作成後、検証用に sysbench を利用してデータを作成しておきます。
実行に必要な権限
heatwave_load() を実行するユーザーには、以下の権限が付与されている必要があります。
- PROCESS 権限
- sys スキーマに対する EXECUTE 権限
- パフォーマンススキーマに対する SELECT 権限
コマンドのオプション
heatwave_load() で使用できるオプションを確認したい場合、以下のコマンドからヘルプを表示することが可能です。
まず、db_list としてロードするデータをスキーマ単位で指定します。その際、リストは JSON_ARRAY("db1","db2",...)
という形式で入力します。なお、ヘルプを表示する場合以外、ひとつ以上の値を入力する必要があります。
その後、各オプションを JSON_OBJECT("key","value",...)
という形式で入力していきます。オプションを指定しない場合、NULL を指定することも可能です。このとき、省略した項目については各オプションのデフォルト値が指定されます。
各オプションの説明は以下の通りです。
- mode : 操作モードを指定します。
- normal : ロード用スクリプトを生成して実行します。この値がデフォルト値です。
- dryrun : ロード用スクリプトのみを生成して実行しません。なお、HeatWave クラスタが有効でない場合、自動的にこのモードで実行されます。
- output : 実行結果の出力方法を指定します。
- normal : 標準出力および heatwave_load_report テーブルに結果を出力します。この値がデフォルト値です。
- silent : heatwave_load_report テーブルにのみ結果を出力します。結果をその場で確認する必要がない場合などはこちらの方が良いかと思います。
- compact : 結果をコンパクトな形式で出力します。
- help : コマンドラインヘルプを表示する際に指定します。
- sql_mode : データのロード中に使用される SQL モードを指定します。Auto Parallel Load 機能では sql_mode システム変数をサポートしていないため、デフォルト値以外の SQL モードを使用してロードをおこなう場合、このオプションを指定する必要があります。
-
policy : サポートされていないデータ型を含むテーブルを処理する際の挙動を指定します。
- disable_unsupported_columns : サポートされていないデータ型のカラムは無効にして、それ以外のカラムをロードします。なお、NOT SECONDARY が明示的に定義されている列はロードの際に無視されます。この値がデフォルト値です。
- not_disable_unsupported_columns : サポートされていないデータ型のカラムを含むテーブルの全データをロード対象から除外します。
- exclude : ロード対象から除外するデータベースオブジェクト(スキーマ、テーブル、カラム)のリストを指定します。指定する際には、
JSON_OBJECT("exclude_list", JSON_ARRAY("db0.t1","db0.t2")));
のようにバッククォートを使用しないで修飾する必要があります。なお、システムスキーマや InnoDB ストレージエンジンでないテーブル、HeatWave に既にロードされているテーブルは自動的に除外されます。 -
set_load_parallelism : ロードの並列処理を最適化します。デフォルトで有効になっており、innodb_parallel_read_threads システム変数によって並列数を制御できます。
-
auto_enc : MySQL ノードで Dictionary Encoding されたカラムの実行に十分なメモリーがあるかどうかを確認します。
- mode : auto_enc の操作モードを指定します。
- off : auto_enc オプションを無効にします。
- check : ロードをおこなう際に十分なメモリーがあるかどうかを確認します。メモリーが不足している場合、dryrun モードで実行され、メモリー不足に関する警告が出力されます。
コマンドの実行
必要な権限を持ったユーザーから heatwave_load() を実行します。
なお、HeatWave を有効化する際に「ノード数の見積もり」を選択することで、全てのオブジェクトをロードするためのコマンドを確認することができます。
ここでは、sysbench で作成した 3 つのテーブルに対してデータロードを実行してみます。
なお、実行すると以下の内容が自動で出力されていきます。
1. コマンドの実行
2. 実行時間の見積もりおよびロード用スクリプトの生成
3. 各テーブルのデータをロード
4. 実行結果の表示
コマンドの実行結果
heatwave_load() を実行すると、sys.heatwave_load_report テーブルに実行結果が格納されます。
なお、このテーブルは一時テーブルであるため、heatwave_load() を実行したセッションからでないと確認することができない点に注意してください。
たとえば、実行した結果で何かエラーが発生していないかを確認する場合、以下のような SQL で確認できます。
また、実行された DDL を確認したい場合、以下のような SQL で確認できます。
まとめ
ここまで、Auto Parallel Load 機能について使用方法を確認してきました。
従来の HeatWave へのロード方法はテーブル単位に手動でコマンドを実行する必要があったのに対して、heatwave_load() ではスキーマ単位で自動実行することが可能になったため、HeatWave を利用するまでの流れがスムーズになったのではないかと思います。
より利用しやすくなった HeatWave を使用して、手軽に検証をおこなってみてはいかがでしょうか?