スマートスタイル TECH BLOG

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

MySQL Shell で バックアップとリストアをパラレルで実行する

先月リリースされた MySQL Shell 8.0.21 にバックアップのスレッドを並列化させてパラレルで実行する機能と、そのバックアップを同じくパラレルでインポートするユーティリティが追加されました。
公式リファレンスは以下になります。

上記のリファレンスに記載されていますが、バックアップ及びリストアをパラレルで実行できるだけでなく、バックアップの保存先として、Oracle Cloud の Object Storage を指定できるという画期的な機能も持っています。
今回は、上記の機能について簡単に確認してみたいと思います。

(MySQL Shellで、1つのテーブルデータファイルをパラレルでインポートする Parallel Table Import Utility についても過去のブログで取り上げておりますので、まだ見られていない方は、是非、こちらもご一読下さい。)

Instance Dump Utility and Schema Dump Utility

バックアップには、以下の2つのユーティリティがあります。

・util.dumpInstance(outputUrl[, options])
・util.dumpSchemas(schemas, outputUrl[, options])

特定のデータベースを対象にバックアップを取得したい場合は util.dumpSchemas() 、対象データベースを限定しない場合は util.dumpInstance() を実行します。
util.dumpSchemas() の場合は、最初の引数に対象のデータベースを配列で指定するという事以外、オプション指定等の違いはなさそうです。

公式サイトからダウンロードできる world データベースを使用して確認してみます。

まずは MySQL Shell でログインし、バックアップ前に dryRun オプションを有効にして、ダンプされる対象を確認します。
util.dumpSchemas() を使用し、バックアップ対象を world データベース、バックアップディレクトリに /backup を指定しています。

  • 指定するバックアップディレクトリは事前に作成する必要はありませんが、指定のディレクトリの親ディレクトリは、バックアップ前に存在する必要があります。
  • バックアップディレクトリ及び親ディレクトリには、MySQL Shellへログインした際のOSユーザでの書き込み権限が必要です。

world データベースが対象となっている事を確認したので、実際にバックアップを取得します。
実行スレッド数は、threads オプションで指定でき、デフォルトでは 4 に設定されています。
スレッド数を4としたい場合には、threadsオプションは省略可能です。(各オプションについては、リファレンスをご参照下さい。)

実行後、バックアップディレクトリを確認してみると、以下のようになっています。

各ファイルについてリファレンスには明記されておりませんが、主要なファイルは以下のような内容となっております。

ファイル名 概要
データベース名.sql データベースのDDL
データベース名.json 対象データベースのバックアップ対象に関する情報
データベース名@テーブル名.json テーブルのバックアップ実行に関する情報
データベース名@テーブル名.sql テーブルのDDL
データベース名@テーブル名@@連番.tsv.zst データをTSV化して圧縮したファイル(※)

※デフォルトで、データ内容のファイルは Zstandard で圧縮されるようになっており、compression オプションで gzip 形式もしくは圧縮なしとする事も可能です。
※同一テーブルのデータは、bytesPerChunk オプションで指定したサイズ(デフォルト32M)でファイルが分割され、連番が振られるようです。

Dump Loading Utility

今度は、取得したバックアップを util.loadDump() を使用してインポートしてみます。
util.loadDump() を実行するには、local_infileシステム変数をONにする必要があります。)

インポートにも実行スレッド数を、threads オプションで指定できます。(こちらもデフォルトは 4 です。)
また、バイナリログに出力する必要がない場合には、skipBinlog オプションで、バイナリログに出力しないようにしてインポート時間の短縮も見込めそうです。

Oracle Cloud の Object Storage にバックアップ

今度は Oracle Cloud の Object Storage にバックアップを保存し、そのバックアップからインポートしてみます。
Object Storage のバケットは事前に作成しておく必要があります。
また、Oracle Cloudのコマンドライン・インタフェース(CLI)を使用できるように、こちらを参考に事前にセットアップをしておきます。

