スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Shell ダンプユーティリティーのwhereオプション紹介

はじめに

2023-01-17にリリースされたMySQL Shell8.0.32でexportTable(), dumpInstance(), dumpSchemas(), dumpTables() ユーティリティでwhereによるフィルタリング機能が追加されました。
今回はこちらの機能にいて紹介していきます。

使用するバージョンはMySQL8.0.32及び、MySQL Shell8.0.32です。

使い方

各Utilityの実行例

exportTable(), dumpInstance(), dumpSchemas(), dumpTables()でそれぞれwhereによるフィルタリングを行う場合の記述例となります。

次に実際にフィルタリングがされていることを確認してみます。
compression: "none"で圧縮を行わないようにして、ダンプされたファイルの中身を確認します。

actor_idが10未満の行のみダンプされています。

条件の記述例

記述例をいくつか紹介します。

文字列を条件にする場合、ダブルクォーテーションをエスケープするか、シングルクォーテーションを使用します。

条件を組み合わせたいときはandorを使用します。

()(括弧)を使用して複雑な条件を設定することも可能です。

この場合、actor_idが50未満または160より大きい行であること、そしてlast_nameがKILMERである行がダンプされます。

inlikeも使用できます。

条件に関数を使用することもできます。

複数のテーブルに対して、フィルタリングを行いたい場合は、以下のように,(カンマ)で区切ります。

なお、1つのテーブルに対する条件をカンマで区切って記述した場合、後勝ちで後ろの条件だけが適用されるようなので、分けて記載しないように注意してください。

last_name = "KILMER"となる行は5行ありますが、actor_id > 190となる行のみダンプされています。

フィルタリングが誤っている場合

ドキュメントには、SQLの条件は実行時にのみ検証されると書いてあります。

Note
The SQL is validated only when it is executed. If you are exporting many tables, any SQL-syntax-related issues will only be seen late in the process. As such, it is recommended you test your SQL condition before using it in a long-running export process.

https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html#mysql-shell-utilities-dump-opt-filtering

検証はテーブル定義などがダンプされた後に行われます。

以下のように存在しないカラムidを条件にして実行してみます。

ダンプは途中で失敗します。

また、条件の記法が誤っている場合もプロセスの途中で失敗します。

デフォルトでテーブルのダンプは以下の順で行われます。

  1. 各テーブル定義のダンプ
  2. 各テーブルのデータを複数のファイルに分割するための計算
  3. 各テーブルデータのダンプ

2のファイル分割のための計算で、WHERE条件を含んだSQLが実行されます。そのため条件に誤りがあった場合、テーブルデータのダンプが始まる前の段階で、エラーによってダンプは終了します。(threadsオプションで処理を並行して実施した場合は、2と3のフェーズが並行して行われる可能性はあります。)

ただし、chunking: falseで実行すると、データのファイル分割は行われないため、2のフェーズはスキップされます。
よってSQLは、各テーブルのデータダンプ時に初めて実行されます。そのため、一部のテーブルのダンプが完了した後で、ダンプが失敗する可能性があります。その場合、長時間実行されるダンプの最後の方で、プロセスが中断されるといったことが起こる可能性もあります。

いずれにしても、ドキュメントにある通り事前にテストを行ったほうがいいでしょう。

残念ながら、dryrunではwhere条件の検証は行われないらしく、誤った記載でもdryrunは成功します。

また、テーブルの方が存在しない場合は特にエラーは起きずに無視されるようです。試しにsakila.actorsという存在しないテーブルを条件にすると、ダンプは成功します。

当然ながら、sakila.actorは全ての行がダンプされます。

テーブル名を含め、条件に誤りがないかは十分なチェックが必要です。

具体的なチェック方法ですが、whereの部分をコピーしてSELECT文に書き換えて実行すると、実際にダンプされるデータの確認もできるので良いのではないかと思います。

まとめ

MySQL Shellのwhereによるフィルタリング機能について紹介しました。
今回は紹介できませんでしたが、同じくMySQL Shell8.0.32から特定のパーティションのみをダンプするpartitionsオプションも追加されています。これらを組み合わせることで、より柔軟に任意のデータのダンプが行えるようになりました。
一方で、記法の誤りは、コマンドを実行して即座に検証されるわけではないため、その点は注意が必要です。

Return Top