💻

mysqlsh (MySQL Shell): Dump and Restore in AWS Aurora

LayerX インボイス を開発しているDX事業部の @yyoshiki41(中川佳希)です。
DX事業部ではデータベースとして MySQL(Amazon Aurora)を利用しています。 今回のブログは、mysqlsh (MySQL Shell) を用いて、Dumpデータ取得とリストアを行う際に気をつける点です。

mysqldump, mysqlpump

Dumpデータ取得を行う際に、広く知られているのが  かと思います。
MySQL 5.7.8 からは、  という別のクライアントツールも提供されるようになりました。 主に下記のような特徴があります。
  • 並列での処理が行われる(Parallel)
  • Dump Progress がみれる
  • 圧縮方式は、LZ4 と ZLIB が使用可能(mysqlpump Ver 1.0.0 Distrib 5.7.35)
  • TABLE スキーマとINSERT 文の両方を出力する場合、INDEX を貼るクエリをデータリストア(INSERT文)の後に出力してくれる
    • INSERT毎での INDEX構築や KEY CHECKS なども不要になり、高速化が期待できる
実行例)
以下のようなファイルが出力されます。

mysqlsh (MySQL Shell)

mysqlsh でも、Dump & Load Utility が提供されています。
また下記のブログでは mysqlsh でのバックアップ取得とリストアがベンチマークとともに紹介されています。特に、mysqlsh が parallel で動作することとデフォルトで使用する圧縮方式 zstd により、mysqlbump, mysqlpump 以上のパフォーマンスとなることがレポートされています。

AWS Aurora 環境で使ってみる

mysqlsh, Aurora(MySQL Server)のバージョンは、以下のとおりです。
いきなりですが、Dump データ取得に失敗します。
これは AWS サポートブログ でも紹介されている、mysqldump で --master-data オプションを使用した場合と同じ原因のように見えます。 rdsadmin ユーザー以外は  を持たないため、 が実行できずグローバルな読み取りロックを取得できないようです。
以下のようにオプションとして、  を渡せば取得することは可能ですが、一貫性を保ったデータを取得するにはアプリケーションを止めるなどの必要があります。
consistent: [ true | false ] Enable (true) or disable (false) consistent data dumps by locking the instance for backup during the dump. The default is true. When true is set, the utility sets a global read lock using the FLUSH TABLES WITH READ LOCK statement (if the user ID used to run the utility has the RELOAD privilege), or a series of table locks using LOCK TABLES statements (if the user ID does not have the RELOAD privilege but does have LOCK TABLES). The transaction for each thread is started using the statements SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ and START TRANSACTION WITH CONSISTENT SNAPSHOT. When all threads have started their transactions, the instance is locked for backup (as described in LOCK INSTANCE FOR BACKUP and UNLOCK INSTANCE Statements) and the global read lock is released.
テーブル単位での Export / Import は、以下のように行えます。  実行最終行に、  コマンドを出力してくれて非常に親切です。

おわりに

単純なDBバックアップであれば、マネージドサービス側でサポートされていますが、アプリケーション開発が進み、テーブル移行などが必要になってくるケースが出てくるとテーブル単位でのDumpと移行などが必要になってきます。
今回の  や GTID などでハマることも多いかと思います。 ツールが変わっても気をつけるべき点としては、同じMySQL Server を使うならば基本的に同じだと感じました。 しかし、処理スピードやコマンドの使いやすさなど MySQL Shell の利点も多く、今後も楽しみなツールの1つです!

DX事業部では絶賛採用募集中です。 SaaS開発に興味があるという方は、ぜひ一度話を聞きに来てみてください!
エントリーはちょっとという方、こちらから中の話を聞くこともできます!