util.dumpSchemas() の第2引数には、ローカル保存の際には保存ディレクトリを指定しましたが、今度は Object Storage のバケット内での接頭辞文字列を指定します。
osBucketName オプションに Object Storage のバケット名、osNamespace オプションには、Object Storage のネームスペースを指定します。
(Object Storage のネームスペースは、OCIコンソール画面の「管理」-「テナンシ詳細」もしくは、Object Storage のバケット詳細画面で確認できます。)

バックアップ実行後、OCIコンソール画面で確認すると以下のように指定バケットに保存されている事が確認できます。

インポートする際には、ダンプと同じように Object Storage のバケット内での接頭辞文字列、バケット名、ネームスペースを指定します。

CLIさえ使用できるようにしておけば、すごくお手軽に実行できるのが嬉しいですね。

mysqldump との時間比較

バックアップ、インポートをパラレルで実行する事により、mysqldump を使用した場合と、バックアップ及びインポート時間がどの程度異なるか確認してみたいと思います。

検証環境

Oracle Cloud の Compute インスタンスを使用し、ローカルでのバックアップ、インポートを実行する事を前提とします。
Compute インスタンスには、VM.Standard2.4シェイプを利用し、ディスクは性能がなるべく頭打ちにならないよう 500GB のHigher Performance の Block Volumeを使用します。
(Block Volume はサイズによって性能が変わります。)

  • Compute インスタンス情報
項目 項目値
OS Oracle Linux 7.8
CPU 4 OCPU (≒8 vCPU)
RAM 60 GB
  • MySQLサーバ
    検証対象のMySQLサーバは MySQL Server 8.0.21 とします。
    デフォルト設定から以下の設定のみ変更します。
パラメータ名 設定値
innodb_buffer_pool_size 20G
innodb_log_file_size 1G
innodb_log_buffer_size 64M
innodb_flush_method O_DIRECT
innodb_io_capacity 7000
innodb_io_capacity_max 8000
innodb_lru_scan_depth 3000
local_infile ON
  • 検証条件
    本ブログでもおなじみの sysbench を使用して「sysbench」データベースに 100 テーブル、各テーブルレコード数 500,000 件のデータを準備しました。
    対象データベースのディレクトリサイズは、以下のようになっています。

mysqldump でのバックアップ取得とインポートは以下のコマンドで実施します。

MySQL Shell での実行は、以下のコマンドで実施します。
(バックアップ、インポートともにデフォルトの4スレッド、バックアップ時のチャンクサイズは128M)

検証結果

検証結果は以下のようになりました。

  • バックアップ
Backup Time
mysqldump                   2分12秒  
util.dumpSchemas()              1分3秒  

  • インポート
Import Time
mysqldumpで取得したファイルのインポート   19分16秒  
util.loadDump()   5分40秒  

Schema Dump Utility を使用したバックアップ時間が mysqldump の2倍程度、Dump Loading Utility は mysqldump のダンプファイルをインポートする時間の4倍近く高速化できました。

まとめ

新しく MySQL Shell に追加された Dump Utility 及び Loading Utility 、見逃せませんね。
今回の検証した結果からも、パラレル実行かつTSVファイル形式でのダンプ、インポートを行う事で、実行速度も大いに向上が見込めますし、実行中には%表示で進捗が見られるのも非常に嬉しいです。
また、データのインポートに関しては、MySQL Server 8.0.21 でRedoログを無効化する機能がリリースされているので、こちらも初期データを用意する際のインポート時間を短縮したい場合には有用なものになるかと思います。

今回のブログでは、Dump Utility、Loading Utility について、いくつかのオプションについては触れさせて頂きましたが、他にも多くのオプションがありますので、皆さんも是非、お試し下さい!
今後も便利な新機能が加わっていく MySQL Shell に期待したいと思います。


MySQL

 

Return Top